【问题标题】:Is it possible to increment integers/genvar inside a generate for loop是否可以在生成 for 循环中增加整数/genvar
【发布时间】:2025-12-28 15:00:12
【问题描述】:

我在其他地方读到过这种语法 j = j + 1 是不允许的,但是否可以在 for 循环的循环表达式之外增加变量?

这就是我最初想做的事情。我不知道如何制作这个生成语句,所以我在想,我想生成带有参数20, 21, 22, 23, 25, 28, 29, 31 的模块,同时使用使用0, 1, 2, 3, 4, 5, 6, 7 索引的二维参数数组中的值。所以我想,我会做一个 for 循环,然后有第二个变量 j,它从 0 开始,到 7。我可以这样做吗?如果没有,有什么推荐的?

genvar i; 
  integer j = 0;
  generate
    for (i = 20; i <= 31; i = i + 1) begin : NUM_OF_FF
      if (i != 21 && i != 24 && i != 26 && i != 27 && i != 30) begin
          lfsr
            #(
              .num_of_ff(i),
              .poly(lsfr_taps[j])
            )
          random_data_gen_lsfr
          (
            .clk(sys_clk),
            .rst(rst), 
            .out(lsfr_bits[i])
          );
          j = j + 1;
      end
    end
  endgenerate

【问题讨论】:

  • 罗伯特在下面的回答是我也会这样做。但是关于您的代码,为什么不将 j 定义为 genvar 呢?在那种情况下,我不明白为什么你不能增加它。

标签: verilog


【解决方案1】:

您可以使用整数参数数组(也许您示例中的 lsfr_taps 是类似的东西?)

module lfsr#(int num_of_ff=1, int poly=1)();
   initial $display("%m: %0d %0d", num_of_ff, poly);
endmodule

module simple;
   parameter int index_list_size = 8;
   parameter int index_list[index_list_size] = {20, 21, 22, 23, 25, 28, 29, 31};

   for (genvar i=0; i<index_list_size; ++i) begin: NUM_OF_FF
      lfsr#(.num_of_ff(i), .poly(index_list[i])) random_data_gen_lsfr();
   end
endmodule

【讨论】:

  • 这看起来是正确的,只是参数列表中缺少 .poly。
【解决方案2】:

您可以使用常量函数,而不是尝试增加内部循环中的第二个变量(j),并将 poly 参数转换为输入:

function [7:0] tap_number;
  input [31:0] polynomial;
  input [7:0]  max_valid;
  integer i;
  begin
    tap_number = 0;
    for (i=0; i<max_valid; i=i+1)
      begin
        if (polynomial[i])
          tap_number = tap_number + 1;
      end
  end
endfunction

wire [7:0] lfsr_taps;
assign lfsr_taps = tap_number (poly, i);
     lfsr
        #(
          .num_of_ff(i),
        )
      random_data_gen_lsfr
      (
        .poly(lsfr_taps[j])
        .clk(sys_clk),
        .rst(rst), 
        .out(lsfr_bits[i])
      );

【讨论】: