Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Industrial programming >> Verilog

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.

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

  1. Domine o Verilog: Tutorial Completo para Projeto de Circuitos Digitais
  2. Dominando Concatenação Verilog: Guia Prático
  3. Entendendo Atribuições em Verilog: Tipos, Sintaxe e Boas Práticas
  4. Verilog Blocking vs Non-Blocking: Diferenças Essenciais Explicadas
  5. Dominando Funções em Verilog para Design RTL Eficiente
  6. Entendendo Tasks em Verilog: Funções vs Tasks, Sintaxe e Uso
  7. Entendendo Semântica de Escalonamento em Verilog: Timing, Eventos e Ordem de Execução
  8. Gerador de Clock Verilog: Guia de Design e Implementação
  9. Dominando Funções Matemáticas do Verilog para Design de Hardware Eficiente
  10. Dominando $timeformat do Verilog: Precisão e Controle de Exibição