Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Industrial programming >> Verilog

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.

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.

Simulationsprotokoll
ncsim> 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.

Simulationsprotokoll
ncsim> 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.

Simulationsprotokoll
ncsim> 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

  1. Verilog-Tutorial
  2. Verilog-Verkettung
  3. Verilog-Aufgaben
  4. Verilog-Blockierung und Nicht-Blockierung
  5. Verilog-Funktionen
  6. Verilog-Aufgabe
  7. Verilog Scheduling Semantik
  8. Verilog-Taktgenerator
  9. Verilog Math-Funktionen
  10. Verilog-Zeitformat