19 / 37 · Concept
parameter, localparam, $clog2 et configurations limites
Séparez entrées d'exécution et configuration, puis concevez largeur et terminaison pour N=1 et les non-puissances de deux.
Les leçons sont gratuites. Inscrivez-vous pour enregistrer vos progrès.
Paramètres fixés à l'élaboration
Un port change en fonctionnement; parameter configure avant construction; localparam nomme une constante dérivée non remplaçable par l'instance. Ce ne sont pas des variables par cycle. Un compteur modulo N utilise 0..N−1. Pour N≥2, la largeur vaut $clog2(N); N=1 donne zéro, donc réservez au moins un bit. N=0 sort du contrat.
Terminer sur un front autorisé
Le passage de l'ancien count=N−1 à zéro enregistre pulse. Un front désactivé conserve count et efface pulse. La remise à zéro synchrone efface les deux et prime sur enable. N est un entier positif dans l'intervalle pris en charge.
module modulo_tick #(
parameter integer N = 5,
parameter integer CW = (N <= 1) ? 1 : $clog2(N)
) (
input logic clk, rst, enable,
output logic [CW-1:0] count,
output logic pulse
);
localparam logic [CW-1:0] LAST = CW'(N-1);
always_ff @(posedge clk) begin
if (rst) begin
count <= '0;
pulse <= 1'b0;
end else begin
pulse <= 1'b0;
if (enable) begin
if (count >= LAST) begin
count <= '0;
pulse <= 1'b1;
end else count <= count + 1'b1;
end
end
end
endmoduleCW apparaît dans les ports et reste exposé. Gardez sa valeur par défaut ou ≥max(1,$clog2(N)). Trop petit, il tronque LAST; trop grand, il crée des codes inutilisés, ramenés à zéro par >= sur un front autorisé. CW'(N-1) précise la taille sans corriger une configuration invalide. Validez avant élaboration: une assertion dynamique ne répare pas une déclaration incorrecte.
Matrice de configurations
| N | CW par défaut | count après fronts autorisés depuis reset | pulse après |
|---|---|---|---|
| 1 | 1 | 0,0,0 | 1,1,1 |
| 2 | 1 | 1,0,1 | 0,1,0 |
| 5 | 3 | 1,2,3,4,0 | 0,0,0,0,1 |
| 8 | 3 | 1,2,3,4,5,6,7,0 | 0,0,0,0,0,0,0,1 |
Un bit stocké ne rend pas deux états valides pour N=1. N=5 ne visite normalement pas 5,6,7. Tester seulement des puissances de deux masque un comparateur de rebouclage manquant.
Exercice : comportement et rejet
Instanciez N=1,2,5,8, exécutez au moins deux périodes, faites une pause au terminal et appliquez reset avec enable. Comparez chaque count/pulse. La référence entière efface sous reset, met pulse à zéro puis incrémente modulo N sous enable avec détection du retour, sans CW ni état interne. Vérifiez le rejet de N=0 et de CW insuffisant. La réutilisation est justifiée dans l'intervalle déclaré et testé, pas par un seul cas par défaut réussi.