Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Industrial programming >> Verilog

Échelle de temps Verilog

La simulation Verilog dépend de la façon dont le temps est défini car le simulateur doit savoir ce que signifie un #1 en termes de temps. Le `timescale La directive du compilateur spécifie l'unité de temps et la précision des modules qui la suivent.

Syntaxe

  
  
`timescale <time_unit>/<time_precision>

// Example
`timescale 1ns/1ps
`timescale 10us/100ns
`timescale 10ns/1ns

  

L'unité_de_temps est la mesure des retards et du temps de simulation tandis que time_precision spécifie comment les valeurs de retard sont arrondies avant d'être utilisées dans la simulation.

Utilisez les constructions d'échelle de temps suivantes pour utiliser différentes unités de temps dans la même conception. N'oubliez pas que les spécifications de retard dans la conception ne sont pas synthétisables et ne peuvent pas être converties en logique matérielle.

Caractère Unité
s secondes
ms millisecondes
nous microsecondes
ns nanosecondes
ps picosecondes
fs femtosecondes

Les nombres entiers dans ces spécifications peuvent être 1, 10 ou 100 et la chaîne de caractères qui spécifie l'unité peut prendre n'importe quelle valeur mentionnée dans le tableau ci-dessus.

Exemple #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

  

La première instruction de retard utilise #1 qui fait attendre le simulateur exactement 1 unité de temps qui est spécifiée comme étant 1ns avec `timescale directif. L'instruction de délai esecond utilise 0,49, ce qui correspond à moins d'une demi-unité de temps. Cependant, la précision temporelle est spécifiée comme étant de 1 ns et, par conséquent, le simulateur ne peut pas être inférieur à 1 ns, ce qui lui permet d'arrondir l'instruction de retard donnée et donne 0 ns. Ainsi, le deuxième retard ne parvient pas à faire avancer le temps de simulation.

La troisième instruction de retard utilise exactement la moitié de l'unité de temps [hl]#0.5[/lh] et encore une fois le simulateur arrondira la valeur pour obtenir #1 qui représente une unité de temps entière. Donc, cela est imprimé à T=2ns.

La quatrième instruction de retard utilise une valeur supérieure à la moitié de l'unité de temps et est également arrondie, ce qui permet d'imprimer l'instruction d'affichage à T=3ns.

Journal de simulation
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.

La simulation dure 8 ns comme prévu, mais notez que la forme d'onde n'a pas de divisions plus petites entre chaque nanoseconde. En effet, la précision du temps est la même que l'unité de temps.

Exemple #2 :10ns/1ns

Le seul changement apporté dans cet exemple par rapport au précédent est que l'échelle de temps est passée de 1ns/1ns à 10ns/1ns. L'unité de temps est donc 10ns et la précision est de 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

  

Le temps de simulation réel est obtenu en multipliant le délai spécifié à l'aide de # avec l'unité de temps, puis il est arrondi en fonction de la précision. La première instruction de retard donnera alors 10ns et la seconde donnera 14,9 qui sera arrondi pour devenir 15ns.

La troisième instruction ajoute de la même manière 5ns (0,5 * 10ns) et le temps total devient 20ns. Le quatrième ajoute 5ns supplémentaires (0,51 * 10) pour faire avancer le temps total à 25ns.

Journal de simulation
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.

Notez que l'unité de base dans la forme d'onde est en dizaines de nanosecondes avec une précision de 1ns.

Exemple 3 :1ns/1ps

Le seul changement apporté dans cet exemple par rapport au précédent est que l'échelle de temps est passée de 1ns/1ns à 1ns/1ps. L'unité de temps est donc 1ns et la précision est de 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

  

Vérifiez que les unités de temps sont mises à l'échelle pour correspondre à la nouvelle valeur de précision de 1ps. Notez également que le temps est représenté dans la plus petite résolution qui, dans ce cas, est la picoseconde.

Journal de simulation
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. Tutoriel Verilog
  2. Concaténation Verilog
  3. Affectations Verilog
  4. Verilog bloquant et non bloquant
  5. Fonctions Verilog
  6. Tâche Verilog
  7. Sémantique de planification Verilog
  8. Générateur d'horloge Verilog
  9. Fonctions mathématiques Verilog