以下模块尝试以三种不同的方式使用解压缩的参数数组。
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
我使用的模拟器认为前两个模块是正确的。但是最后一个被认为是不正确的,因为i
不是常量表达式。但是,我可以在始终块版本中语义解释for循环的唯一方法与also_works
相同。
我无法在标准中找到澄清这种情况的任何内容,期望第11.2.1节中所述的内容
11.2.1常量表达式
某些语句结构要求表达式为常量 表达。常量表达式的操作数由常量组成 数字,字符串,参数,常数位选择和部分选择 参数,常量函数调用(见13.4.3)和常量系统 仅限函数调用。常量表达式可以使用任何运算符 表11-1中定义。
据我所知,它只讨论了位和部分选择,而不是关于索引参数数组。
答案 0 :(得分:0)
使用{repNum{val}}
语法进行复制时,repNum
必须是常量。 bits[i]
不是常数,因为索引在模拟中是动态的。 generate
有效,因为循环在编译/精化过程中是静态展开的。
您可以进行位分配以获得相同的功能:
always_comb begin
foreach(mask[i,j]) begin
mask[i][j] = (j<bits[i]);
end
end