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