Gate Delays in Verilog verstehen: Genaues Timing für zuverlässige Digitaldesigns
Digitale Elemente sind binäre Entitäten und können nur einen von zwei Werten halten: 0 und 1. Der Übergang von 0 zu 1 und 1 zu 0 hat jedoch eine Übergangszögerung, und so hat jedes Gatterelement eine Verzögerung, um den Wert vom Eingang zu seinem Ausgang zu propagieren.
Zum Beispiel muss ein Zwei-Eingang-UND-Gatter den Ausgang auf 1 schalten, wenn beide Eingänge 1 werden, und zurück auf 0, wenn einer seiner Eingänge 0 wird. Diese Gatter- und Pin-zu-Pin-Delays können in Verilog bei der Instanziierung von Logik-Primitives spezifiziert werden.
Rise-, Fall- und Turn-Off-Delays
Diese Delays sind tatsächlich auf jedes Signal anwendbar, da sie alle in echten Schaltungen jederzeit steigen oder fallen können und nicht nur auf Ausgänge von Gattern beschränkt sind. Es gibt drei Möglichkeiten, Gate-Delays darzustellen, und das Zwei-Delay-Format kann auf die meisten Primitives angewendet werden, deren Ausgänge nicht in High-Impedanz übergehen. Wie ein Drei-Delay-Format nicht auf ein AND-Gatter angewendet werden kann, weil der Ausgang für keine Eingangskombination auf Z geht.
// Einzelner Delay spezifiziert - wird für alle drei Übergangstypen verwendet
or #(<delay>) o1 (out, a, b);
// Zwei Delays spezifiziert - für Rise- und Fall-Übergänge verwendet
or #(<rise>, <fall>) o1 (out, a, b);
// Drei Delays spezifiziert - für Rise, Fall und Turn-Off-Übergänge verwendet
or #(<rise>, <fall>, <turn_off>) o1 (out, a, b);
Wenn nur ein einzelner Delay spezifiziert ist, verwenden alle drei Delay-Typen denselben gegebenen Wert. Wenn zwei Delays spezifiziert sind, stellt der erste den Rise- und der zweite den Fall-Delay dar. Wenn drei Delays spezifiziert sind, stellen sie Rise-, Fall- und Turn-Off-Delays jeweils dar.
Ein-Delay-Format
module des (
input a, b,
output out1, out2
);
// AND-Gatter hat 2 Zeiteinheiten Gate-Delay
and #(2) o1 (out1, a, b);
// BUFIF0-Gatter hat 3 Zeiteinheiten Gate-Delay
bufif0 #(3) b1 (out2, a, b);
endmodule
module tb;
reg a, b;
wire out1, out2;
des d0 (.out1(out1), .out2(out2), .a(a), .b(b));
initial begin
{a, b} <= 0;
$monitor ("T=%0t a=%0b b=%0b and=%0b bufif0=%0b", $time, a, b, out1, out2);
#10 a <= 1;
#10 b <= 1;
#10 a <= 0;
#10 b <= 0;
end
endmodule
Man sieht, dass der Ausgang der AND-Gatter 2 Zeiteinheiten nach der Änderung eines seiner Eingänge wechselt. Zum Beispiel wird b 1, während a bereits 1 ist bei T=20. Aber der Ausgang wird erst bei T=22 zu 1. Ebenso geht a bei T=30 zurück auf Null und der Ausgang erhält den neuen Wert bei T=32.
Gate-Delay ist als 3 Zeiteinheiten für BUFIF0 spezifiziert, und deshalb dauert es 3 Zeiteinheiten, bis der Ausgang aktualisiert wird, wenn b sich von 0 auf 1 ändert, während a bereits bei 1 ist, und schließlich tut er dies bei T=23.
Simulationslog:
ncsim> run T=0 a=0 b=0 and=x bufif0=x T=2 a=0 b=0 and=0 bufif0=x T=3 a=0 b=0 and=0 bufif0=0 T=10 a=1 b=0 and=0 bufif0=0 T=13 a=1 b=0 and=0 bufif0=1 T=20 a=1 b=1 and=0 bufif0=1 T=22 a=1 b=1 and=1 bufif0=1 T=23 a=1 b=1 and=1 bufif0=z T=30 a=0 b=1 and=1 bufif0=z T=32 a=0 b=1 and=0 bufif0=z T=40 a=0 b=0 and=0 bufif0=z T=43 a=0 b=0 and=0 bufif0=0 ncsim: *W,RNQUIE: Simulation is complete.
Zwei-Delay-Format
Wenden wir denselben Testbench wie oben auf ein anderes Verilog-Modell an, bei dem Rise- und Fall-Delays explizit erwähnt sind.
module des (
input a, b,
output out1, out2
);
and #(2, 3) o1 (out1, a, b);
bufif0 #(4, 5) b1 (out2, a, b);
endmodule
Simulationslog:
ncsim> run T=0 a=0 b=0 and=x bufif0=x T=3 a=0 b=0 and=0 bufif0=x T=5 a=0 b=0 and=0 bufif0=0 T=10 a=1 b=0 and=0 bufif0=0 T=14 a=1 b=0 and=0 bufif0=1 T=20 a=1 b=1 and=0 bufif0=1 T=22 a=1 b=1 and=1 bufif0=1 T=24 a=1 b=1 and=1 bufif0=z T=30 a=0 b=1 and=1 bufif0=z T=33 a=0 b=1 and=0 bufif0=z T=40 a=0 b=0 and=0 bufif0=z T=45 a=0 b=0 and=0 bufif0=0 ncsim: *W,RNQUIE: Simulation is complete.
Drei-Delay-Format
module des (
input a, b,
output out1, out2
);
and #(2, 3) o1 (out1, a, b);
bufif0 #(5, 6, 7) b1 (out2, a, b);
endmodule
Simulationslog:
ncsim> run T=0 a=0 b=0 and=x bufif0=x T=3 a=0 b=0 and=0 bufif0=x T=6 a=0 b=0 and=0 bufif0=0 T=10 a=1 b=0 and=0 bufif0=0 T=15 a=1 b=0 and=0 bufif0=1 T=20 a=1 b=1 and=0 bufif0=1 T=22 a=1 b=1 and=1 bufif0=1 T=27 a=1 b=1 and=1 bufif0=z T=30 a=0 b=1 and=1 bufif0=z T=33 a=0 b=1 and=0 bufif0=z T=40 a=0 b=0 and=0 bufif0=z T=46 a=0 b=0 and=0 bufif0=0 ncsim: *W,RNQUIE: Simulation is complete.
Min/Typ/Max Delays
Delays sind nicht in verschiedenen Teilen des gefertigten Chips gleich, noch sind sie bei unterschiedlichen Temperaturen und anderen Variationen gleich. Deshalb bietet Verilog auch eine zusätzliche Kontrollebene für jeden der oben genannten Delay-Typen. Jedes digitale Gatter und jede Transistor-Zelle hat einen minimalen, typischen und maximalen Delay, der basierend auf dem Prozessknoten spezifiziert ist und typischerweise von Bibliotheken der Fertigungs-Foundry bereitgestellt wird.
Für jeden Delay-Typ – Rise, Fall und Turn-Off – können drei Werte min, typ und max spezifiziert werden, die für minimale, typische und maximale Delays stehen.
module des (
input a, b,
output out1, out2
);
and #(2:3:4, 3:4:5) o1 (out1, a, b);
bufif0 #(5:6:7, 6:7:8, 7:8:9) b1 (out2, a, b);
endmodule
Simulationslog:
ncsim> run T=0 a=0 b=0 and=x bufif0=x T=4 a=0 b=0 and=0 bufif0=x T=7 a=0 b=0 and=0 bufif0=0 T=10 a=1 b=0 and=0 bufif0=0 T=16 a=1 b=0 and=0 bufif0=1 T=20 a=1 b=1 and=0 bufif0=1 T=23 a=1 b=1 and=1 bufif0=1 T=28 a=1 b=1 and=1 bufif0=z T=30 a=0 b=1 and=1 bufif0=z T=34 a=0 b=1 and=0 bufif0=z T=40 a=0 b=0 and=0 bufif0=z T=47 a=0 b=0 and=0 bufif0=0 ncsim: *W,RNQUIE: Simulation is complete.
Verilog
- 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 Delay Control verstehen: Timing-Techniken und Best Practices
- Inter- und Intra-Assignment Delays in Verilog verstehen
- Gate-Level Modeling: Vom Hardware-Schaltplan zum Verilog-Code
- Praktisches Verilog Gate-Level Design: AND, OR, NOT Gatter & 2x1 Multiplexer
- Verilog Clock Generator: Design & Implementierungsleitfaden
- Verilog Math Functions meistern für effizientes Hardware-Design