Altifigence Academy

25 / 63 · Esercitazione

Laboratorio: verifica esaustiva del MUX e uscita registrata

Applicare gli stessi ingressi ai percorsi combinatorio e registrato e verificarli con tabella e istante di campionamento.

Oggetto del laboratorio e osservazione

Con sel=0 y riceve a, con sel=1 riceve b. sampled_y memorizza y al fronte di salitaFronte di salita Passaggio del clock da 0 a 1, distinto dall’intero intervallo di livello CLK=1. Approfondisci e resta fermo fino al successivo anche se cambiano gli ingressi.

Prima di iniziare

Preparate un progetto Desktop in Digital Design Studio e assicuratevi di avere autorizzazioni di esecuzione valide. Salvate ogni esempio come rtl/top.sv in una cartella separata.

Impostate anzitutto a e b diversi. Verificate a con sel=0 e b con sel=1, poi confrontate ogni riga del file d'ingresso.

Cambiare direttamente il percorso selezionato

y = sel ? b : a

Sorgente 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

Esecuzione

In New analysis selezionate Two-state single-clock v1. Clock port è clk e il periodo è 1000ps. Con i valori seguenti eseguite Preflight, poi Run RTL simulation, e confrontate i risultati.

ImpostazioneValore
Valori iniziali dei registri, dal LSB[false]
Reset portVuoto
Maximum cycles / time8 / 8000ps

Ogni colonna corrisponde a un elemento del file seguente. y atteso è 0,0,0,1,1,0,1,1. Il diagramma prevede la funzione secondo l'ordine degli ingressi e non include gli istanti di aggiornamento di sampled_y.

Le otto combinazioni del JSON di ingresso a colpo d’occhio
Mostra i dati della forma d’onda
Dati della forma d’onda: ogni carattere è un intervallo; il punto mantiene lo stato precedente; p è un ciclo di clock.
SegnaleForma d’ondaValori del bus
a0...1...
b0.1.0.1.
sel01010101
y expected0..1.01.

Stimoli d'ingresso

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

Confronto dei risultati

8 cycles · y=1 · sampled_y=1. A 3000ps verificate y=1 e sampled_y=0.

Il laboratorio usa RTL 0/1 con un solo clock. Non include testbench con #delay, initial o X/Z. Il contrassegno di completamento documenta l’apprendimento, non un risultato di simulazione reale.

Scrivere prima i risultati attesi

Prima della simulazione calcolate yy per la sequenza indicata: 0,0,0,1,1,0,1,10,0,0,1,1,0,1,1. La sequenza copre tutte le otto combinazioni: verificarle fornisce più evidenza di un solo valore finale corretto.

L'uscita registrataRegistro Memorizza uno stato di più bit. I registri sincroni del corso acquisiscono gli ingressi specificati al fronte di clock. Approfondisci si aggiorna al fronte di salita, non quando cambiano gli stimoli. Annotate separatamente uscita combinatoria prima del fronte e uscita del registro dopo.

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

Qui l'ingresso campionato al fronte kk definisce lo stato successivo qk+1q_{k+1}, cioè sampled_y. Anche sulla stessa coordinata temporale occorre verificare l'ordine fra applicazione dell'ingresso e aggiornamento del registro.

Tre verifiche per distinguere i difetti

  1. Selezione invertita: prima di sostituire con sel ? a : b, prevedete il primo vettore che fallirà. I vettori con a=ba=b non rilevano il difetto.
  2. Osservazione sbagliata: spiegate perché confrontare immediatamente sampled_y al posto di y con la risposta combinatoria fa sembrare errato anche un circuito corretto.
  3. Indipendenza dall'ingresso non scelto: cambiate solo quello e verificate che yy resti fermo. Deve invece seguire l'ingresso scelto.

Per ogni errore annotate ingresso, istante, valore atteso e reale. «La forma d'onda è strana» non distingue un errore di selezione da una latenza di un ciclo.

Estensione

Con dati a quattro bit lo spazio combinatorio è 24+4+1=5122^{4+4+1}=512. La verifica esaustiva è ancora possibile, ma provate prima 0, massimo, 0101, 1010 e walking-one per evidenziare errori di posizione. Aggiornate anche impostazioni e file d'ingresso per la nuova larghezza.

Prova tu

Dopo aver acquisito a=0,b=1,s=0a=0,b=1,s=0, prima del fronte seguente si porta solo ss a 1. Calcolate yy dopo il ritardo logico e sampled_y prima e dopo il prossimo fronte di salita.

Leggi la spiegazione

y=1y=1. sampled_y resta 0 fino al prossimo fronte di salita e allora memorizza 1. Si assume che gli ingressi siano stabili per il tempo necessario al campionamento.

Lesson files

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

La scelta vale per questo browser. Puoi modificarla in qualsiasi momento dal piè di pagina.