【问题标题】:System Verilog: The loop variable is not initialized to a constant ELAB-800System Verilog:循环变量未初始化为常量 ELAB-800
【发布时间】:2015-11-07 07:27:29
【问题描述】:

在尝试编译用 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 中运行得很好,并获得了正确的输出。

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

【问题讨论】:

    标签: verilog system-verilog hdl synthesis register-transfer-level


    【解决方案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);
    

    【讨论】:

    • 我稍微更新了问题,请看一下。基本上 saved_bit 取决于运行时输入的输入,而不仅仅是静态参数,我忘记了那部分,所以我编辑了代码。
    • 我找到了这个答案,我认为它解决了我的问题:stackoverflow.com/questions/29082193/… 如果您有更好的想法,请告诉我
    • 显示更多代码来解释您尝试做的事情的意图确实会有所帮助。如果你只是想屏蔽一些位,那么你可以做一个逻辑移位。
    • 只是试图将位清零。基本上 myval[savedbit_loc:0] =0。但是 savedbit_loc 取决于模块的输入值以及实例化时设置的参数。
    猜你喜欢
    • 1970-01-01
    • 2021-06-11
    • 1970-01-01
    • 2011-05-24
    • 2012-01-02
    • 2012-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多