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

2

Quiero crear una instancia de un módulo que tenga parámetros usando el bloque de generación. Pero quiero asignar diferentes valores a los parámetros 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 utilizando la declaración de generar . ( Pero aquí estoy usando solo un valor de parámetro de D_WIDTH y S_WIDTH para todas las instancias )

[ Está funcionando pero con un solo valor 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 valores diferentes a D_WIDTH [j] & S_WIDTH [j] y desea usarlos para asignar parámetros ( DATA_WIDTH & SIZE_WIDTH ) en el bloque de generación.

[Aquí J cambiará con para bucle]

    
pregunta AnuragChauhan

1 respuesta

2

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 lo soportan.

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
    
respondido por el dave_59

Lea otras preguntas en las etiquetas