Zuweisen des unterschiedlichen Werts zu Parametern in Block generieren in Verilog

Ich möchte ein Modul mit Parametern mit dem Block generieren instanziieren. Aber ich möchte Parametern für unterschiedliche Instanziierungen des Moduls unterschiedliche Werte zuweisen.

Zum Beispiel:

Dies ist mein Modul, das ich instanziieren möchte, und es hat die Parameter DATA_WIDTH & SIZE_WIDTH .

module gen_module (
     input clk,
     input rst );

     parameter [3:0] DATA_WIDTH = 1;
     parameter [3:0] SIZE_WIDTH = 2;

endmodule

Dies ist ein weiteres Modul, in dem ich gen_module mit der generate- Anweisung instanziiere. ( Aber hier verwende ich nur einen Parameterwert von D_WIDTH und S_WIDTH für alle Instanziierungen )

[ Es funktioniert, aber mit einem einzigen Wert für alle ]

module top_module ();

    wire clk;
    wire rst;

    parameter N = 5;
    parameter [3:0] D_WIDTH = 7;
    parameter [3:0] S_WIDTH = 4;

    genvar j;

    generate
        for(j = 0; j <= N; j=j+1) begin : GEN_BLOCK
           gen_module #(.DATA_WIDTH(D_WIDTH), .SIZE_WIDTH(S_WIDTH)) i_gen_module (
             .clk (clk),
             .rst (rst)
          );

        end
    endgenerate 
endmodule

Aber ich möchte so etwas wie diese Aussage machen. (Wie ich weiß, ist Parameter-Array in Verilog nicht anwendbar)

gen_module #(.DATA_WIDTH(D_WIDTH[j]), .SIZE_WIDTH(S_WIDTH[j])) i_gen_module (

Hier möchte ich D_WIDTH[j] & S_WIDTH[j] unterschiedliche Werte geben und sie verwenden, um Parametern ( DATA_WIDTH & SIZE_WIDTH ) im Generierungsblock zuzuweisen .

[Hier wird J mit for- Schleife geändert]

Antworten (1)

Sie können dies einfach in SystemVerilog tun, da Sie einen Parameter deklarieren können, der ein Array ist, und dann den Index des Parameter-Arrays innerhalb der Generate-Schleife auswählen können. Die meisten Simulations- und Synthesewerkzeuge unterstützen dies bereits.

Wenn Sie in Verilog bleiben müssen, können Sie Werte in einen Parameter packen und dann ein Parametersegment auswählen

module top_module ();

    wire clk;
    wire rst;

    parameter N = 5;
    // assuming width can fit in 4 bits
    parameter [(N*4)-1:0] D_WIDTH = {4'd1,4'd2,4'd3,4'd4,4'd5};
    parameter [(N*4)-1:0] S_WIDTH = {4'd6,4'd7,4'd8,4'd9,4'd8};

    genvar j;

    generate
        for(j = 0; j < N; j = j+1) begin : GEN_BLOCK
           gen_module #(.DATA_WIDTH (D_WIDTH[j*4+:4]), .SIZE_WIDTH (S_WIDTH[j*4+:4])) i_gen_module (
              .clk (clk),
              .rst (rst)
          );

        end
    endgenerate 
endmodule