0

在尝试编译用 System Verilog 编写的 RTL 设计时,我使用的是 Synopsys Design Compiler,但收到以下错误消息:

错误:/home/rtl/mydesign.sv:66:循环变量未初始化为常量。(ELAB-800)

这是有问题的代码:

// Zero out bits from savedbit_loc all the way down to the least significant bit
// We don't know the value of savedbit_loc until the module is instantiated.

assign savedbit_loc = src1- MYPARAM1 - 1;

// Zero out the 
always @(*) begin
    for (int i = savedbit_loc; i >= 0; i--) begin  
        zeroedout[i] = 1'b0;
  end
end

MYPARAM1 是在模块实例化时设置的参数。

它抱怨的行是:

for (int i = savedbit_loc; i >= 0; i--) begin

我的代码在 ncverilog 中运行得很好并获得了正确的输出。

有没有另一种方法来编写这个模块,这样我就不会收到这个错误?

4

1 回答 1

1

假设 MYPARAM1 和 MYPARAM2 被声明为parameters,那么也创建savedbit_loc一个parameter

localparam int savedbit_loc = MYPARAM1 - MYPARAM2 - 1;

此外,始终使用always_comb而不是always @(*)

最大的优点是always_comb保证至少在时间 0 执行一次,其中 @(*) 一如既往地等待事件。如果块仅包含 RHS 上的常量,这可能会导致仿真差异。


根据您更新的问题,您可能想要的是

myval = myval & (32'('1) <<savebit_loc);
于 2015-11-07T16:04:46.603 回答