2014-09-23 97 views
0

我已經在其他地方看過,這個語法不允許j = j + 1,但它有可能在for循環的循環表達式之外增加變量嗎?是否有可能在for循環中增加整數/ genvar

這是我最初想做的。我不知道如何去做這個生成語句,所以我想,我想使用參數20, 21, 22, 23, 25, 28, 29, 31生成模塊,同時使用來自使用0, 1, 2, 3, 4, 5, 6, 7索引的2d參數數組的值。所以我想,我只是做一個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 
+0

Robert在下面的答案是我如何做到的。但是關於你的代碼,爲什麼不把j定義爲genvar?在那種情況下,我不明白你爲什麼不能增加它。 – Ari 2014-09-24 22:01:40

回答

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 
+0

這看起來是正確的,只是你在參數列表中缺少.poly。 – Ari 2014-09-24 22:02:26

0

,而不是試圖增加在內部循環的第二個變量(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]) 
    ); 
相關問題