Altifigence Academy

25 / 63 · Übung

Labor: MUX-Vollprüfung und Analyse registrierter Ausgänge

Gleiche Eingaben auf kombinatorischen und registrierten Pfad anwenden und anhand von Wahrheitstabelle und Abtastzeit prüfen.

Versuchsobjekt und Beobachtungsbedingungen

Bei sel=0 wird a, bei sel=1 b auf y ausgegeben. sampled_y speichert y an der steigenden TaktflankeSteigende Flanke Übergang des Takts von 0 auf 1. Nicht zu verwechseln mit dem gesamten hohen Pegelintervall CLK=1. Mehr erfahren und hält trotz Eingangsänderungen bis zur nächsten.

Vor dem Start

Bereiten Sie ein Desktop-Projekt in Digital Design Studio und gültige Ausführungsberechtigungen vor. Speichern Sie jedes Beispiel als rtl/top.sv in einem eigenen Ordner.

Wählen Sie zunächst für a und b unterschiedliche Werte. Prüfen Sie die Auswahl a bei sel=0 und b bei sel=1 und vergleichen Sie jede Zeile der Eingabedatei.

Den ausgewählten Pfad selbst umschalten

y = sel ? b : a

SystemVerilog-Quelltext

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

Ausführung

Wählen Sie in New analysis die Option Two-state single-clock v1. Clock port ist clk, die Periode 1000ps. Führen Sie mit den folgenden Werten Preflight und danach Run RTL simulation aus und vergleichen Sie die Ergebnisse.

EinstellungWert
Anfängliche Registerwerte, LSB zuerst[false]
Reset portLeer
Maximum cycles / time8 / 8000ps

Jede Spalte entspricht einem Eintrag der folgenden Eingabedatei. Erwartetes y: 0,0,0,1,1,0,1,1. Das Diagramm prognostiziert die Funktion nach Eingabereihenfolge und zeigt keine Aktualisierungszeitpunkte von sampled_y.

Die acht Kombinationen des Eingabe-JSON im Überblick
Wellenformdaten anzeigen
Wellenformdaten: Jedes Zeichen steht für ein Intervall, ein Punkt hält den vorherigen Zustand und p ist ein Taktzyklus.
SignalWellenformBuswerte
a0...1...
b0.1.0.1.
sel01010101
y expected0..1.01.

Eingabestimuli

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
      ]
    }
  }
]

Ergebnisse vergleichen

8 cycles · y=1 · sampled_y=1. Prüfen Sie bei 3000ps, dass y=1 und sampled_y=0 sind.

Diese Übung verwendet 0/1-RTL mit einem Takt. Sie enthält keine Testbench mit #delay, initial oder X/Z. Die Lernabschlussmarkierung dokumentiert den Lernfortschritt und ist kein tatsächliches Simulationsergebnis.

Erwartete Ergebnisse zuerst aufschreiben

Berechnen Sie vor dem Simulationslauf yy für die obige Eingabereihenfolge selbst: 0,0,0,1,1,0,1,10,0,0,1,1,0,1,1. Damit werden alle acht Kombinationen geprüft, eine stärkere Aussage als ein einziger korrekter Endwert.

Der RegisterausgangRegister Speichert einen Zustand aus mehreren Bits. Die synchronen Register dieses Kurses übernehmen festgelegte Eingaben an Taktflanken. Mehr erfahren aktualisiert sich an steigenden Flanken, nicht bei Änderungen der Stimuli. Protokollieren Sie getrennt den kombinatorischen Wert vor und den Registerwert nach der Flanke.

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

Hier definiert der an Flanke kk abgetastete Eingang den anschließenden Zustand qk+1q_{k+1}, also sampled_y. Auch bei gleicher Zeitkoordinate muss die Ereignisreihenfolge von Eingabe und Registeraktualisierung geprüft werden.

Drei Prüfungen zur Unterscheidung von Fehlern

  1. Vertauschte Auswahl: Sagen Sie vor der Änderung zu sel ? a : b voraus, welcher Vektor zuerst scheitert. Vektoren mit a=ba=b erkennen diesen Fehler nicht.
  2. Verwechselter Beobachtungspunkt: Erklären Sie, weshalb der sofortige Vergleich von sampled_y statt y mit der kombinatorischen Lösung selbst korrekte Hardware fehlerhaft erscheinen lässt.
  3. Unabhängigkeit vom ungewählten Eingang: Ändern Sie nur diesen und prüfen Sie, dass yy hält. Dem ausgewählten Eingang muss yy dagegen folgen.

Notieren Sie je Fehler Eingabe, Beobachtungszeit, Soll- und Istwert. „Das Zeitdiagramm sieht seltsam aus“ unterscheidet einen Auswahlfehler nicht von einer Zykluslatenz.

Erweiterungsaufgabe

Bei vier Datenbits umfasst der kombinatorische Eingaberaum 24+4+1=5122^{4+4+1}=512 Fälle. Vollprüfung ist weiter möglich; verwenden Sie zunächst 0, Maximum, 0101, 1010 und Walking-one-Muster, um Bitpositionsfehler schnell zu erkennen. Aktualisieren Sie auch Einstellungen und Eingabedatei für die neue Breite.

Selbst ausprobieren

Nach einer Abtastung von a=0,b=1,s=0a=0,b=1,s=0 wird vor der nächsten Flanke nur ss auf 1 gesetzt. Bestimmen Sie yy nach der Logikverzögerung und sampled_y vor und nach der nächsten steigenden Flanke.

Erklärung lesen

y=1y=1. sampled_y bleibt bis zur nächsten steigenden Flanke 0 und speichert dann 1. Vorausgesetzt wird, dass die Eingänge während der erforderlichen Abtastzeit stabil sind.

Lesson files

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

Deine Auswahl gilt für diesen Browser. Du kannst sie jederzeit in der Fußzeile ändern.