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 ]
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