Altifigence Academy

17 / 37 · Travaux pratiques

Travaux pratiques : reset, rebouclage et invariants du compteur

Comparer chaque front à une référence et isoler les effets de l'initialisation, du reset et de la largeur.

Circuit étudié et observation

L'état initial vaut 3 ; le premier front montantFront montant Instant où l'horloge passe de 0 à 1, distinct du niveau désignant tout l'intervalle CLK=1. En savoir plus applique le resetReset Commande ramenant l'état à la valeur initiale spécifiée. Son caractère synchrone/asynchrone et sa priorité sur les autres commandes doivent être définis. En savoir plus. Ensuite, les valeurs sont 0,1,2,3,0. Même avec reset actif, le compte reste inchangé avant le front.

Avant de commencer

Préparez un projet Desktop Digital Design Studio et ses autorisations d'exécution. Enregistrez chaque exemple dans un dossier distinct sous rtl/top.sv.

Source SystemVerilog

SystemVerilog
module top (
    input logic clk,
    input logic rst,
    output logic [1:0] count
);
    // Active-high synchronous reset: sampled only at the rising clock edge.
    always_ff @(posedge clk)
        if (rst) count <= 2'b00;
        else count <= count + 2'b01;
endmodule

Exécution

Dans New analysis, choisissez Two-state single-clock v1, Clock port=clk et une période de 1000ps. Lancez Preflight puis Run RTL simulation avec :

RéglageValeur
Valeur initiale des registres, LSB en premier[true,true]
Reset portrst · Active high · 1 cycle
Maximum cycles / time5 / 5000ps

Stimuli

json
[
  {
    "inputs": {}
  },
  {
    "inputs": {}
  },
  {
    "inputs": {}
  },
  {
    "inputs": {}
  },
  {
    "inputs": {}
  }
]

Chaque colonne représente un front montant : entrées juste avant, états after juste après. L'alignement indique les échantillons, pas la propagation physiqueRetard de propagation Temps nécessaire après un changement d'entrée pour que la sortie se stabilise à sa valeur correcte. Équivalence logique et caractéristiques temporelles sont distinctes. En savoir plus. E0–E4 correspondent à 500,1500,2500,3500,4500ps. Comparez toutes les valeurs intermédiaires de count, pas seulement la dernière.

Les cinq fronts montants du TP
Voir les données du chronogramme
Données du chronogramme : chaque caractère représente un intervalle ; un point maintient l'état précédent ; p représente un cycle d'horloge.
SignalForme d'ondeValeurs du bus
edge23452E0 → E1 → E2 → E3 → E4
reset10...
count avant2345211 → 00 → 01 → 10 → 11
count après2345200 → 01 → 10 → 11 → 00

Résultats à comparer

5 cycles · count=00. Vérifiez 00→01→10→11→00 à 500,1500,2500,3500,4500ps.

Le TP utilise du RTL 0/1 à horloge unique, sans banc #delay, initial ou X/Z. L'indication de fin de leçon est une trace pédagogique, pas un résultat de simulation.

Calculer l'état attendu à chaque front

Le registreRegistre Circuit stockant plusieurs bits d'état. Les registres synchrones du cours capturent leur entrée définie sur un front d'horloge. En savoir plus commence à 3, mais le reset prime au premier front. Initialisation et reset sont distincts.

Front montantrstcount avantcount après
500ps11100
1500ps00001
2500ps00110
3500ps01011
4500ps01100

Sans reset, la relation suivante doit tenir à chaque front :

ck+1=(ck+1) mod 4c_{k+1}=(c_k+1)\bmod 4

Vérifier seulement le 00 final peut laisser passer des états intermédiaires incorrects. Contrôlez toute la séquence et, séparément, la priorité du reset.

Changer un seul paramètre à la fois

  • Avec une initialisation à 00, la séquence après le premier reset doit rester identique : vérifiez son indépendance de l'état initial.
  • Avec Reset cycles=2, count doit valoir 00 aux deux premiers fronts ; l'incrémentation commence un front plus tard.
  • Sur trois bits, le rebouclage demande huit incréments. Revoyez déclaration, largeurs des constantes, tableau initial et durée d'exécution.

Généraliser à modulo-10

Quatre bits représentent 0–15 : incrémenter ne donne donc pas automatiquement 0 après 9. Définissez explicitement :

ck+1={0rk=10rk=0 ∧ ek=1 ∧ ck≥9ck+1rk=0 ∧ ek=1 ∧ ck<9ckrk=0 ∧ ek=0c_{k+1}=\begin{cases}0 & r_k=1\\0 & r_k=0\ \land\ e_k=1\ \land\ c_k\ge 9\\c_k+1 & r_k=0\ \land\ e_k=1\ \land\ c_k<9\\c_k & r_k=0\ \land\ e_k=0\end{cases}

Cette règle ramène 10–15 à 0 lorsqu'enable est actif. D'autres récupérations sont possibles, mais spécification et modèle de vérification doivent partager la même politique.

Essayez vous-même

Après le reset du premier front, le compteur original de deux bits effectue onze incréments sans commande enable. Calculez count sans énumérer les états intermédiaires.

Lire l’explication

Après reset, l'état est 0 ; 11 mod 4=311\bmod4=3, soit 11. « Onze fronts au total » diffère d'« onze incréments après reset » : si le premier des onze fronts réinitialise, il n'y a que dix incréments.

Lesson files

counter-top.sv ↓counter-inputs.json ↓

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