Verilog-Zeitskala
Die Verilog-Simulation hängt davon ab, wie Zeit definiert ist, da der Simulator wissen muss, was eine Nummer 1 in Bezug auf Zeit bedeutet. Der `timescale
Die Compiler-Direktive gibt die Zeiteinheit und Genauigkeit für die darauf folgenden Module an.
Syntax
`timescale <time_unit>/<time_precision>
// Example
`timescale 1ns/1ps
`timescale 10us/100ns
`timescale 10ns/1ns
Die time_unit ist die Messung von Verzögerungen und Simulationszeit, während die time_precision gibt an, wie Verzögerungswerte gerundet werden, bevor sie in der Simulation verwendet werden.
Verwenden Sie die folgenden Zeitskalenkonstrukte, um verschiedene Zeiteinheiten im selben Design zu verwenden. Denken Sie daran, dass Verzögerungsspezifikationen im Design nicht synthetisierbar sind und nicht in Hardwarelogik umgewandelt werden können.
`timescale
für Basismaßeinheit und Zeitgenauigkeit- $printtimescale-Systemtask zur Anzeige von Zeiteinheit und Genauigkeit
$time
und$realtime
Systemfunktionen geben die aktuelle Zeit zurück und das Standardberichtsformat kann mit einem anderen Systemtask$timeformat
geändert werden .
Zeichen | Einheit |
---|---|
s | Sekunden |
ms | Millisekunden |
uns | Mikrosekunden |
ns | Nanosekunden |
ps | Pikosekunden |
fs | Femtosekunden |
Die Ganzzahlen in diesen Spezifikationen können entweder 1, 10 oder 100 sein, und die Zeichenfolge, die die Einheit angibt, kann jeden in der obigen Tabelle aufgeführten Wert annehmen.
Beispiel Nr. 1:1ns/1ns
// Declare the timescale where time_unit is 1ns
// and time_precision is also 1ns
`timescale 1ns/1ns
module tb;
// To understand the effect of timescale, let us
// drive a signal with some values after some delay
reg val;
initial begin
// Initialize the signal to 0 at time 0 units
val <= 0;
// Advance by 1 time unit, display a message and toggle val
#1 $display ("T=%0t At time #1", $realtime);
val <= 1;
// Advance by 0.49 time unit and toggle val
#0.49 $display ("T=%0t At time #0.49", $realtime);
val <= 0;
// Advance by 0.50 time unit and toggle val
#0.50 $display ("T=%0t At time #0.50", $realtime);
val <= 1;
// Advance by 0.51 time unit and toggle val
#0.51 $display ("T=%0t At time #0.51", $realtime);
val <= 0;
// Let simulation run for another 5 time units and exit
#5 $display ("T=%0t End of simulation", $realtime);
end
endmodule
Die erste Verzögerungsanweisung verwendet #1, wodurch der Simulator genau 1 Zeiteinheit wartet, die mit `timescale
auf 1 ns festgelegt wird Richtlinie. Die Esecond-Delay-Anweisung verwendet 0,49, was weniger als eine halbe Zeiteinheit ist. Die Zeitgenauigkeit ist jedoch auf 1 ns festgelegt, und daher kann der Simulator nicht kleiner als 1 ns werden, wodurch die angegebene Verzögerungsangabe gerundet wird und 0 ns ergibt. Die zweite Verzögerung kann also die Simulationszeit nicht vorrücken.
Die dritte Verzögerungsanweisung verwendet genau die Hälfte der Zeiteinheit [hl]#0.5[/lh] und wieder rundet der Simulator den Wert, um #1 zu erhalten, was eine ganze Zeiteinheit darstellt. Das wird also bei T=2ns gedruckt.
Die vierte Verzögerungsangabe verwendet einen Wert, der mehr als die Hälfte der Zeiteinheit beträgt, und wird ebenfalls gerundet, sodass die Anzeigeanweisung bei T=3ns ausgegeben wird.
Simulationsprotokollncsim> run T=1 At time #1 T=1 At time #0.49 T=2 At time #0.50 T=3 At time #0.51 T=8 End of simulation ncsim: *W,RNQUIE: Simulation is complete.
Die Simulation läuft wie erwartet 8 ns lang, aber beachten Sie, dass die Wellenform keine kleineren Unterteilungen zwischen den einzelnen Nanosekunden aufweist. Dies liegt daran, dass die Genauigkeit der Zeit dieselbe ist wie die Zeiteinheit.
Beispiel #2:10ns/1ns
Die nur Die Änderung in diesem Beispiel im Vergleich zum vorherigen besteht darin, dass die Zeitskala von 1ns/1ns auf 10ns/1ns geändert wurde. Die Zeiteinheit ist also 10ns und die Genauigkeit liegt bei 1ns.
// Declare the timescale where time_unit is 10ns
// and time_precision is 1ns
`timescale 10ns/1ns
// NOTE: Testbench is the same as in previous example
module tb;
// To understand the effect of timescale, let us
// drive a signal with some values after some delay
reg val;
initial begin
// Initialize the signal to 0 at time 0 units
val <= 0;
// Advance by 1 time unit, display a message and toggle val
#1 $display ("T=%0t At time #1", $realtime);
val <= 1;
// Advance by 0.49 time unit and toggle val
#0.49 $display ("T=%0t At time #0.49", $realtime);
val <= 0;
// Advance by 0.50 time unit and toggle val
#0.50 $display ("T=%0t At time #0.50", $realtime);
val <= 1;
// Advance by 0.51 time unit and toggle val
#0.51 $display ("T=%0t At time #0.51", $realtime);
val <= 0;
// Let simulation run for another 5 time units and exit
#5 $display ("T=%0t End of simulation", $realtime);
end
endmodule
Die tatsächliche Simulationszeit ergibt sich aus der Multiplikation der mit #
angegebenen Verzögerung mit der Zeiteinheit und wird dann nach Genauigkeit gerundet. Die erste Verzögerungsangabe ergibt dann 10 ns und die zweite 14,9, was auf 15 ns gerundet wird.
Die dritte Anweisung fügt in ähnlicher Weise 5 ns (0,5 * 10 ns) hinzu und die Gesamtzeit wird 20 ns. Der vierte fügt weitere 5 ns (0,51 * 10) hinzu, um die Gesamtzeit auf 25 ns zu erhöhen.
Simulationsprotokollncsim> run T=10 At time #1 T=15 At time #0.49 T=20 At time #0.50 T=25 At time #0.51 T=75 End of simulation ncsim: *W,RNQUIE: Simulation is complete.
Beachten Sie, dass die Basiseinheit der Wellenform in zehn Nanosekunden mit einer Genauigkeit von 1 ns liegt.
Beispiel #3:1ns/1ps
Die nur Die Änderung in diesem Beispiel im Vergleich zum vorherigen besteht darin, dass die Zeitskala von 1 ns/1 ns auf 1 ns/1 ps geändert wurde. Die Zeiteinheit ist also 1 ns und die Genauigkeit 1 ps.
// Declare the timescale where time_unit is 1ns
// and time_precision is 1ps
`timescale 1ns/1ps
// NOTE: Testbench is the same as in previous example
module tb;
// To understand the effect of timescale, let us
// drive a signal with some values after some delay
reg val;
initial begin
// Initialize the signal to 0 at time 0 units
val <= 0;
// Advance by 1 time unit, display a message and toggle val
#1 $display ("T=%0t At time #1", $realtime);
val <= 1;
// Advance by 0.49 time unit and toggle val
#0.49 $display ("T=%0t At time #0.49", $realtime);
val <= 0;
// Advance by 0.50 time unit and toggle val
#0.50 $display ("T=%0t At time #0.50", $realtime);
val <= 1;
// Advance by 0.51 time unit and toggle val
#0.51 $display ("T=%0t At time #0.51", $realtime);
val <= 0;
// Let simulation run for another 5 time units and exit
#5 $display ("T=%0t End of simulation", $realtime);
end
endmodule
Beachten Sie, dass die Zeiteinheiten so skaliert sind, dass sie dem neuen Genauigkeitswert von 1 ps entsprechen. Beachten Sie auch, dass die Zeit in der kleinsten Auflösung dargestellt wird, die in diesem Fall Pikosekunden ist.
Simulationsprotokollncsim> run T=1000 At time #1 T=1490 At time #0.49 T=1990 At time #0.50 T=2500 At time #0.51 T=7500 End of simulation ncsim: *W,RNQUIE: Simulation is complete.
Verilog