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 被声明为 parameter
s,那么使 savedbit_loc
也成为 parameter
。
localparam int savedbit_loc = MYPARAM1 - MYPARAM2 - 1;
此外,始终使用 always_comb
而不是 always @(*)
最大的优势是 always_comb
保证至少在时间 0 执行一次,而 @(*) 一如既往地等待事件。如果块仅包含 RHS 上的常量,这可能会导致模拟差异。
根据您更新后的问题,您可能想要的是
myval = myval & (32'('1) <<savebit_loc);
当我尝试编译用 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 被声明为 parameter
s,那么使 savedbit_loc
也成为 parameter
。
localparam int savedbit_loc = MYPARAM1 - MYPARAM2 - 1;
此外,始终使用 always_comb
而不是 always @(*)
最大的优势是 always_comb
保证至少在时间 0 执行一次,而 @(*) 一如既往地等待事件。如果块仅包含 RHS 上的常量,这可能会导致模拟差异。
根据您更新后的问题,您可能想要的是
myval = myval & (32'('1) <<savebit_loc);