Menu
Coddy logo textTech

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, quindi 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 e poi assegnazione), un ritardo di assegnazione a = #10 b; prende il valore di b in quel momento, attende 10 unità di tempo e poi lo assegna a a.

Ritardo dell'assegnazione vs ritardo generale

 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</code al tempo 0 (o al momento della lettura)</td></tr><tr><td><strong>Quando viene assegnato il valore?</strong></td><td>Dopo il ritardo</td><td>Dopo il ritardo</td></tr></tbody></table></figure><h3>Esempio: la differenza</h3><pre><code class="language-verilog">initial begin b = 1; #5 b = 0; // Ritardo generale #10 a1 = b; // Attende 10, poi legge b (b=0) → a1=0 // Ritardo dell'assegnazione a2 = #10 b; // Legge b ora (b=0), attende 10, poi assegna → a2=0 end

Entrambi danno lo stesso risultato qui. La differenza si nota quando b cambia durante il ritardo.

Esempio di differenza chiave

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;       // Modifica 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 sta ancora aspettando)
  • 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; 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, assegnare 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