Verilog-tijdschaal
Verilog-simulatie hangt af van hoe tijd wordt gedefinieerd, omdat de simulator moet weten wat een # 1 betekent in termen van tijd. De `timescale
compiler-richtlijn specificeert de tijdseenheid en precisie voor de modules die erop volgen.
Syntaxis
`timescale <time_unit>/<time_precision>
// Example
`timescale 1ns/1ps
`timescale 10us/100ns
`timescale 10ns/1ns
De time_unit is de meting van vertragingen en simulatietijd terwijl de time_precision specificeert hoe vertragingswaarden worden afgerond voordat ze in simulatie worden gebruikt.
Gebruik de volgende tijdschaalconstructies om verschillende tijdseenheden in hetzelfde ontwerp te gebruiken. Onthoud dat vertragingsspecificaties in het ontwerp niet synthetisch kunnen worden gemaakt en niet kunnen worden omgezet in hardwarelogica.
`timescale
voor basismeeteenheid en nauwkeurigheid van tijd- $printtimescale systeemtaak om tijdseenheid en precisie weer te geven
$time
en$realtime
systeemfuncties geven de huidige tijd terug en het standaard rapportageformaat kan worden gewijzigd met een andere systeemtaak$timeformat
.
Karakter | Eenheid |
---|---|
s | seconden |
ms | milliseconden |
ons | microseconden |
ns | nanoseconden |
ps | picoseconden |
fs | femtoseconden |
De gehele getallen in deze specificaties kunnen 1, 10 of 100 zijn en de tekenreeks die de eenheid aangeeft, kan elke waarde aannemen die in de bovenstaande tabel wordt vermeld.
Voorbeeld #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
De eerste vertragingsinstructie gebruikt #1 waardoor de simulator precies 1 tijdseenheid wacht die is gespecificeerd als 1ns met `timescale
richtlijn. De eseconde-vertragingsverklaring gebruikt 0,49, wat minder is dan een halve tijdseenheid. De tijdprecisie is echter gespecificeerd als 1ns en daarom kan de simulator niet kleiner worden dan 1 ns, waardoor het de gegeven vertragingsverklaring rondt en 0ns oplevert. Dus de tweede vertraging kan de simulatietijd niet verlengen.
De derde vertragingsopdracht gebruikt precies de helft van de tijdseenheid [hl]#0.5[/lh] en opnieuw rondt de simulator de waarde af om #1 te krijgen, wat een hele tijdseenheid vertegenwoordigt. Dit wordt dus afgedrukt bij T=2ns.
De vierde delay-instructie gebruikt een waarde die meer dan de helft van de tijdseenheid is en wordt ook afgerond, waardoor de display-instructie wordt afgedrukt op T=3ns.
Simulatielogboekncsim> 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.
De simulatie loopt voor 8ns zoals verwacht, maar merk op dat de golfvorm geen kleinere verdelingen heeft tussen elke nanoseconde. Dit komt omdat de precisie van tijd hetzelfde is als de tijdseenheid.
Voorbeeld #2:10ns/1ns
De enige wijziging die in dit voorbeeld is aangebracht in vergelijking met het vorige is dat de tijdschaal is gewijzigd van 1ns/1ns naar 10ns/1ns. Dus de tijdseenheid is 10ns en de precisie is 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
De werkelijke simulatietijd wordt verkregen door de opgegeven vertraging te vermenigvuldigen met #
met de tijdseenheid en vervolgens wordt afgerond op basis van precisie. De eerste vertragingsverklaring levert dan 10ns op en de tweede 14,9 die wordt afgerond op 15ns.
De derde instructie voegt op dezelfde manier 5ns toe (0,5 * 10ns) en de totale tijd wordt 20ns. De vierde voegt nog eens 5ns toe (0,51 * 10) om de totale tijd op 25ns te brengen.
Simulatielogboekncsim> 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.
Merk op dat de basiseenheid in golfvorm in tientallen nanoseconden is met een precisie van 1ns.
Voorbeeld #3:1ns/1ps
De enige wijziging die in dit voorbeeld is aangebracht in vergelijking met het vorige is dat de tijdschaal is gewijzigd van 1ns/1ns naar 1ns/1ps. Dus de tijdseenheid is 1ns en de precisie is 1ps.
// 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
Zie dat de tijdseenheden zijn geschaald om overeen te komen met de nieuwe precisiewaarde van 1ps. Merk ook op dat tijd wordt weergegeven in de kleinste resolutie, in dit geval picoseconden.
Simulatielogboekncsim> 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