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

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

  1. Tutorial Verilog
  2. Concatenação Verilog
  3. Atribuições Verilog
  4. Verilog Blocking &Non-Blocking
  5. Funções Verilog
  6. Tarefa Verilog
  7. Semântica de agendamento Verilog
  8. Gerador de Relógio Verilog
  9. Funções matemáticas Verilog
  10. Formato de hora Verilog