Paramètres Verilog
Les paramètres sont des constructions Verilog qui permettent à un module d'être réutilisé avec une spécification différente. Par exemple, un additionneur 4 bits peut être paramétré pour accepter une valeur pour le nombre de bits et de nouvelles valeurs de paramètre peuvent être transmises lors de l'instanciation du module. Ainsi, un additionneur N bits peut devenir un additionneur 4 bits, 8 bits ou 16 bits. Ils sont comme des arguments à une fonction qui sont passés lors d'un appel de fonction.
parameter MSB = 7; // MSB is a parameter with a constant value 7
parameter REAL = 4.5; // REAL holds a real number
parameter FIFO_DEPTH = 256,
MAX_WIDTH = 32; // Declares two parameters
parameter [7:0] f_const = 2'b3; // 2 bit value is converted to 8 bits; 8'b3
Les paramètres sont essentiellement des constantes et il est donc illégal de modifier leur valeur au moment de l'exécution. Il est illégal de redéclarer un nom déjà utilisé par un réseau, une variable ou un autre paramètre.
Il existe deux principaux types de paramètres, module et spécifiez et les deux acceptent une spécification de plage. Mais, ils sont normalement rendus aussi larges que la valeur à stocker l'exige et, par conséquent, une spécification de plage n'est pas nécessaire.
Paramètres des modules
Les paramètres de module peuvent être utilisés pour remplacer les définitions de paramètres dans un module, ce qui fait que le module a un ensemble de paramètres différent au moment de la compilation. Un paramètre peut être modifié avec le defparam
instruction ou dans l'instruction d'instance de module. Il est courant d'utiliser des lettres majuscules dans les noms des paramètres pour les rendre immédiatement visibles.
Le module illustré ci-dessous utilise des paramètres pour spécifier la largeur du bus, la largeur des données et la profondeur du FIFO dans la conception, et peut être remplacé par de nouvelles valeurs lorsque le module est instancié ou en utilisant defparam
déclarations.
// Verilog 1995 style port declaration
module design_ip ( addr,
wdata,
write,
sel,
rdata);
parameter BUS_WIDTH = 32,
DATA_WIDTH = 64,
FIFO_DEPTH = 512;
input addr;
input wdata;
input write;
input sel;
output rdata;
wire [BUS_WIDTH-1:0] addr;
wire [DATA_WIDTH-1:0] wdata;
reg [DATA_WIDTH-1:0] rdata;
reg [7:0] fifo [FIFO_DEPTH];
// Design code goes here ...
endmodule
Dans le nouveau style ANSI de déclaration de port Verilog, vous pouvez déclarer des paramètres comme indiqué ci-dessous.
module design_ip
#(parameter BUS_WIDTH=32,
parameter DATA_WIDTH=64) (
input [BUS_WIDTH-1:0] addr,
// Other port declarations
);
Remplacer les paramètres
Les paramètres peuvent être remplacés par de nouvelles valeurs lors de l'instanciation du module. La première partie instancie le module appelé design_ip par le nom d0 où de nouveaux paramètres sont passés dans #( )
. La deuxième partie utilise une construction Verilog appelée defparam
pour définir les nouvelles valeurs des paramètres. La première méthode est la méthode la plus couramment utilisée pour transmettre de nouveaux paramètres dans les conceptions RTL. La deuxième méthode est couramment utilisée dans les simulations de banc d'essai pour mettre à jour rapidement les paramètres de conception sans avoir à réinstancier le module.
module tb;
// Module instantiation override
design_ip #(BUS_WIDTH = 64, DATA_WIDTH = 128) d0 ( [port list]);
// Use of defparam to override
defparam d0.FIFO_DEPTH = 128;
endmodule
Exemple
Le compteur du module a deux paramètres N et DOWN déclarés pour avoir une valeur par défaut de 2 et 0 respectivement. N contrôle le nombre de bits dans la sortie contrôlant effectivement la largeur du compteur. Par défaut, il s'agit d'un compteur 2 bits. Le paramètre DOWN contrôle si le compteur doit incrémenter ou décrémenter. Par défaut, le compteur décrémentera car le paramètre est mis à 0.
Compteur progressif 2 bits
module counter
#( parameter N = 2,
parameter DOWN = 0)
( input clk,
input rstn,
input en,
output reg [N-1:0] out);
always @ (posedge clk) begin
if (!rstn) begin
out <= 0;
end else begin
if (en)
if (DOWN)
out <= out - 1;
else
out <= out + 1;
else
out <= out;
end
end
endmodule
Le compteur de module est instancié avec N comme 2 même s'il n'est pas requis car la valeur par défaut est de toute façon 2. DOWN n'est pas transmis lors de l'instanciation du module et prend donc la valeur par défaut de 0, ce qui en fait un compteur.
module design_top ( input clk,
input rstn,
input en,
output [1:0] out);
counter #(.N(2)) u0 ( .clk(clk),
.rstn(rstn),
.en(en));
endmodule
Voir que les paramètres par défaut sont utilisés pour implémenter le compteur où N est égal à deux, ce qui en fait un compteur 2 bits et DOWN est égal à zéro, ce qui en fait un compteur. La sortie du compteur est laissée non connectée au niveau supérieur.
Décompteur 4 bits
Dans ce cas, le compteur de module est instancié avec N comme 4, ce qui en fait un compteur 4 bits. DOWN reçoit la valeur 1 lors de l'instanciation du module et donc un décompteur est implémenté.
module design_top ( input clk,
input rstn,
input en,
output [3:0] out);
counter #(.N(4), .DOWN(1))
u1 ( .clk(clk),
.rstn(rstn),
.en(en));
endmodule
Spécifier les paramètres
Ceux-ci sont principalement utilisés pour fournir des valeurs de temporisation et de retard et sont déclarés à l'aide du specparam
mot-clé. Il est autorisé à être utilisé à la fois dans le specify bloc et le corps du module principal.
// Use of specify block
specify
specparam t_rise = 200, t_fall = 150;
specparam clk_to_q = 70, d_to_q = 100;
endspecify
// Within main module
module my_block ( ... );
specparam dhold = 2.0;
specparam ddly = 1.5;
parameter WIDTH = 32;
endmodule
Différence entre les paramètres de spécification et de module
Spécifiez le paramètre | Paramètre de module |
---|---|
Déclaré par specparam | Déclaré par parameter |
Peut être déclaré dans specify bloc ou dans le module principal | Ne peut être déclaré que dans le module principal |
Peut se voir attribuer des specparams et des paramètres | Ne peut pas recevoir de specparams |
SDF peut être utilisé pour remplacer les valeurs | Valeurs des paramètres de déclaration d'instance ou defparam peut être utilisé pour remplacer |
Verilog