是否可以在generate for循环内增加整数/ genvar

时间:2014-09-23 20:07:02

标签: verilog

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

这是我最初想做的事情。我不确定如何制作这个生成语句,所以我想,我想生成参数20, 21, 22, 23, 25, 28, 29, 31的模块,同时使用来自使用0, 1, 2, 3, 4, 5, 6, 7索引的2d参数数组的值。所以我想,我只想制作一个for循环,然后让第二个变量j0开始,然后转到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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

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])
      );