VHDL-如何比较用于动态表查找的两位_向量
我在两个信号中存储两个表。一个表保留键(地址),另一个表保留对应于键的值。我需要将输入与键进行比较,如果匹配,则返回存储的值 我之所以需要它,是因为需要一个用于分支指令预测的动态查找表。在处理器的获取阶段,我获取输入指令的地址,并返回分支地址和分支预测。最初,我希望存储16个预测/分支地址,并根据需要使用循环缓冲环进行覆盖 我一直在尝试使用带有嵌套IF的FOR来搜索keyTable中的键 整个模块似乎工作得很好,除非我将两个位_向量与IF语句进行比较。我需要这两次(一次读,一次写),因此我需要“扫描”keysTable,以便查看正在查找的地址是否有条目 我在模拟时注意到了一个错误,不管keysTable是否有正确的条目,都会调用ELSE子句 可验证的示例:VHDL-如何比较用于动态表查找的两位_向量,vhdl,ram,lookup-tables,Vhdl,Ram,Lookup Tables,我在两个信号中存储两个表。一个表保留键(地址),另一个表保留对应于键的值。我需要将输入与键进行比较,如果匹配,则返回存储的值 我之所以需要它,是因为需要一个用于分支指令预测的动态查找表。在处理器的获取阶段,我获取输入指令的地址,并返回分支地址和分支预测。最初,我希望存储16个预测/分支地址,并根据需要使用循环缓冲环进行覆盖 我一直在尝试使用带有嵌套IF的FOR来搜索keyTable中的键 整个模块似乎工作得很好,除非我将两个位_向量与IF语句进行比较。我需要这两次(一次读,一次写),因此我需要“
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