Menu
CoddyTech

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 generaleRitardo 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 momentoIl valore di b al tempo 0 (o al momento della lettura)
Quando viene assegnato il valore?Dopo il ritardoDopo 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
end

Qui 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: a1 legge b = 1
  • Al tempo 5: b cambia in 0 (mentre a1 è ancora in attesa)
  • Al tempo 10: a a1 viene assegnato 1 (il valore letto al tempo 0), non 0

Con un ritardo generale #10 a2 = b; in un blocco separato, b verrebbe letto al tempo 10 (valore 0).

Regole importanti

RegolaSpiegazione
= va prima di #a = #10 b; e non a #10 = b;
Il valore viene letto immediatamenteIl lato destro viene valutato subito
L’assegnazione avviene dopo un ritardoIl lato sinistro riceve il valore in seguito
Solo per blocchi proceduraliUsato in initial o always
challenge icon

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
endmodule
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Fondamenti

Esercitati da solo: Compilatore Verilog online