verilog - 如何动态更改分配给向量寄存器的值
问题描述
我是verilog编码的新手。在我的问题陈述中,我将从另一个模块获取排序表中的条目数,并根据我需要决定从哪里开始二进制搜索的条目数(例如,让 num_entries 为 15,然后开始索引应为 8)。代码片段如下:
srch_addr <= {{(TBL_AW-msb_loc(num_entries)-1){1'b0}},2'b10, {(msb_loc(num_entries)-1){1'b0}}};
//function to find out MSB 1
integer LOC;
function [3:0] msb_loc;
input [TBL_AW:0] num_entries;
reg found;
//input start;
begin
//if(start = 1)
//begin
found = 1'b0;
msb_loc = 3'b000;
for (LOC=TBL_AW; LOC> 0; LOC=LOC-1)
begin
if((num_entries[LOC] == 1) && !found)
begin
msb_loc = LOC;
found = 1'b1; //TO exit the loop
end
end
//end
end
endfunction
编译器给了我这个错误“常量表达式的非法操作数”。可以做些什么来解决这个错误?
解决方案
复制器“计数”值必须是非零、非 X 和非 Z 常量表达式。
{(TBL_AW-msb_loc(num_entries)-1){1'b0}}
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ This is not a constant.
要获得“中途”地址,您可以使用标准的数学方法:向上划分和四舍五入。在这种情况下,加一除以二:
srch_addr <= (msb_loc(num_entries)+1)>>1;
回到你的公式。这部分只是零:{(TBL_AW-msb_loc(num_entries)-1){1'b0}}
你不需要那个。
这部分2'b10, {(msb_loc(num_entries)-1){1'b0}}
实际上将 2'b10 向左移动了 "(msb_loc(num_entries)-1)" 位置。
这样做是一样的,但没有语法错误:
srch_addr <= 1'b1 << msb_loc(num_entries);
我所看到的并没有给你中途地址。
进一步:
你integer LOC;
应该在你的函数中作为局部变量。
推荐阅读
- c# - 如何调用我的 Web API 并在 GridView 中显示数据?
- kubernetes - 在 Google Kubernetes Engine 中部署预构建的容器映像
- python - 如何在python中将变量从一个类获取到另一个类
- flutter - Flutter中ArCore中的自定义形状
- dependent-type - 为什么我不能在 MMT(使用 PLF)中定义类型参数?
- python - 如何获取未知 PyTorch 模型的输入张量形状
- flask - 如何使用 flask_sqlalchemy 信号将操作记录到数据库?
- cypress - 赛普拉斯 API 请求:大小和响应时间的断言
- mysql - 如何在本地主机上运行 SQL?
- tensorflow - 将Superpoint的Tensorflow模型转换为Android的tflite模型的问题