Menu
Coddy logo textTech

Assignment Delays

Teil des Abschnitts Grundlagen der Verilog-Journey von Coddy. Lektion 69 von 90.

In vorherigen Lektionen haben wir allgemeine Verzögerungen (#10 a = b;) und Gate-Verzögerungen (and #5 (out, a, b);) behandelt. Nun behandeln wir assignment-Verzögerungen, also Verzögerungen, die innerhalb eines prozeduralen block (wie initial oder always) als Teil einer assignment-Anweisung auftreten.

Eine assignment delay wartet eine angegebene Zeit und führt dann die assignment aus. Die delay wird after dem #-Symbol und before der assignment platziert.

Syntax:

variable = #delay expression;

Im Gegensatz zu einer allgemeinen Verzögerung #10 a = b; (verzögern, dann zuweisen) nimmt eine Zuweisungsverzögerung a = #10 b; den Wert von b in diesem Moment, wartet 10 Zeiteinheiten und weist ihn dann a zu.

Assignment Delay gegenüber General Delay

 General DelayAssignment Delay
Syntax#10 a = b;a = #10 b;
Wann wird der Wert gelesen?Zum Zeitpunkt der Zuweisung (nach delay)Sofort (vor delay)
Welcher Wert wird zugewiesen?Wert von b zu diesem ZeitpunktWert von b bei time 0 (oder zur read time)
Wann wird der Wert zugewiesen?Nach delayNach delay

Beispiel: Der Unterschied

initial begin
  b = 1;
  #5 b = 0;
  
  // Allgemeine Verzögerung
  #10 a1 = b;     // Wartet 10, dann liest b (b=0) → a1=0
  
  // Zuweisungsverzögerung
  a2 = #10 b;     // Liest b jetzt (b=0), wartet 10, dann weist zu → a2=0
end

Beide ergeben hier dasselbe Ergebnis. Der Unterschied zeigt sich, wenn sich b während der Verzögerung ändert.

Beispiel für den entscheidenden Unterschied

To show b changing during the delay, we need two separate initial blocks that run in parallel:

initial begin
  b = 1;
  a1 = #10 b;     // Liest b=1 zum Zeitpunkt 0, weist a1=1 zum Zeitpunkt 10 zu
end

initial begin
  #5 b = 0;       // Ändert b auf 0 zum Zeitpunkt 5 (während der Verzögerung)
end
  • Zum Zeitpunkt 0: a1 liest b = 1
  • Zum Zeitpunkt 5: b ändert sich zu 0 (während a1 noch wartet)
  • Zum Zeitpunkt 10: a1 wird 1 zugewiesen (der zum Zeitpunkt 0 gelesene Wert), nicht 0

Bei einer allgemeinen Verzögerung #10 a2 = b; in einem separaten Block würde b zum Zeitpunkt 10 gelesen (Wert 0).

Wichtige Regeln

RegelErklärung
= steht vor #a = #10 b;, nicht a #10 = b;
Der Wert wird sofort gelesenDie rechte Seite wird sofort ausgewertet
Assignment happens after delayDie linke Seite erhält den Wert später
Nur für prozedurale blockWird in initial oder always verwendet
challenge icon

Aufgabe

Was zu tun ist:

Füge die fehlende Zuweisungsverzögerung hinzu, sodass a nach 15 Zeiteinheiten den Wert von b erhält, aber b sofort liest.

Probier es selbst

module assignment_challenge;
  reg a, b;
  
  // Separater Block, um b während der Verzögerung zu ändern
  initial begin
    b = 1;
    // TODO: Zuweisungsverzögerung hinzufügen
    // a sollte b nach 15 Zeiteinheiten erhalten
    // b jetzt lesen, nach Verzögerung zuweisen

  end
  
  initial begin
    #5 b = 0;      // Ändert b während der Verzögerung
    #20 $display("Time %0t: a = %b", $time, a);
    $finish;
  end
endmodule
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Grundlagen

Übe selbstständig: Online-Verilog-Compiler