System verilog 在SystemVerilog中,正在为常量表达式的循环中的参数数组编制索引
以下模块尝试以三种不同的方式使用未打包的参数数组System verilog 在SystemVerilog中,正在为常量表达式的循环中的参数数组编制索引,system-verilog,System Verilog,以下模块尝试以三种不同的方式使用未打包的参数数组 module works #(parameter int num = 4, parameter int width = 8, parameter int bits [num] = '{4, 4}) (output logic [width-1:0] mask [num]); genvar i; generate for(i=0; i<num; ++i) begin
module works
#(parameter int num = 4,
parameter int width = 8,
parameter int bits [num] = '{4, 4})
(output logic [width-1:0] mask [num]);
genvar i;
generate
for(i=0; i<num; ++i) begin
always_comb mask[i] = {{(width-bits[i]){1'b0}},{bits[i]{1'b1}}};
end
endgenerate
endmodule
module also_works
#(parameter int num = 4,
parameter int width = 8,
parameter int bits [num] = '{4, 4})
(output logic [width-1:0] mask [num]);
always_comb begin
mask[0] = {{(width-bits[0]){1'b0}},{bits[0]{1'b1}}};
mask[1] = {{(width-bits[1]){1'b0}},{bits[1]{1'b1}}};
mask[2] = {{(width-bits[2]){1'b0}},{bits[2]{1'b1}}};
mask[3] = {{(width-bits[3]){1'b0}},{bits[3]{1'b1}}};
end
endmodule
module fails
#(parameter int num = 4,
parameter int width = 8,
parameter int bits [num] = '{4, 4})
(output logic [width-1:0] mask [num]);
always_comb begin
for(int i=0; i<num; ++i) begin
mask[i] = {{(width-bits[i]){1'b0}},{bits[i]{1'b1}}};
end
end
endmodule
模块工作正常
#(参数int num=4,
参数int width=8,
参数int位[num]='{4,4})
(输出逻辑[width-1:0]掩码[num]);
genvar i;
生成
对于(i=0;i当使用{repNum{val}}
语法进行复制时,repNum
需要是一个常量。bits[i]
不是一个常量,因为索引在模拟中是动态的。generate
可以工作,因为在编译/精化过程中循环是静态展开的
您可以执行位分配以获得相同的功能:
always_comb begin
foreach(mask[i,j]) begin
mask[i][j] = (j<bits[i]);
end
end
始终\u开始
foreach(掩码[i,j])开始
面具[i][j]=(jI仍然不知道动态索引与repNum
是否为常量有什么关系。它将索引编入一个常量数组。数组作为一个整体是常量,但代码正在选择数组的一个实例。Verilog在模拟过程中以动态方式运行程序块内的循环;它是否安全无关紧要静态展开。bits[i]
在时间0时是不确定的,因为i
是动态的;因此bits[i]
是动态的,即使bits
是静态的。然后我猜SystemVerilog以另一种方式被破坏;)静态展开是唯一对合成有意义的东西。它表明SV的常量表达式的整个概念在其当前形式中是有缺陷的。