我是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
编译器给我这个错误“常量表达式的非法操作数”。如何解决该错误?
答案 0 :(得分:0)
复制器的'count'值必须为非零,非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;
应该作为局部变量放在函数中。