Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Industrial programming >> Verilog

Escala de tiempo de Verilog

La simulación de Verilog depende de cómo se defina el tiempo porque el simulador necesita saber qué significa #1 en términos de tiempo. El `timescale La directiva del compilador especifica la unidad de tiempo y la precisión de los módulos que la siguen.

Sintaxis

  
  
`timescale <time_unit>/<time_precision>

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

  

La unidad_de_tiempo es la medida de los retrasos y el tiempo de simulación mientras que la time_precision especifica cómo se redondean los valores de retardo antes de usarse en la simulación.

Use las siguientes construcciones de escala de tiempo para usar diferentes unidades de tiempo en el mismo diseño. Recuerde que las especificaciones de retardo en el diseño no son sintetizables y no se pueden convertir a lógica de hardware.

Personaje Unidad
s segundos
ms milisegundos
nosotros microsegundos
ns nanosegundos
ps picosegundos
fs femtosegundos

Los números enteros en estas especificaciones pueden ser 1, 10 o 100 y la cadena de caracteres que especifica la unidad puede tomar cualquier valor mencionado en la tabla anterior.

Ejemplo #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 primera declaración de retraso usa #1 que hace que el simulador espere exactamente 1 unidad de tiempo que se especifica que es 1ns con `timescale directiva. La declaración de retraso esegundo usa 0.49 que es menos de la mitad de una unidad de tiempo. Sin embargo, se especifica que la precisión de tiempo es de 1 ns y, por lo tanto, el simulador no puede ser inferior a 1 ns, lo que hace que redondee la declaración de retraso dada y produzca 0 ns. Por lo tanto, el segundo retraso no avanza el tiempo de simulación.

La tercera declaración de retraso usa exactamente la mitad de la unidad de tiempo [hl]#0.5[/lh] y nuevamente el simulador redondeará el valor para obtener el #1 que representa una unidad de tiempo completa. Así que esto se imprime en T=2ns.

La cuarta declaración de retraso usa un valor de más de la mitad de la unidad de tiempo y también se redondea, lo que hace que la declaración de visualización se imprima en T =3 ns.

Registro de simulación
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 simulación se ejecuta durante 8 ns como se esperaba, pero observe que la forma de onda no tiene divisiones más pequeñas entre cada nanosegundo. Esto se debe a que la precisión del tiempo es la misma que la unidad de tiempo.

Ejemplo #2:10ns/1ns

El único El cambio realizado en este ejemplo en comparación con el anterior es que la escala de tiempo se ha cambiado de 1ns/1ns a 10ns/1ns. Entonces, la unidad de tiempo es 10 ns y la precisión es 1 ns.

  
  
// 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

  

El tiempo de simulación real se obtiene multiplicando el retraso especificado usando # con la unidad de tiempo y luego se redondea en base a la precisión. La primera declaración de retraso arrojará 10 ns y la segunda dará 14,9, que se redondea para convertirse en 15 ns.

La tercera declaración agrega de manera similar 5 ns (0,5 * 10 ns) y el tiempo total se convierte en 20 ns. El cuarto agrega otros 5ns (0.51 * 10) para avanzar el tiempo total a 25ns.

Registro de simulación
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.

Tenga en cuenta que la unidad base en forma de onda está en decenas de nanosegundos con una precisión de 1 ns.

Ejemplo #3:1ns/1ps

El único El cambio realizado en este ejemplo en comparación con el anterior es que la escala de tiempo se ha cambiado de 1ns/1ns a 1ns/1ps. Entonces, la unidad de tiempo es 1ns y la precisión es 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

  

Vea que las unidades de tiempo escalaron para coincidir con el nuevo valor de precisión de 1ps. También tenga en cuenta que el tiempo se representa en la resolución más pequeña que en este caso es picosegundos.

Registro de simulación
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. Tutorial de Verilog
  2. Concatenación Verilog
  3. Asignaciones de Verilog
  4. Bloqueo y no bloqueo de Verilog
  5. Funciones de Verilog
  6. Tarea Verilog
  7. Semántica de programación de Verilog
  8. Generador de reloj Verilog
  9. Funciones matemáticas de Verilog
  10. Formato de hora de Verilog
  11. Alcance de la escala de tiempo de Verilog