Dominando Timescale em Verilog: Unidades, Precisão e Timing Preciso de Simulação
Simulação Verilog depende de como o tempo é definido pois o simulador precisa saber o que #1 significa em termos de tempo. A diretiva de compilador `timescale especifica unidade de tempo e precisão para módulos que a seguem.
Sintaxe
`timescale <unidade_tempo>/<precisao_tempo>
// Exemplos
`timescale 1ns/1ps
`timescale 10us/100ns
`timescale 10ns/1ns
A unidade_tempo é a medida de atrasos e tempo de simulação; a precisao_tempo especifica como valores de atraso são arredondados antes de usados na simulação.
Use os seguintes construtos timescale para usar diferentes unidades de tempo no mesmo design. Lembre-se que especificações de atraso no design não são sintetizáveis e não podem ser convertidas em lógica de hardware.
`timescalepara unidade base de medida e precisão de tempo$printtimescalesystem task para exibir unidade e precisão$timee$realtimesystem functions retornam tempo atual; formato padrão pode ser alterado com$timeformat
| Caractere | Unidade |
|---|---|
| s | segundos |
| ms | milissegundos |
| us | microssegundos |
| ns | nanossegundos |
| ps | picossegundos |
| fs | femtosegundos |
Os inteiros nestas especificações podem ser 1, 10 ou 100 e a string de caractere da unidade pode tomar qualquer valor da tabela acima.
Exemplo #1: 1ns/1ns
// Declara timescale onde unidade_tempo=1ns e precisao=1ns
`timescale 1ns/1ns
module tb;
// Para entender efeito do timescale, aciona sinal com valores após atraso
reg val;
initial begin
// Inicializa sinal em 0 no tempo 0
val <= 0;
// Avança 1 unidade, exibe mensagem e alterna val
#1 $display ("T=%0t At time #1", $realtime); val <= 1;
// Avança 0.49 unidade e alterna val
#0.49 $display ("T=%0t At time #0.49", $realtime); val <= 0;
// Avança 0.50 unidade (metade) e alterna val
#0.50 $display ("T=%0t At time #0.50", $realtime); val <= 1;
// Avança 0.51 unidade e alterna val
#0.51 $display ("T=%0t At time #0.51", $realtime); val <= 0;
// Roda mais 5 unidades e sai
#5 $display ("T=%0t End of simulation", $realtime);
end
endmodule
O primeiro atraso #1 faz simulador esperar exatamente 1 unidade (1ns com `timescale). O segundo usa 0.49 (< metade da unidade). Porém precisão é 1ns, simulador não vai menor que 1ns, arredonda para 0ns. Segundo atraso falha em avançar tempo.
O terceiro usa exatamente metade #0.5 e arredonda para #1 (uma unidade inteira), impresso em T=2ns.
O quarto usa valor > metade e arredonda também, impresso em T=3ns.
Log 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 roda por 8ns como esperado, mas waveform não tem divisões menores entre nanossegundos pois precisão = unidade de tempo.
Exemplo #2: 10ns/1ns
Única mudança: timescale de 1ns/1ns para 10ns/1ns. Unidade=10ns, precisão=1ns.
// Timescale: unidade=10ns, precisão=1ns
`timescale 10ns/1ns
module tb;
reg val;
initial begin
val <= 0;
#1 $display ("T=%0t At time #1", $realtime); val <= 1;
#0.49 $display ("T=%0t At time #0.49", $realtime); val <= 0;
#0.50 $display ("T=%0t At time #0.50", $realtime); val <= 1;
#0.51 $display ("T=%0t At time #0.51", $realtime); val <= 0;
#5 $display ("T=%0t End of simulation", $realtime);
end
endmodule
Tempo real de simulação = atraso especificado com # × unidade de tempo, arredondado pela precisão. Primeiro atraso resulta 10ns; segundo 4.9ns → 15ns (0.49×10=4.9, arredonda para 5, total 15). Terceiro adiciona 5ns (0.5×10), total 20ns. Quarto adiciona 5.1ns → 5ns, total 25ns.
Log 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.
Unidade base no waveform em dezenas de nanossegundos com precisão 1ns.
Exemplo #3: 1ns/1ps
Mudança: timescale de 1ns/1ns para 1ns/1ps. Unidade=1ns, precisão=1ps.
// Timescale: unidade=1ns, precisão=1ps
`timescale 1ns/1ps
module tb;
reg val;
initial begin
val <= 0;
#1 $display ("T=%0t At time #1", $realtime); val <= 1;
#0.49 $display ("T=%0t At time #0.49", $realtime); val <= 0;
#0.50 $display ("T=%0t At time #0.50", $realtime); val <= 1;
#0.51 $display ("T=%0t At time #0.51", $realtime); val <= 0;
#5 $display ("T=%0t End of simulation", $realtime);
end
endmodule
Unidades de tempo escalaram para nova precisão 1ps. Tempo representado na menor resolução (picossegundos).
Log 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
- Domine o Verilog: Tutorial Completo para Projeto de Circuitos Digitais
- Dominando Concatenação Verilog: Guia Prático
- Entendendo Atribuições em Verilog: Tipos, Sintaxe e Boas Práticas
- Verilog Blocking vs Non-Blocking: Diferenças Essenciais Explicadas
- Dominando Funções em Verilog para Design RTL Eficiente
- Entendendo Tasks em Verilog: Funções vs Tasks, Sintaxe e Uso
- Entendendo Semântica de Escalonamento em Verilog: Timing, Eventos e Ordem de Execução
- Gerador de Clock Verilog: Guia de Design e Implementação
- Dominando Funções Matemáticas do Verilog para Design de Hardware Eficiente
- Dominando $timeformat do Verilog: Precisão e Controle de Exibição