Asignar el valor diferente a los parámetros en Generar bloque en Verilog

Quiero crear una instancia de un módulo que tenga parámetros usando generar bloque. Pero quiero asignar diferentes valores al parámetro para diferentes instancias del módulo.

Por ejemplo:

Este es mi módulo que quiero instanciar y tiene parámetros DATA_WIDTH & SIZE_WIDTH.

module gen_module (
     input clk,
     input rst );

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

endmodule

Este es otro módulo en el que estoy creando una instancia de gen_module usando una declaración de generación . ( Pero aquí estoy usando solo un valor de parámetro de D_WIDTH y S_WIDTH para todas las instancias )

[ Está funcionando pero con valor único para todos ]

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

Pero quiero hacer algo como esta declaración. (Como sé, la matriz de parámetros no es aplicable en Verilog)

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

Aquí quiero dar diferentes valores a D_WIDTH[j] & S_WIDTH[j] y quiero usarlos para asignar parámetros ( DATA_WIDTH & SIZE_WIDTH ) en el bloque de generación.

[Aquí J cambiará con bucle for ]

Respuestas (1)

Puede hacer esto fácilmente en SystemVerilog, ya que puede declarar un parámetro que es una matriz y luego seleccionar el índice de la matriz de parámetros dentro del ciclo de generación. La mayoría de las herramientas de simulación y síntesis ya admiten esto.

Si necesita permanecer en Verilog, puede empaquetar valores en un parámetro y luego seleccionar una porción de parámetro

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