15 / 37 · Concetto
Assegnazioni non bloccanti e aggiornamento simultaneo
Separare valori precedenti e successivi per leggere correttamente pipeline e contatori.
Le lezioni sono gratuite. Iscriviti per salvare i progressi.
I membri destri leggono lo stato precedente
Nel blocco sequenziale a clock, <= valuta il membro destro e applica il risultato nella fase di aggiornamento non bloccanteNonblocking Assegnazione RTL sequenziale con <=. Valuta il membro destro e pianifica l’aggiornamento, permettendo ai registri dello stesso fronte di usare lo stato precedente.. Più registriRegistro Memorizza uno stato di più bit. I registri sincroni del corso acquisiscono gli ingressi specificati al fronte di clock. Approfondisci possono così aggiornarsi sullo stesso fronte senza che l'ordine delle righe faccia attraversare più stadi al nuovo valore.
always_ff @(posedge clk) begin
if (rst) begin
a <= 8'd0;
b <= 8'd0;
end else begin
a <= d;
b <= a;
end
endCon a=b=0 e ingressi 5,9,2, le coppie (a, b) dopo i fronti sono (5,0),(9,5),(2,9). Leggere il nuovo a nella seconda riga eliminerebbe uno stadio di pipelinePipeline Divide i calcoli in stadi separati da registri elaborando più ingressi sovrapposti. Dati, valid e controlli devono essere allineati per stadio. Approfondisci.
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 a=b=0. Mentre a memorizza il nuovo d, b acquisisce il vecchio a: le righe sono sfalsate di uno stadio.
Mostra i dati della forma d’onda
| Segnale | Forma d’onda | Valori del bus |
|---|---|---|
| edge | 234 | E0 → E1 → E2 |
| d | 234 | 5 → 9 → 2 |
| a after | 234 | 5 → 9 → 2 |
| b after | 234 | 0 → 5 → 9 |
Perché le assegnazioni bloccanti sono rischiose
Con a=d; b=a; nello stesso blocco, b può usare a già aggiornato. L'ordine rispetto ad altri blocchi sequenziali può inoltre creare race. Usate normalmente blocking per il calcolo combinatorio e nonblocking per lo stato; ammettete eccezioni solo sapendone spiegare gli eventi.
Evitare più assegnazioni allo stesso registro
Più assegnazioni nonblocking eseguite su q nella stessa procedura possono far prevalere l'ultima. Esplicitate la priorità con if / else if / else o una variabile next-state, invece di nasconderla in if indipendenti. Evitate driver dello stesso registro da più blocchi.
In revisione scrivete una sola equazione di stato successivo per registro. Due equazioni o condizioni senza definizione segnalano che occorre riesaminare le priorità.
Prova tu
Con a=1, b=4 iniziali, eseguite a<=b; b<=a; nello stesso blocco. Quali stati seguono dopo uno e due fronti?
Leggi la spiegazione
Dopo un fronte (4,1), dopo due (1,4). Entrambe leggono lo stesso stato vecchio e scambiano i valori. Con a=b; b=a; possono invece diventare entrambi il vecchio b: non è equivalente.