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.
`timescale
para unidad base de medida y precisión de tiempo- Tarea del sistema $printtimescale para mostrar la unidad de tiempo y la precisión
$time
y$realtime
las funciones del sistema devuelven la hora actual y el formato de informe predeterminado se puede cambiar con otra tarea del sistema$timeformat
.
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ónncsim> 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ónncsim> 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ónncsim> 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