2014-09-23 2 views
0

Я читал в другом месте, что этот синтаксис j = j + 1 не разрешен, но возможно ли вообще увеличивать переменные вне выражения цикла цикла for?Можно ли увеличивать целые числа/genvar внутри генерации для цикла

Вот что я изначально хотел сделать. Я не был уверен, как это сделать, потому что я думал, что хочу генерировать модули с параметрами 20, 21, 22, 23, 25, 28, 29, 31 при использовании значений из массива параметров 2d, который индексируется с использованием 0, 1, 2, 3, 4, 5, 6, 7. Поэтому я подумал, что я просто сделаю один для цикла, а затем добавлю вторую переменную 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

Ответ Роберта ниже - как я это сделаю. Но что касается вашего кода, почему бы не определить j как genvar? В этом случае я не понимаю, почему вы не можете увеличить его. – Ari

ответ

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

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]) 
    ); 
Смежные вопросы