首页 > 解决方案 > 如何动态更改分配给向量寄存器的值

问题描述

我是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

编译器给了我这个错误“常量表达式的非法操作数”。可以做些什么来解决这个错误?

标签: verilog

解决方案


复制器“计数”值必须是非零、非 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;应该在你的函数中作为局部变量。


推荐阅读