VHDL - Как сравнить два битовых вектора для динамического поиска в таблице - PullRequest
0 голосов
/ 09 ноября 2019

Я храню две таблицы в двух сигналах. В одной таблице хранится ключ (адрес), а в другой - значение, соответствующее ключу. Мне нужно сравнить входные данные с ключом и, если они совпадают, вернуть сохраненное значение.

Причина, по которой мне это нужно, - это таблица динамического поиска для прогнозирования инструкций ветвления. На этапе извлечения процессора я получаю входной сигнал Instruction_Address и возвращаю значение branch_To_Address и branch_Prediction. Сначала я хочу сохранить 16 предсказаний / адресов ветвлений и использовать кольцевое буферное кольцо для перезаписи по мере необходимости.

Я пытался использовать FOR с вложенным IF для поиска ключа внутри keyTable.

Весь модуль работает нормально, за исключением случаев, когда я сравниваю два bit_vectors с оператором IF. Мне нужно это дважды (один при чтении, а другой при записи), и, следовательно, мне нужно «подмести» таблицу ключей, чтобы я мог видеть, есть ли в адресе для поиска запись.

Я заметил ошибку примоделирование, при котором всегда вызывается предложение ELSE, независимо от того, имеет ли таблица ключей правильные записи.

Пример, поддающийся проверке:

library IEEE;
use ieee.numeric_bit.all;

entity branch_prediction_table is
generic (
    addrSize    : NATURAL   := 4;
    tableSize   : NATURAL   := 4);
port (
    clock : in bit;
    input_addr: in bit_vector(addrSize-1 downto 0);
    return_value : out bit );
end branch_prediction_table;

architecture branch_table of branch_prediction_table is

    signal keysTable : bit_vector(addrSize*tableSize-1 downto 0) := ( others => '0');
    signal valuesTable : bit_vector(tableSize*2-1 downto 0) := ( others => '0');

begin

    tableProc: process(clock) is

        variable valueFromTable : bit;
    begin
        if rising_edge(clock) then

            search_table: for iR in (tableSize-1) to 0 loop

                if (keysTable(addrSize*(iR+1)-1 downto addrSize*iR) = input_addr) then
                    valueFromTable := valuesTable((iR+1)*2-1);
                    EXIT search_table;
                else
                    valueFromTable := '0';
                end if;

            end loop search_table;

            return_value <= valueFromTable;

        end if; -- rising_edge(clock)
    end process tableProc;
end branch_table;

с проверяемым стендом моделирования TCL:

add wave -position insertpoint  \
sim:/branch_prediction_table/addrSize \
sim:/branch_prediction_table/clock \
sim:/branch_prediction_table/input_addr \
sim:/branch_prediction_table/keysTable \
sim:/branch_prediction_table/return_value \
sim:/branch_prediction_table/tableSize \
sim:/branch_prediction_table/valuesTable
force -freeze sim:/branch_prediction_table/valuesTable 11111111 0
force -freeze sim:/branch_prediction_table/keysTable 1111101001100011 0
force -freeze sim:/branch_prediction_table/clock 0 0, 1 {5000 ps} -r {10 ns}
run 10 ns
force -freeze sim:/branch_prediction_table/input_addr 1010 0
run 20 ns
force -freeze sim:/branch_prediction_table/input_addr 1111 0
run 10 ns

и результат моделирования тестового стенда, показывающий, что ошибка действительно в ПЧ: Verifiable Testbench Simulation

Я попытался преобразовать их с помощью to_integer (unsigned (bit_vector1)) = to_integer (unsigned (bit_vector2)) безрезультатно

1 Ответ

0 голосов
/ 13 ноября 2019

Как указал user1155120:

Проблема заключается в search_table: for iR **in** (tableSize-1) to 0 loop

Это должно было быть "до" как L> R. Так как я использовал "in" с L> R, который создает нулевой диапазон, и итерация цикла for считается завершенной.

(IEEE Std 1076-2008 5.2 Скалярные типы, "Диапазон задает подмножество значений скалярного типа. Диапазон называется нулевым диапазоном, если указанное подмножество пусто. Диапазон от L до R называется восходящим диапазоном, если L> R, то диапазонявляется нулевым диапазоном. Диапазон L до R называется нисходящим диапазоном; если L

10.10 Оператор цикла" Для выполненияцикл с итерационной схемой, сначала оценивается дискретный диапазон. Если дискретный диапазон является нулевым диапазоном, говорят, что итерационная схема завершена, ... "

...