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

Simulação Verilog


Verilog é uma linguagem de descrição de hardware e não é necessário que os projetistas simulem seus projetos RTL para poder convertê-los em portas lógicas. Então, qual é a necessidade de simular?

A simulação é uma técnica de aplicação de diferentes estímulos de entrada ao projeto em momentos diferentes para verificar se o código RTL se comporta da maneira pretendida. Essencialmente, a simulação é uma técnica bem seguida para verificar a robustez do projeto. Também é semelhante a como um chip fabricado será usado no mundo real e como ele reage a diferentes entradas.

Por exemplo, o projeto acima representa um detector de borda positiva com entradas de clock e sinal que são avaliadas em intervalos periódicos para encontrar a saída pe como mostrado. A simulação nos permite visualizar o diagrama de tempo dos sinais relacionados para entender como a descrição do projeto em Verilog realmente se comporta.

Existem várias empresas de EDA que desenvolvem simuladores capaz de descobrir as saídas para várias entradas para o projeto. Verilog é definido em termos de um evento discreto modelo de execução e simuladores diferentes são livres para usar algoritmos diferentes para fornecer ao usuário um conjunto consistente de resultados. O código Verilog é dividido em vários processos e threads e pode ser avaliado em diferentes momentos no decorrer de uma simulação, que será abordada posteriormente.

Exemplo


O testbench chamado tb é um container para conter um módulo de design. No entanto, neste exemplo, não usamos nenhuma instância de design. Existem duas variáveis ou sinais que podem receber determinados valores em momentos específicos. clk representa um relógio que é gerado dentro do testbench. Isso é feito pelo always instrução alternando o valor do relógio a cada 5ns. O initial O bloco contém um conjunto de instruções que atribuem valores diferentes a ambos os sinais em momentos diferentes.
  
  
module tb;
  reg clk;
  reg sig;
 
  // Clock generation 
  // Process starts at time 0ns and loops after every 5ns
  always #5 clk = ~clk;   
 
  // Initial block : Process starts at time 0ns
  initial begin            
    // This system task will print out the signal values everytime they change
    $monitor("Time = %0t clk = %0d sig = %0d", $time, clk, sig);
    
    // Also called stimulus, we simply assign different values to the variables
    // after some simulation "delay"
    sig = 0;
    #5 clk = 0;        // Assign clk to 0 at time 5ns
    #15  sig = 1;      // Assign sig to 1 at time 20ns (#5 + #15)
    #20  sig = 0;      // Assign sig to 0 at time 40ns (#5 + #15 + #20)
    #15  sig = 1;      // Assign sig to 1 at time 55ns (#5 + #15 + #20 + #15)
    #10  sig = 0;      // Assign sig to 0 at time 65ns (#5 + #15 + #20 + #15 + #10)
    #20 $finish;       // Finish simulation at time 85ns
  end
endmodule

  

O simulador fornece a seguinte saída após a execução do testbench acima.
Registro de simulação
ncsim> run
Time = 0 clk = x sig = 0
Time = 5 clk = 0 sig = 0
Time = 10 clk = 1 sig = 0
Time = 15 clk = 0 sig = 0
Time = 20 clk = 1 sig = 1
Time = 25 clk = 0 sig = 1
Time = 30 clk = 1 sig = 1
Time = 35 clk = 0 sig = 1
Time = 40 clk = 1 sig = 0
Time = 45 clk = 0 sig = 0
Time = 50 clk = 1 sig = 0
Time = 55 clk = 0 sig = 1
Time = 60 clk = 1 sig = 1
Time = 65 clk = 0 sig = 0
Time = 70 clk = 1 sig = 0
Time = 75 clk = 0 sig = 0
Time = 80 clk = 1 sig = 0
Simulation complete via $finish(1) at time 85 NS + 0

O que é uma forma de onda de simulação?


As simulações nos permitem despejar sinais de design e testbench em uma forma de onda que pode ser representada graficamente para analisar e depurar a funcionalidade do design RTL. A forma de onda mostrada abaixo é obtida de uma ferramenta EDA e mostra o progresso de cada sinal em relação ao tempo e é igual ao diagrama de tempo mostrado anteriormente.

Cada mudança no valor de uma variável ou rede é chamada de evento de atualização . E os processos são sensíveis a eventos de atualização de tal forma que esses processos são avaliados sempre que o evento de atualização acontece e é chamado de evento de avaliação . Devido à possibilidade de ter vários processos sendo avaliados arbitrariamente, a ordem das alterações deve ser rastreada em algo chamado de fila de eventos .

Naturalmente, eles são ordenados pelo tempo de simulação. A colocação de um novo evento na fila é chamada de agendamento . O tempo de simulação é usado para se referir ao valor de tempo mantido pelo simulador para modelar o tempo real que levaria para o circuito sendo simulado. Os valores de tempo para o exemplo acima são mostrados em nanossegundos ns no diagrama de tempo.
  
  
module des;
	wire abc;
	wire a, b, c;
	
	assign abc = a & b | c;  // abc is updated via the assign statement (process) whenever a, b or c change -> update event
endmodule

  

Atualize o Verilog e veja um exemplo!

Regiões na fila de eventos


A fila de eventos Verilog é dividida logicamente em cinco regiões e os eventos podem ser adicionados a qualquer uma delas. No entanto, ele pode ser removido apenas da região ativa.
Eventos Descrição
Ativo Ocorrem no momento da simulação atual e podem ser processados ​​em qualquer ordem
Inativo Ocorre no momento da simulação atual, mas é processado após a conclusão de todos os eventos ativos
Não bloqueante Avaliado em algum momento anterior, mas a atribuição é feita no momento da simulação atual após a conclusão dos eventos ativos e inativos
Monitorar Processado após a conclusão de todos os eventos ativos, inativos e não bloqueantes
Futuro Ocorrem em algum momento de simulação futuro

Um ciclo de simulação é onde todos os eventos ativos são processados. O padrão garante uma determinada ordem de agendamento, exceto para alguns casos e. Por exemplo, as instruções dentro de um bloco begin-end só serão executadas na ordem em que aparecem.
  
  
module tb;
	reg [3:0] a;
	reg [3:0] b;
	
	initial begin		// Statements are executed one after the other at appropriate simulation times
		a = 5;			// At time 0ns, a is assigned 5
		b = 2;			// In the same simulation step (time 0ns), b is assigned 2
		
		#10 a = 7;		// When simulation advances to 10ns, a is assigned 7
	end
endmodule

  

A fila de eventos define essa atribuição para b deve acontecer após a atribuição a a .

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. Compilação condicional Verilog `ifdef
  8. Semântica de agendamento Verilog
  9. Gerador de Relógio Verilog
  10. Tarefas de Exibição Verilog