Menu
Coddy logo textTech

Zuweisungsverzögerungen

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

In den vorherigen Lektionen haben wir allgemeine Verzögerungen (#10 a = b;) und Gatter-Verzögerungen (and #5 (out, a, b);) behandelt. Jetzt behandeln wir Zuweisungsverzögerungen, das sind Verzögerungen, die innerhalb eines prozeduralen Blocks (wie initial oder always) als Teil einer Zuweisungsanweisung auftreten.

Eine Zuweisungsverzögerung wartet eine bestimmte Zeit ab und führt dann die Zuweisung aus. Die Verzögerung wird nach dem Symbol # und vor der Zuweisung platziert.

Syntax:

variable = #delay expression;

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

Zuweisungsverzögerung vs. Allgemeine Verzögerung

 Allgemeine VerzögerungZuweisungsverzögerung
Syntax#10 a = b;a = #10 b;
Wann wird der Wert gelesen?Zum Zeitpunkt der Zuweisung (nach der Verzögerung)Sofort (vor der Verzögerung)
Welcher Wert wird zugewiesen?Wert von b in diesem MomentWert von b zum Zeitpunkt 0 (oder Lesezeitpunkt)
Wann wird der Wert zugewiesen?Nach der VerzögerungNach der Verzögerung

Beispiel: Der Unterschied

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

Beide liefern hier das gleiche Ergebnis. Der Unterschied zeigt sich, wenn b sich während der Verzögerung ändert.

Beispiel für den Hauptunterschied

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 der Wert 1 zugewiesen (der zum Zeitpunkt 0 gelesene Wert), nicht 0

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

Wichtige Regeln

RegelErklärung
= steht vor #a = #10 b; nicht a #10 = b;
Wert wird sofort gelesenRechte Seite wird sofort ausgewertet
Zuweisung erfolgt nach VerzögerungLinke Seite erhält den Wert später
Nur für prozedurale BlöckeWird in initial oder always verwendet
challenge icon

Aufgabe

Was zu tun ist:

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

Spickzettel

Zuweisungsverzögerung (Assignment delay) liest die rechte Seite sofort aus, wartet die Verzögerung ab und führt dann die Zuweisung aus:

variable = #delay expression;

Hauptunterschied zur allgemeinen Verzögerung:

Allgemeine Verzögerung #10 a = b;Zuweisungsverzögerung a = #10 b;
Wert von b gelesenNach der VerzögerungSofort
Wert zugewiesenNach der VerzögerungNach der Verzögerung

Wenn sich b während der Verzögerung ändert, unterscheiden sich die Ergebnisse:

initial begin
  b = 1;
  a1 = #10 b;   // Liest b=1 jetzt, weist a1=1 zum Zeitpunkt 10 zu
  #5 b = 0;     // b ändert sich zum Zeitpunkt 5 — a1 erhält trotzdem 1
  // Mit #10 a2 = b; → liest b=0 zum Zeitpunkt 10, daher a2=0
end

Nur innerhalb von Prozedurblöcken (initial oder always) gültig.

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