Escala de tempo Verilog
A simulação Verilog depende de como o tempo é definido, pois o simulador precisa saber o que significa #1 em termos de tempo. O
`timescale
A diretiva do compilador especifica a unidade de tempo e a precisão dos módulos que a seguem. Sintaxe
`timescale <time_unit>/<time_precision>
// Example
`timescale 1ns/1ps
`timescale 10us/100ns
`timescale 10ns/1ns
A unidade_tempo é a medição de atrasos e tempo de simulação enquanto o time_precision especifica como os valores de atraso são arredondados antes de serem usados na simulação.
Use as seguintes construções de escala de tempo para usar diferentes unidades de tempo no mesmo design. Lembre-se de que as especificações de atraso no projeto não são sintetizáveis e não podem ser convertidas em lógica de hardware.
`timescale
para unidade básica de medida e precisão de tempo- Tarefa do sistema $printtimescale para exibir a unidade de tempo e a precisão
$time
e$realtime
as funções do sistema retornam a hora atual e o formato de relatório padrão pode ser alterado com outra tarefa do sistema$timeformat
.
Personagem | Unidade |
---|---|
s | segundos |
ms | milissegundos |
nós | microssegundos |
ns | nanossegundos |
ps | picossegundos |
fs | femtossegundos |
Os inteiros nestas especificações podem ser 1, 10 ou 100 e a cadeia de caracteres que especifica a unidade pode assumir qualquer valor mencionado na tabela acima.
Exemplo nº 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
A primeira instrução de atraso usa #1 que faz o simulador esperar exatamente 1 unidade de tempo que é especificada como 1ns com
`timescale
diretiva. A instrução de atraso esecond usa 0,49, que é menos de meia unidade de tempo. No entanto, a precisão de tempo é especificada para ser 1ns e, portanto, o simulador não pode ser menor que 1 ns, o que faz com que ele arredonde a declaração de atraso fornecida e produza 0ns. Assim, o segundo atraso não adianta o tempo de simulação. A terceira instrução de atraso usa exatamente metade da unidade de tempo [hl]#0.5[/lh] e novamente o simulador arredondará o valor para obter #1 que representa uma unidade de tempo inteira. Então isso é impresso em T=2ns.
A quarta instrução de atraso usa um valor maior que a metade da unidade de tempo e é arredondada, fazendo com que a instrução de exibição seja impressa em T=3ns.
Registro de simulação
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.
A simulação é executada por 8 ns como esperado, mas observe que a forma de onda não possui divisões menores entre cada nanossegundo. Isso ocorre porque a precisão do tempo é a mesma que a unidade de tempo.
Exemplo nº 2:10ns/1ns
O somente A mudança feita neste exemplo em relação ao anterior é que a escala de tempo foi alterada de 1ns/1ns para 10ns/1ns. Portanto, a unidade de tempo é 10ns e a precisão é 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
O tempo real de simulação é obtido multiplicando o atraso especificado usando
#
com a unidade de tempo e, em seguida, é arredondado com base na precisão. A primeira instrução de atraso produzirá 10 ns e a segunda fornecerá 14,9, que será arredondado para se tornar 15 ns. A terceira instrução da mesma forma adiciona 5ns (0,5 * 10ns) e o tempo total se torna 20ns. O quarto adiciona outros 5ns (0,51 * 10) para avançar o tempo total para 25ns.
Registro de simulação
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.
Observe que a unidade básica na forma de onda está em dezenas de nanossegundos com uma precisão de 1ns.
Exemplo nº 3:1ns/1ps
O somente A mudança feita neste exemplo em relação ao anterior é que a escala de tempo foi alterada de 1ns/1ns para 1ns/1ps. Portanto, a unidade de tempo é 1ns e a precisão é 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
Veja que as unidades de tempo foram dimensionadas para corresponder ao novo valor de precisão de 1ps. Observe também que o tempo é representado na menor resolução que, neste caso, é de picossegundos.
Registro de simulação
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