Paramétrage et RTL réutilisable
Paramétrer largeurs et types, protéger les cas limites et générer du matériel sans rendre le module opaque.
Paramètres de valeur
Un paramètre permet d'adapter un module au moment de l'instanciation. Le type du paramètre précise les valeurs acceptées.
module delay_line #(
parameter int unsigned WIDTH = 16,
parameter int unsigned DEPTH = 4
) (
input logic i_clk,
input logic [WIDTH-1:0] i_data,
output logic [WIDTH-1:0] o_data
);
logic [WIDTH-1:0] stages [0:DEPTH-1];
always_ff @(posedge i_clk) begin
stages[0] <= i_data;
for (int unsigned i = 1; i < DEPTH; i++)
stages[i] <= stages[i-1];
end
assign o_data = stages[DEPTH-1];
endmoduleCe module suppose DEPTH >= 1. Un module réutilisable doit annoncer ce contrat et, si possible, le contrôler à l'élaboration ou au début de la simulation.
initial begin
assert (DEPTH >= 1)
else $fatal(1, "DEPTH must be at least 1");
endCette vérification aide la simulation et certains outils d'élaboration. Elle ne remplace pas une valeur par défaut raisonnable ni une documentation claire.
Paramètres locaux
localparam définit une constante interne que l'instance ne peut pas remplacer.
localparam int unsigned COUNT_WIDTH = (DEPTH <= 1) ? 1 : $clog2(DEPTH);La protection du cas DEPTH <= 1 évite une largeur nulle. Les paramètres dérivés doivent être calculés une fois et porter un nom qui explique leur rôle.
Paramètres de type
SystemVerilog peut paramétrer le type transporté :
module register_t #(
parameter type T = logic [7:0]
) (
input logic i_clk,
input T i_d,
output T o_q
);
always_ff @(posedge i_clk)
o_q <= i_d;
endmoduleCe style convient aux bibliothèques internes quand les outils le prennent correctement en charge. Pour une IP livrée à plusieurs environnements, des paramètres de largeur plus classiques sont parfois plus faciles à intégrer.
Génération conditionnelle
generate choisit du matériel pendant l'élaboration. Il ne crée pas une condition exécutée à chaque cycle.
if (REGISTER_OUTPUT) begin : g_registered
always_ff @(posedge i_clk)
o_data <= result;
end else begin : g_comb
always_comb
o_data = result;
endLes blocs nommés g_registered et g_comb donnent des chemins hiérarchiques stables. Il faut éviter une multitude de paramètres qui produisent trop de combinaisons difficiles à vérifier.
À retenir
- Un paramètre typé définit mieux le contrat du module.
- Les valeurs interdites doivent être documentées et contrôlées.
localparamprotège les constantes dérivées internes.- Un paramètre de type peut rendre une brique très générale, selon le support des outils.
generatechoisit une structure matérielle à l'élaboration.
📝 Tester mes connaissances - Quiz du chapitre