Ritardi nelle assegnazioni
Fa parte della sezione Fondamenti del percorso Verilog di Coddy. Lezione 69 di 90.
Nelle lezioni precedenti abbiamo trattato i ritardi generali (#10 a = b;) e i ritardi delle porte (and #5 (out, a, b);). Ora trattiamo i ritardi di assegnazione, ovvero ritardi che si verificano all'interno di un blocco procedurale (come initial o always) come parte di un'istruzione di assegnazione.
Un ritardo di assegnazione attende per un tempo specificato, poi esegue l’assegnazione. Il ritardo viene inserito dopo il simbolo # e prima dell’assegnazione.
Sintassi:
variable = #delay expression;A differenza di un ritardo generale #10 a = b; (ritardo, poi assegnazione), un ritardo sull’assegnazione a = #10 b; prende il valore di b in quel momento, attende 10 unità di tempo e poi lo assegna ad a.
Ritardo generale vs ritardo dell'assegnazione
| Ritardo generale | Ritardo dell'assegnazione | |
|---|---|---|
| Sintassi | #10 a = b; | a = #10 b; |
| Quando viene letto il valore? | Al momento dell'assegnazione (dopo il ritardo) | Immediatamente (prima del ritardo) |
| Quale valore viene assegnato? | Il valore di b in quel momento | Il valore di b al tempo 0 (o al momento della lettura) |
| Quando viene assegnato il valore? | Dopo il ritardo | Dopo il ritardo |
Esempio: la differenza
initial begin
b = 1;
#5 b = 0;
// Ritardo generale
#10 a1 = b; // Attende 10, poi legge b (b=0) → a1=0
// Ritardo nell'assegnazione
a2 = #10 b; // Legge b ora (b=0), attende 10, poi assegna → a2=0
endQui entrambi danno lo stesso risultato. La differenza si nota quando b cambia durante il ritardo.
Esempio di differenza fondamentale
To show b changing during the delay, we need two separate initial blocks that run in parallel:
initial begin
b = 1;
a1 = #10 b; // Legge b=1 al tempo 0, assegna a1=1 al tempo 10
end
initial begin
#5 b = 0; // Imposta b a 0 al tempo 5 (durante il ritardo)
end- Al tempo 0:
a1leggeb = 1 - Al tempo 5:
bcambia in0(mentrea1è ancora in attesa) - Al tempo 10: a
a1viene assegnato1(il valore letto al tempo 0), non0
Con un ritardo generale #10 a2 = b; in un blocco separato, b verrebbe letto al tempo 10 (valore 0).
Regole importanti
| Regola | Spiegazione |
|---|---|
= va prima di # | a = #10 b; e non a #10 = b; |
| Il valore viene letto immediatamente | Il lato destro viene valutato subito |
| L’assegnazione avviene dopo un ritardo | Il lato sinistro riceve il valore in seguito |
| Solo per blocchi procedurali | Usato in initial o always |
Sfida
Cosa fare:
Aggiungi il ritardo di assegnazione mancante in modo che a riceva il valore di b dopo 15 unità di tempo, ma legga b immediatamente.
Provalo tu
module assignment_challenge;
reg a, b;
// Blocco separato per modificare b durante il ritardo
initial begin
b = 1;
// TODO: Aggiungere un ritardo all'assegnazione
// a dovrebbe ricevere b dopo 15 unità di tempo
// Leggere b ora, assegnarlo dopo il ritardo
end
initial begin
#5 b = 0; // Modifica b durante il ritardo
#20 $display("Time %0t: a = %b", $time, a);
$finish;
end
endmoduleQuesta lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Fondamenti
1Introduzione
Cos'è VerilogHardware e software a confrontoIl tuo primo moduloCommentiLivelli di astrazione della progettazione4Operatori - Parte 1
Operatori aritmeticiOperatore moduloOperatori di confrontoRiepilogo - Matematica sempliceOperatori bitwise7Assegnazioni e porte
Assegnazione continuaAssegnazioni con operatoriPrimitive di porte integratePorte AND, OR e NOTPorte XOR e XNORRiepilogo: circuito con porte logiche10Decisioni
Istruzione ifIf-ElseRiepilogo - Comparatore sempliceIstruzione caseCasex e casezRiepilogo - Progettazione di una ALU13Tempi e ritardi
Cosa sono i ritardiRitardi nei gateRitardi nelle assegnazioniDirettiva timescaleGenerazione del clockRiepilogo - Controllo dei tempi5Operatori Parte 2
Operatori logiciOperatori di riduzioneOperatori di scorrimentoOperatore di concatenazioneOperatore condizionaleRiepilogo - Sfida sugli operatori3Sistema numerico
Rappresentazione binariaNumeri con dimensione specificataNumeri senza dimensione specificataNumeri negativiValori speciali X e ZRiepilogo - Formati numerici6Moduli
Struttura di un moduloPorte di input e outputPorte InoutIstanziazione di un moduloMappatura delle porte per nomeMappatura delle porte per ordineRiepilogo - Costruire un modulo9Blocchi procedurali
Blocco alwaysBlocco initialLista di sensibilitàAssegnazione bloccanteAssegnazione non bloccanteRiepilogo: always vs initial12Progetto Multiplexer
Progettazione di un mux da 2 a 1Progettazione di un mux da 4 a 1Esercitati da solo: Compilatore Verilog online