VHDL-如何比较用于动态表查找的两位_向量

VHDL-如何比较用于动态表查找的两位_向量,vhdl,ram,lookup-tables,Vhdl,Ram,Lookup Tables,我在两个信号中存储两个表。一个表保留键(地址),另一个表保留对应于键的值。我需要将输入与键进行比较,如果匹配,则返回存储的值 我之所以需要它,是因为需要一个用于分支指令预测的动态查找表。在处理器的获取阶段,我获取输入指令的地址,并返回分支地址和分支预测。最初,我希望存储16个预测/分支地址,并根据需要使用循环缓冲环进行覆盖 我一直在尝试使用带有嵌套IF的FOR来搜索keyTable中的键 整个模块似乎工作得很好,除非我将两个位_向量与IF语句进行比较。我需要这两次(一次读,一次写),因此我需要“

我在两个信号中存储两个表。一个表保留键(地址),另一个表保留对应于键的值。我需要将输入与键进行比较,如果匹配,则返回存储的值

我之所以需要它,是因为需要一个用于分支指令预测的动态查找表。在处理器的获取阶段,我获取输入指令的地址,并返回分支地址和分支预测。最初,我希望存储16个预测/分支地址,并根据需要使用循环缓冲环进行覆盖

我一直在尝试使用带有嵌套IF的FOR来搜索keyTable中的键

整个模块似乎工作得很好,除非我将两个位_向量与IF语句进行比较。我需要这两次(一次读,一次写),因此我需要“扫描”keysTable,以便查看正在查找的地址是否有条目

我在模拟时注意到了一个错误,不管keysTable是否有正确的条目,都会调用ELSE子句

可验证的示例:

IEEE库;
使用ieee.numeric_bit.all;
实体分支预测表为
一般的(
地址:自然:=4;
表大小:自然:=4);
港口(
时钟:以位为单位;
输入_addr:在位_向量中(addrSize-1向下至0);
返回_值:输出位);
端分支预测表;
分支预测表的架构分支表为
信号键表:位向量(addrSize*tableSize-1向下到0):=(其他=>'0');
信号值稳定:位_向量(表大小*2-1到0):=(其他=>'0');
开始
tableProc:进程(时钟)为
变量值fromtable:bit;
开始
如果上升沿(时钟),则
搜索表:在(表大小-1)到0的循环中查找iR
如果(键表(addrSize*(iR+1)-1向下至addrSize*iR)=输入地址),则
valueFromTable:=valuesTable((iR+1)*2-1);
退出搜索表;
其他的
valueFromTable:=“0”;
如果结束;
结束循环搜索表;

正如user1155120指出的,返回值:

问题在于
search\u table:for iR**in**(tableSize-1)到0循环中

它应该是“下到”作为L>R。因为我在“中使用了”和L>R,这会产生一个空范围,并且for循环迭代被认为是完整的

(IEEE标准1076-2008 5.2标量类型,“范围指定标量类型值的子集。如果指定的子集为空,则称范围为空范围。范围L到R称为升序范围;如果L>R,则范围为空范围。范围L到R称为降序范围;如果L 10.10循环语句“对于使用For迭代方案执行循环,首先评估离散范围如果离散范围为空范围,则称迭代方案为完整,…”


在您显示的代码中没有
else
。@mkrieger1在这里我们看到
keysTable(addrSize*(iR+1)-1到addrSize*iR的具体值是什么
输入地址
你认为是相等的,但不相等?或者-你是如何得出
其他
分支的结论的?可能
值稳定((iR+1)*2-1)
'0'
对于iR in(tableSize-1)到0循环
(IEEE Std 1076-2008 5.2标量类型,“范围指定标量类型值的子集。如果指定的子集为空,则称范围为空范围。范围L到R称为升序范围;如果L>R,则范围为空范围。范围L到R称为降序范围;如果Ladd 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