Inter- und Intra-Assignment Delays in Verilog verstehen
Verilog-Delay-Anweisungen können Delays entweder auf der linken oder der rechten Seite des Zuweisungsoperators haben.
Inter-Assignment Delays
// Delay ist auf der linken Seite spezifiziert
#<delay> <LHS> = <RHS>
Ein Inter-Assignment-Delay-Statement hat den Delay-Wert auf der LHS des Zuweisungsoperators. Dies bedeutet, dass die Anweisung selbst nach Ablauf des Delays ausgeführt wird, und ist die am häufigsten verwendete Form der Delay-Kontrolle.
module tb;
reg a, b, c, q;
initial begin
$monitor("[%0t] a=%0b b=%0b c=%0b q=%0b", $time, a, b, c, q);
// Alle Signale zur Zeit 0 auf 0 initialisieren
a <= 0; b <= 0; c <= 0; q <= 0;
// Inter-Assignment Delay: Warten für #5 Zeiteinheiten
// und dann a und c auf 1 zuweisen. Beachten Sie, dass 'a' und 'c'
// am Ende des aktuellen Timesteps aktualisiert werden
#5 a <= 1; c <= 1;
// Inter-Assignment Delay: Warten für #5 Zeiteinheiten
// und dann 'q' mit dem Wert zuweisen, zu dem RHS ausgewertet wird
#5 q <= a & b | c;
#20;
end
endmodule
Beachten Sie, dass q zur Zeit 10 Einheiten 1 wird, weil die Anweisung bei 10 Zeiteinheiten ausgewertet wird und die RHS, eine Kombination aus a, b und c, zu 1 ausgewertet wird.
Simulationslog:
xcelium> run [0] a=0 b=0 c=0 q=0 [5] a=1 b=0 c=1 q=0 [10] a=1 b=0 c=1 q=1 xmsim: *W,RNQUIE: Simulation is complete.
Intra-Assignment Delays
// Delay ist auf der rechten Seite spezifiziert
<LHS> = #<delay> <RHS>
Ein Intra-Assignment-Delay ist einer, bei dem ein Delay auf der RHS des Zuweisungsoperators steht. Dies bedeutet, dass die Anweisung zuerst ausgewertet wird und die Werte aller Signale auf der RHS erfasst werden. Dann wird sie dem resultierenden Signal erst nach Ablauf des Delays zugewiesen.
module tb;
reg a, b, c, q;
initial begin
$monitor("[%0t] a=%0b b=%0b c=%0b q=%0b", $time, a, b, c, q);
// Alle Signale zur Zeit 0 auf 0 initialisieren
a <= 0; b <= 0; c <= 0; q <= 0;
// Inter-Assignment Delay: Warten für #5 Zeiteinheiten
// und dann a und c auf 1 zuweisen. Beachten Sie, dass 'a' und 'c'
// am Ende des aktuellen Timesteps aktualisiert werden
#5 a <= 1; c <= 1;
// Intra-Assignment Delay: Zuerst die Anweisung ausführen
// dann 5 Zeiteinheiten warten und dann den ausgewerteten Wert zuweisen
q <= #5 a & b | c;
#20;
end
endmodule
Beachten Sie, dass die Zuweisung an q im Log fehlt!
Simulationslog:
xcelium> run [0] a=0 b=0 c=0 q=0 [5] a=1 b=0 c=1 q=0 xmsim: *W,RNQUIE: Simulation is complete.
Dies liegt daran, dass bei 5 Zeiteinheiten a und c mit Non-Blocking-Anweisungen zugewiesen werden. Und das Verhalten von Non-Blocking-Anweisungen ist so, dass die RHS ausgewertet wird, der Wert der Variable aber erst am Ende jenes Zeitschritts zugewiesen wird.
Der Wert von a und c wird also zu 1 ausgewertet, aber noch nicht zugewiesen, wenn die nächste Non-Blocking-Anweisung, die von q, ausgeführt wird. Wenn also die RHS von q ausgewertet wird, haben a und c noch den alten Wert 0, und deshalb detektiert $monitor keine Änderung, um die Anweisung anzuzeigen.
Um die Änderung zu beobachten, ändern wir die Zuweisungsanweisungen für a und c von Non-Blocking zu Blocking.
...
// Non-Blocking zu Blocking geändert und Rest des
// Codes bleibt gleich
#5 a = 1; c = 1;
q <= #5 a & b | c;
...
Simulationslog:
xcelium> run [0] a=0 b=0 c=0 q=0 [5] a=1 b=0 c=1 q=0 [10] a=1 b=0 c=1 q=1 xmsim: *W,RNQUIE: Simulation is complete.
Verilog
- Verilog Grundlagen: Ihr erstes AND-Gate designen
- Verilog meistern: Komplettes Tutorial für digitales Schaltungsdesign
- Verilog Concatenation meistern: Praktischer Leitfaden
- Verilog Assignments verstehen: Typen, Syntax und Best Practices
- Verilog Blocking vs. Non-Blocking: Wichtige Unterschiede erklärt
- Verilog Functions meistern für effizientes RTL-Design
- Verilog Tasks verstehen: Functions vs. Tasks, Syntax und Verwendung
- Verilog Delay Control verstehen: Timing-Techniken und Best Practices
- Gate Delays in Verilog verstehen: Genaues Timing für zuverlässige Digitaldesigns
- Verilog Clock Generator: Design & Implementierungsleitfaden