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的常量表达式的整个概念在其当前形式中是有缺陷的。