Altifigence Academy

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.

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.

SystemVerilog
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
endmodule

CW 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

NCW par défautcount après fronts autorisés depuis resetpulse après
110,0,01,1,1
211,0,10,1,0
531,2,3,4,00,0,0,0,1
831,2,3,4,5,6,7,00,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.

Votre choix s’applique à ce navigateur. Modifiez-le à tout moment en bas de page.