Altifigence Academy

17 / 37 · Esercitazione

Laboratorio: reset, ritorno e invarianti del contatore

Confrontare ogni fronte con un riferimento e separare effetti di inizializzazione, reset e larghezza.

Oggetto del laboratorio e osservazione

Partite da 3 e applicate resetReset Controllo che riporta allo stato iniziale specificato. Occorre definirne sincronicità e priorità rispetto agli altri controlli. Approfondisci al primo fronte di salitaFronte di salita Passaggio del clock da 0 a 1, distinto dall’intero intervallo di livello CLK=1. Approfondisci. Poi la sequenza è 0,1,2,3,0. Anche con reset attivo, prima del fronte il valore resta invariato.

Prima di iniziare

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

Sorgente 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

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[true, true]
Reset portrst · Active high · 1 cycle
Maximum cycles / time5 / 5000ps

Stimoli d'ingresso

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

Ogni colonna registra un fronte di salitaFronte di salita Passaggio del clock da 0 a 1, distinto dall’intero intervallo di livello CLK=1. Approfondisci. Gli ingressi sono quelli immediatamente precedenti; gli stati con „after“ quelli subito dopo l’aggiornamento. Le colonne indicano l’ordine dei campioni, non il ritardo fisico di propagazioneRitardo di propagazione Tempo dalla variazione d’ingresso all’assestamento corretto dell’uscita. Equivalenza logica e proprietà temporali sono distinte. Approfondisci. E0–E4 sono i fronti a 500,1500,2500,3500,4500ps. Confrontate ogni colonna count, non solo il finale.

I cinque fronti di salita del laboratorio
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
edge23452E0 → E1 → E2 → E3 → E4
reset10...
count before2345211 → 00 → 01 → 10 → 11
count after2345200 → 01 → 10 → 11 → 00

Confronto dei risultati

5 cycles · count=00. A 500,1500,2500,3500,4500ps verificate 00 → 01 → 10 → 11 → 00.

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.

Calcolare gli stati attesi per fronte

Il registroRegistro Memorizza uno stato di più bit. I registri sincroni del corso acquisiscono gli ingressi specificati al fronte di clock. Approfondisci parte da 3, ma al primo fronte prevale reset. Inizializzazione e reset non sono la stessa cosa.

Fronte di salitarstcount primacount dopo
500ps11100
1500ps00001
2500ps00110
3500ps01011
4500ps01100

Senza reset deve valere a ogni fronte:

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

Controllare solo il finale 00 può nascondere stati intermedi errati. Verificate separatamente l'intera sequenza e la priorità del reset.

Cambiare una sola condizione alla volta

  • Partendo da 00 la sequenza dopo il primo reset resta uguale: si verifica l'indipendenza dallo stato iniziale.
  • Con Reset cycles=2, i primi due fronti devono dare count=00; l'incremento comincia un fronte più tardi.
  • Con tre bit il periodo è di otto incrementi. Controllate anche larghezza delle costanti, array iniziale e durata del test, oltre alla dichiarazione.

Generalizzare al modulo 10

Quattro bit rappresentano 0–15: il semplice incremento non torna a 0 dopo 9. Occorre una funzione di stato successivo specifica.

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}

Questa definizione recupera anche gli stati inutilizzati 10–15 portandoli a 0 con enable. Sono possibili altre politiche, ma specifica e modello di verifica devono condividerle.

Prova tu

Qual è count nel contatore originale a due bit dopo undici incrementi incondizionati successivi al reset del primo fronte? Calcolate senza elencare gli stati.

Leggi la spiegazione

Dopo reset lo stato è 0: 11 mod 4=311\bmod4=3, cioè 11. Undici fronti totali non equivalgono a undici incrementi dopo reset: se il primo azzera, gli incrementi sono dieci.

Lesson files

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

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