在SystemVerilog中,为for循环中的参数数组索引一个常量表达式

时间:2015-12-09 18:51:23

标签: 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
            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中定义。

据我所知,它只讨论了位和部分选择,而不是关于索引参数数组。

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