Altifigence Academy

15 / 37 · Concetto

Assegnazioni non bloccanti e aggiornamento simultaneo

Separare valori precedenti e successivi per leggere correttamente pipeline e contatori.

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.

SystemVerilog
always_ff @(posedge clk) begin
  if (rst) begin
    a <= 8'd0;
    b <= 8'd0;
  end else begin
    a <= d;
    b <= a;
  end
end
ak+1=dk,bk+1=aka_{k+1}=d_k,\qquad b_{k+1}=a_k

Con 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.

a e b leggono lo stesso stato precedente
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
d2345 → 9 → 2
a after2345 → 9 → 2
b after2340 → 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.

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