如何动态更改分配给向量寄存器的值

时间:2018-08-03 06:47:04

标签: 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

编译器给我这个错误“常量表达式的非法操作数”。如何解决该错误?

1 个答案:

答案 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;应该作为局部变量放在函数中。