Stavo leggendo questa pagina http://www.asic-world.com/verilog/verilog_one_day3.html quando mi sono imbattuto in quanto segue:
Normalmente dobbiamo resettare i flip-flop, quindi ogni volta che lorologio fa il transizione da 0 a 1 (posedge), controlliamo se è asserito reset (reset sincrono), quindi procediamo con logica normale. Se guardiamo da vicino vediamo che nel caso della logica combinatoria avevamo “=” per lassegnazione, e per il blocco sequenziale avevamo loperatore “< =”. Bene, “=” sta bloccando lassegnazione e “< =” non blocca lassegnazione. “=” esegue il codice in sequenza allinterno di un inizio / fine, mentre “< =” viene eseguito in parallelo.
Ero abbastanza sicuro che le assegnazioni non bloccanti fossero sequenziali mentre le assegnazioni bloccanti fossero parallele. Dopotutto, puoi eseguire assegnazioni di blocco con istruzioni assign al di fuori di always blocks e tutte vengono eseguite in parallelo. È un errore o il comportamento è diverso allinterno di un blocco sempre? E, se il comportamento È diverso allinterno di un blocco sempre, è possibile eseguire assegnazioni non bloccanti allesterno di un blocco sempre?
Risposta
era abbastanza sicuro che le assegnazioni non bloccanti fossero sequenziali mentre le assegnazioni bloccanti fossero parallele.
Lassegnazione di blocco viene eseguita “in serie” perché unassegnazione di blocco blocca lesecuzione dellistruzione successiva fino al suo completamento. Pertanto i risultati dellistruzione successiva possono dipendere dal completamento della prima.
Lassegnazione non bloccante viene eseguita in parallelo perché descrive le assegnazioni che si verificano tutte nello stesso momento. Il risultato di unistruzione sulla 2a riga non dipenderà dai risultati dellistruzione sulla 1a riga. Invece, la seconda riga verrà eseguita come se la prima riga non fosse ancora avvenuta.
Commenti
Risposta
Le istruzioni Assign non sono né “bloccanti” né “non bloccanti”, sono “continue”. Loutput di unistruzione assign è sempre uguale alla funzione specificata dei suoi input. Le assegnazioni “blocking” e “nonblocking” esistono solo allinterno di always blocks.
Unassegnazione blocking ha effetto immediatamente quando viene elaborata. Unassegnazione non bloccante ha luogo alla fine dellelaborazione del “delta temporale” corrente.
sempre i blocchi possono essere utilizzati per modellare la logica combinatoria o sequenziale (systemverilog ha always_comb e always_ff per renderlo esplicito). logica combinatoria di solito è più efficiente da usare = ma in genere non ha molta importanza.
Quando si modella la logica sequenziale (ad esempio, sempre @ (posedge clk)) normalmente si utilizzano valutazioni non bloccanti. Ciò consente di determina lo “stato dopo il fronte di clock” in termini di “stato prima del fronte di clock”.
A volte è utile usare assegnazioni di blocco in blocchi sempre sequenziali come “variabili”. ci sono due regole chiave da tenere a mente.
- Non accedere a un file reg impostato con assegnazioni di blocco allinterno di un blocco sequenziale sempre dallesterno del blocco in cui è assegnato.
- Non mescolare assegnazioni di blocco e non bloccanti allo stesso registro.
La violazione di queste regole rischia di provocare errori di sintesi e / o differenze di comportamento tra simulazione e sintesi.
Commenti
- ” ” Non accedere a un registro impostato con assegnazioni di blocco allinterno di una sequenza blocca sempre dallesterno il bloccalo sempre è assegnato in. ” ” Puoi spiegarlo per favore?
- Diversi blocchi sequenziali sempre non hanno un definito ordine. Quindi leggere un ” reg ” impostato con unassegnazione di blocco in un blocco sempre da un altro blocco sempre porterà a un comportamento imprevedibile.
- E anche se sembra funzionare in simulazione, uno strumento di sintesi dovrebbe esaminarlo e dire ” no “. Uso i reg locali per queste variabili intermedie e mi assicuro che siano sempre assegnate a ogni orologio prima di essere lette, in modo che non vi sia ‘ spazio di archiviazione ‘ è implicito.
- IIRC almeno in quartus è considerato solo un avvertimento, non un errore.
- Non dovresti usare assegnazioni non bloccanti nella logica combinatoria, può bloccarsi la simulazione. Per maggiori dettagli, fai riferimento a questa risposta: electronics.stackexchange.com/a/506047/238188
Risposta
Il termine Assegnazione blocco confonde le persone perché la parola blocco sembrerebbe suggerire una logica sequenziale temporale. Ma nella logica sintetizzata non significa che questo , perché tutto funziona in parallel .
Forse un termine meno confuso sarebbe assegnazione immediata , che differenzierebbe comunque i risultati intermedi della logica combinatoria dalla input a elementi di memoria non trasparenti (ad esempio registri con clock), che possono avere assegnazione ritardata .
Da un punto di vista legalistico, tutto funziona molto bene. In effetti, puoi considerare =
unoperazione di blocco (sequenziale temporale) anche allinterno di always_comb
sequenze. Tuttavia, la distinzione tra sequenziale temporale e parallelo non fa assolutamente alcuna differenza in questo caso perché always_comb
il blocco è definito per essere ripetuto fino a quando la sequenza di istruzioni non converge in uno stato stabile, che è esattamente ciò che farà il circuito hardware (se soddisfa i requisiti di temporizzazione).
Il sottoinsieme sintetizzabile di Verilog (e soprattutto SystemVerilog) è estremamente semplice e facile da usare, una volta che conosci gli idiomi necessari. Devi solo superare luso intelligente della terminologia associata ai cosiddetti elementi comportamentali nella lingua.
Commenti
- Negli stili di codifica comportamentale ( rispetto a RTL ), la distinzione tra blocco e non blocco può essere rilevante. In alcuni casi, lo strumento di sintesi può essere in grado di dedurre RTL funzionalmente equivalente da progetti di componenti comportamentali.
- Ovviamente il procedurale modalità di SystemVerilog, applicabile in particolare alle
initial
istruzioni allinterno diprogram
blocchi, utilizza assegnazione di blocco (sequenziale temporale) esclusivamente. Questo è utile per la progettazione di testbench , ma generalmente non per la specifica RTL.
assign
si verificano al di fuori di always blocks e sono generalmente utilizzate per descrivere combinatorie (un-latched ) logica (sebbene blocchi sempre, con alcune eccezioni, descrivono la logica sequenziale). Per quanto ne so, le istruzioniassign
vengono eseguite sempre ” in parallelo ” ogni volta che il loro LHS cambia valore .