Altifigence Academy

26 / 37 · Concetto

Debug del contatore e controesempi minimi

Progettare test brevi che distinguano errori di reset, enable e ritorno.

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

SituazioneRequisito da verificare
reset=1, enable=0Reset non mascherato da enable
reset=1, enable=1Reset prioritario sull'incremento
count=M-1, enable=0Nessun ritorno erroneo durante lo stop
count=M-1, enable=1Ritorno esatto da M−1 a 0
Reset cambia fra i frontiReset 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.

Controesempio minimo: enable nasconde reset
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
edge234E0 → E1 → E2
reset101
enable01.
correct after2340 → 1 → 0
bug after2345 → 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.

Attivare reset ed enable simultaneamente

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

Ck+1=rk?0:(ek?((Ck+1) mod M):Ck)C_{k+1}=r_k?0:(e_k?((C_k+1)\bmod M):C_k)

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.

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