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ögerung | Zuweisungsverzö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 Moment | Wert von b zum Zeitpunkt 0 (oder Lesezeitpunkt) |
| Wann wird der Wert zugewiesen? | Nach der Verzögerung | Nach 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
endBeide 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:
a1liestb = 1 - Zum Zeitpunkt 5:
bändert sich zu0(währenda1noch wartet) - Zum Zeitpunkt 10:
a1wird der Wert1zugewiesen (der zum Zeitpunkt 0 gelesene Wert), nicht0
Mit einer allgemeinen Verzögerung #10 a2 = b; in einem separaten Block würde b zum Zeitpunkt 10 gelesen werden (Wert 0).
Wichtige Regeln
| Regel | Erklärung |
|---|---|
= steht vor # | a = #10 b; nicht a #10 = b; |
| Wert wird sofort gelesen | Rechte Seite wird sofort ausgewertet |
| Zuweisung erfolgt nach Verzögerung | Linke Seite erhält den Wert später |
| Nur für prozedurale Blöcke | Wird in initial oder always verwendet |
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 gelesen | Nach der Verzögerung | Sofort |
| Wert zugewiesen | Nach der Verzögerung | Nach 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
endNur 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
endmoduleDiese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Grundlagen
1Einführung
Was ist VerilogHardware vs. SoftwareAbstraktionsebenen im DesignDein erstes ModulKommentare4Operatoren Teil 1
Arithmetische OperatorenModulo-OperatorVergleichsoperatorenWiederholung – Einfache MathematikBitweise Operatoren7Zuweisung und Gatter
Kontinuierliche ZuweisungZuweisung mit OperatorenIntegrierte Gatter-PrimitiveAND OR NOT GatterXOR XNOR GatterZusammenfassung - Logikgatterschaltung10Entscheidungsfindung
If-AnweisungIf - ElseWiederholung - Einfacher KomparatorCase-AnweisungCasex und CasezWiederholung - ALU-Design13Timing und Verzögerungen
Was sind VerzögerungenGatter-VerzögerungenZuweisungsverzögerungenTimescale-DirektiveTakterzeugungZusammenfassung – Timing-Steuerung5Operatoren Teil 2
Logische OperatorenReduktionsoperatorenShift-OperatorenVerkettungsoperatorBedingter OperatorZusammenfassung – Operator-Challenge11Schleifen
For-SchleifeWhile-SchleifeRepeat-SchleifeEndlosschleifeDisable-AnweisungRückblick – Schleifenmuster3Zahlensystem
Binäre DarstellungZahlen mit GrößenangabeZahlen ohne GrößenangabeNegative ZahlenSpezialwerte X und ZZusammenfassung – Zahlenformate6Module
ModulstrukturEingangs- und Ausgangs-PortsInout-PortsModul-InstanziierungPort-Mapping nach NamePort-Mapping nach ReihenfolgeZusammenfassung – Ein Modul erstellen