Menu
CoddyTech

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 Verzögerungen an Gattern (and #5 (out, a, b);) behandelt. Jetzt behandeln wir Zuweisungsverzögerungen. Dabei handelt es sich um Verzögerungen, die innerhalb eines prozeduralen Blocks (wie initial oder always) als Teil einer Zuweisungsanweisung auftreten.

Eine Zuweisungsverzögerung wartet eine festgelegte Zeit 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ögern, dann zuweisen) übernimmt eine Zuweisungsverzögerung a = #10 b; den Wert von b in diesem Moment, wartet 10 Zeiteinheiten und weist ihn dann a zu.

Allgemeine Verzögerung vs. Zuweisungsverzö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?Der Wert von b zu diesem ZeitpunktDer Wert von b zum Zeitpunkt 0 (oder zum 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 und weist dann zu → a2=0
end

Beide liefern 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 zum Zeitpunkt 5 auf 0 (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
Die Zuweisung erfolgt nach einer VerzögerungDie linke Seite erhält den Wert später
Nur für prozedurale BlöckeVerwendet in initial oder always
challenge icon

Aufgabe

Was zu tun ist:

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

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 soll b nach 15 Zeiteinheiten erhalten
    // b jetzt lesen, nach der 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