26 / 37 · Concetto
Debug del contatore e controesempi minimi
Progettare test brevi che distinguano errori di reset, enable e ritorno.
Le lezioni sono gratuite. Iscriviti per salvare i progressi.
Un finale corretto può nascondere una sequenza errata
Finire a 0 non dimostra né reset né wraparound: anche un contatore sempre fermo a 0 dà lo stesso esito. Servono osservazioni che mostrino separatamente incremento, mantenimento, resetReset Controllo che riporta allo stato iniziale specificato. Occorre definirne sincronicità e priorità rispetto agli altri controlli. Approfondisci e ritorno al limite.
Far collidere deliberatamente due funzioni
| Situazione | Requisito da verificare |
|---|---|
| reset=1, enable=0 | Reset non mascherato da enable |
| reset=1, enable=1 | Reset prioritario sull'incremento |
| count=M-1, enable=0 | Nessun ritorno erroneo durante lo stop |
| count=M-1, enable=1 | Ritorno esatto da M−1 a 0 |
| Reset cambia fra i fronti | Reset sincrono applicato al fronte seguente |
Provare i controlli solo separatamente difficilmente rileva errori di priorità.
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. Si parte da count=5. Il circuito errato controlla reset solo dentro enable e quindi mantiene 5 al primo fronte. Anche se il finale coincide, la prima discordanza rivela il difetto.
Mostra i dati della forma d’onda
| Segnale | Forma d’onda | Valori del bus |
|---|---|---|
| edge | 234 | E0 → E1 → E2 |
| reset | 101 | |
| enable | 01. | |
| correct after | 234 | 0 → 1 → 0 |
| bug after | 234 | 5 → 6 → 0 |
Avviate il riferimento modulo 8 da 101. Selezionate enable=0, reset=1 e avanzate il clock: il valore corretto è 000. L'RTL errato con reset dentro enable mantiene 101. Rilasciato reset, distinguete anche mantenimento con enable=0 e incremento con enable=1.
Il reset sincrono ha priorità su enable. Con enable=0, il valore memorizzato viene mantenuto. q=101; q_next = (q + 1) mod 8
Trovare la prima discordanza con il riferimento
Il modello assume stati validi da 0 a M−1. Il recupero fuori campo richiede una politica aggiuntiva. Calcolate e confrontate ogni fronte: ingressi e stato appena prima della prima discordanza sono il punto minimo da cui indagare.
Se il guasto appare dopo 1000 cicli, eliminate intervalli inutili fino a riprodurlo in tre-cinque fronti. Conservate il controesempio minimo come regressione dopo la correzione RTL. Riesaminate separatamente specifica modificata e codice per evitare di introdurre la stessa condizione errata in progetto e test.
Prova tu
Il codice errato racchiude reset in if(en) begin if(rst) ... end. Quali stato iniziale e ingressi lo rivelano nel modo più breve?
Leggi la spiegazione
Partite da un valore non nullo e applicate un fronte con rst=1, en=0. La priorità reset richiede 0, ma il circuito errato mantiene il vecchio valore. Partire da 0 nasconderebbe il difetto.