Я храню две таблицы в двух сигналах. В одной таблице хранится ключ (адрес), а в другой - значение, соответствующее ключу. Мне нужно сравнить входные данные с ключом и, если они совпадают, вернуть сохраненное значение.
Причина, по которой мне это нужно, - это таблица динамического поиска для прогнозирования инструкций ветвления. На этапе извлечения процессора я получаю входной сигнал 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
и результат моделирования тестового стенда, показывающий, что ошибка действительно в ПЧ:
Я попытался преобразовать их с помощью to_integer (unsigned (bit_vector1)) = to_integer (unsigned (bit_vector2)) безрезультатно