System Verilog:循环变量未初始化为常量 ELAB-800

System Verilog: The loop variable is not initialized to a constant ELAB-800

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

Error: /home/rtl/mydesign.sv:66: The loop variable is not initialized to a constant. (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 中运行得很好,并获得了正确的输出。

是否有另一种方法来编写此模块以便我不会收到此错误?

假设 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);