Altifigence Academy

25 / 63 · Travaux pratiques

Travaux pratiques : test exhaustif du MUX et sortie enregistrée

Appliquer les mêmes entrées aux chemins combinatoire et enregistré, puis vérifier avec la table de vérité et les instants de capture.

Circuit étudié et conditions d'observation

Avec sel=0, y prend a ; avec sel=1, il prend b. sampled_y stocke y au front montantFront montant Instant où l'horloge passe de 0 à 1, distinct du niveau désignant tout l'intervalle CLK=1. En savoir plus. Même si les entrées changent, sampled_y reste inchangé jusqu'au prochain front montant.

Avant de commencer

Préparez un projet Desktop Digital Design Studio et les autorisations d'exécution nécessaires. Enregistrez chaque exemple dans son propre dossier sous rtl/top.sv.

Commencez avec a et b différents. Vérifiez y=a pour sel=0 et y=b pour sel=1, puis comparez chaque ligne du fichier d'entrée.

Modifier le chemin sélectionné

y = sel ? b : a

Source SystemVerilog

SystemVerilog
module top (
    input logic clk,
    input logic a,
    input logic b,
    input logic sel,
    output logic y,
    output logic sampled_y
);
    assign y = sel ? b : a;
    // Explicit observation register: y remains purely combinational.
    // The register makes this design eligible for logic-netlist-1 simulation.
    always_ff @(posedge clk) sampled_y <= y;
endmodule

Exécution

Dans New analysis, choisissez Two-state single-clock v1. Clock port : clk ; période : 1000ps. Avec les réglages suivants, lancez Preflight puis Run RTL simulation et comparez les résultats.

RéglageValeur
Valeur initiale des registres, LSB en premier[false]
Reset portVide
Maximum cycles / time8 / 8000ps

Chaque colonne correspond à une entrée du fichier ci-dessous. Les valeurs combinatoires attendues sont 0,0,0,1,1,0,1,1. Le schéma prédit la fonction dans l'ordre des entrées ; il ne représente pas les instants de mise à jour de sampled_y.

Voir les huit combinaisons du JSON d'entrée
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
a0...1...
b0.1.0.1.
sel01010101
y attendu0..1.01.

Stimuli d'entrée

json
[
  {
    "inputs": {
      "a": [
        false
      ],
      "b": [
        false
      ],
      "sel": [
        false
      ]
    }
  },
  {
    "inputs": {
      "a": [
        false
      ],
      "b": [
        false
      ],
      "sel": [
        true
      ]
    }
  },
  {
    "inputs": {
      "a": [
        false
      ],
      "b": [
        true
      ],
      "sel": [
        false
      ]
    }
  },
  {
    "inputs": {
      "a": [
        false
      ],
      "b": [
        true
      ],
      "sel": [
        true
      ]
    }
  },
  {
    "inputs": {
      "a": [
        true
      ],
      "b": [
        false
      ],
      "sel": [
        false
      ]
    }
  },
  {
    "inputs": {
      "a": [
        true
      ],
      "b": [
        false
      ],
      "sel": [
        true
      ]
    }
  },
  {
    "inputs": {
      "a": [
        true
      ],
      "b": [
        true
      ],
      "sel": [
        false
      ]
    }
  },
  {
    "inputs": {
      "a": [
        true
      ],
      "b": [
        true
      ],
      "sel": [
        true
      ]
    }
  }
]

Comparaison des résultats

8 cycles · y=1 · sampled_y=1. À 3000ps, vérifiez y=1 et sampled_y=0.

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

Écrire d'abord les résultats attendus

Avant d'exécuter le simulateur, calculez yy pour la séquence : 0,0,0,1,1,0,1,10,0,0,1,1,0,1,1. Cela couvre les huit combinaisons et apporte davantage de preuves qu'une seule valeur finale correcte.

La sortie du 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 change au front montant, pas au changement du stimulus. Notez séparément y juste avant le front et la sortie stockée juste après.

qk+1=sk‾ak+skbkq_{k+1}=\overline{s_k}a_k+s_kb_k

L'entrée échantillonnée au front kk définit l'état qk+1q_{k+1} après ce front ; sampled_y représente cet état. Même à une même coordonnée temporelle, vérifiez l'ordre des événements d'application des entrées et de mise à jour des registres.

Trois vérifications pour distinguer les défauts

  1. Sélection inversée : avant de remplacer l'expression par sel ? a : b, prévoyez le premier vecteur en échec. Les vecteurs a=ba=b ne détectent pas cette erreur.
  2. Point d'observation : expliquez pourquoi comparer immédiatement sampled_y à la réponse combinatoire, au lieu de y, fait échouer même un circuit correct.
  3. Maintien : changez seulement l'entrée non sélectionnée et vérifiez que yy reste stable. En revanche, yy doit suivre l'entrée sélectionnée.

Pour chaque erreur, consignez entrée, instant d'observation, attendu et obtenu. « Le chronogramme est étrange » ne distingue pas une sélection incorrecte d'une latence d'un cycle.

Prolongement

Avec des données sur quatre bits, l'espace combinatoire compte 24+4+1=5122^{4+4+1}=512 cas. Le test exhaustif reste possible ; commencez toutefois par 0, le maximum, 0101, 1010 et les motifs à un seul bit à 1 pour révéler vite les erreurs de position. Actualisez aussi configuration et fichier d'entrée pour la nouvelle largeur.

Essayez vous-même

Après avoir capturé a=0,b=1,s=0a=0,b=1,s=0 sur un front montant, vous passez seulement ss à 1 avant le front suivant. Donnez yy après stabilisation, puis sampled_y avant et après le prochain front montant.

Lire l’explication

La sortie combinatoire vaut y=1y=1. sampled_y reste à 0 jusqu'au prochain front montant, puis stocke 1. On suppose que les entrées restent stables pendant la durée nécessaire à l'échantillonnage.

Lesson files

mux-top.sv ↓mux-inputs.json ↓

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