生成块中的条件增量

时间:2015-08-20 16:27:15

标签: verilog system-verilog hdl

我想创建256个foo个实例。因此,我有两个嵌套的生成循环。但是,我需要一个单独的索引变量l来正确选择信号。

genvar j, i, l;
generate
  l = 0;
  for(j = 0; j < 16; j++)
  begin
    for(i = 0; i < 16; i++) begin
      foo bar
      (
        .a_i(a_i[(l+1)*8-1:l*8]),
        .b_i(b_i[(j+1)*8-1:j*8]),
        .c_o(c_i[i][j])
      );

      if(i < 15)
        l = (l + 1) % 16;
    end
  end
endgenerate

不幸的是,这种结构不起作用。如何将l添加到此生成以获得正确的输入信号选择?

2 个答案:

答案 0 :(得分:1)

只能将genvar指定为for循环中的索引。所以把它留作表达式:

genvar j, i;
generate
  for (j = 0; j < 16; j++) begin
    for (i = 0; i < 16; i++) begin
      foo bar (
        // prefix 1'b0 for correct sign extinction, 4'() does casting
        .a_i(a_i[{1'b0,4'(i-j)}*8 +: 8]), 
        .b_i(b_i[j*8 +: 8]),
        .c_o(c_i[i][j])
      );
    end
  end
endgenerate

+:用于数组切片,允许变量索引和常量偏移。它更简洁,更容易维护,然后指定msb:lsb,它是可综合的。请参阅&#39; Indexing vectors and arrays with +:&#39;和&#39; What is `+:` and `-:`?

您还可以将此方法与dave_59&#39; parameter方法结合使用:

genvar j, i;
generate
  for (j = 0; j < 16; j++) begin
    for (i = 0; i < 16; i++) begin
     // defining the parameter with a data type to insure it is a unsigned 4 bit value
      parameter bit [3:0] l = (i-j);
      foo bar (
        .a_i(a_i[l*8 +: 8]),
        .b_i(b_i[j*8 +: 8]),
        .c_o(c_i[i][j])
      );
    end
  end
endgenerate

答案 1 :(得分:0)

使用条件运算符?:,并使l成为参数

genvar j, i;
generate
  l = 0;
  for(j = 0; j < 16; j++)
  begin
    for(i = 0; i < 16; i++) begin
      parameter l = (i < 15) ? ((l + 1) % 16) : 0;
      foo bar
      (
        .a_i(a_i[(l+1)*8-1:l*8]),
        .b_i(b_i[(j+1)*8-1:j*8]),
        .c_o(c_i[i][j])
      );
    end
  end
endgenerate