Menu
Coddy logo textTech

O que são Atrasos

Parte da seção Fundamentos do Journey de Verilog da Coddy — lição 67 de 90.

Em Verilog, atrasos controlam quando uma instrução é executada ou quando um sinal muda. Eles são usados para modelar o comportamento de temporização de hardware real.

Por que os atrasos são necessários

O hardware real leva tempo para que os sinais viajem através de fios e portas. Os atrasos permitem simular esse comportamento de temporização.

  • Na simulação, sem atrasos, tudo acontece no tempo 0
  • Os atrasos permitem que você espace os eventos ao longo do tempo
  • Eles ajudam a testar designs sensíveis ao tempo, como relógios e máquinas de estado

Tipos de Atrasos

Tipo de AtrasoPropósito
Atrasos de PortaAtraso através de portas lógicas
Atrasos de AtribuiçãoAtraso ao atribuir valores
Diretiva TimescaleDefine unidades de tempo para simulação

Sintaxe Básica

Um atraso (delay) é escrito com um # seguido por um número:

#10 clk = ~clk;   // Aguarde 10 unidades de tempo, então inverta o clock
#5 a = b;         // Aguarde 5 unidades de tempo, então atribua a = b

O número após # é o número de unidades de tempo para esperar.

Exemplo Simples

initial begin
  a = 0;
  #10 a = 1;   // Após 10 unidades de tempo, a torna-se 1
  #5 a = 0;    // Após outras 5 unidades de tempo, a torna-se 0
end

Tempo:

  • Tempo 0: a = 0
  • Tempo 10: a = 1
  • Tempo 15: a = 0

Atrasos em Blocos Always

always #5 clk = ~clk;   // Alterna o clock a cada 5 unidades de tempo

Isso cria um sinal de clock contínuo.

Regras Importantes

RegraExplicação
Símbolo #Marca um atraso
Número após #Quantas unidades de tempo esperar
Atrasos são cumulativos#10 depois #20 espera um total de 30
Não sintetizávelAtrasos são apenas para simulação
challenge icon

Desafio

O que fazer:

Adicione os atrasos que faltam para fazer este código imprimir mensagens nos tempos 0, 10, 25 e 40.

Folha de consulta

Em Verilog, os atrasos (delays) usam # seguido por unidades de tempo para controlar quando as instruções são executadas:

#10 a = 1;   // Aguarda 10 unidades de tempo, então atribui

Os atrasos são cumulativos — cada atraso é adicionado ao tempo atual:

initial begin
  a = 0;      // Tempo 0
  #10 a = 1;  // Tempo 10
  #5  a = 0;  // Tempo 15
end

Use em blocos always para gerar clocks:

always #5 clk = ~clk;  // Alterna a cada 5 unidades

Nota: Atrasos são apenas para simulação — não são sintetizáveis.

Experimente você mesmo

module delay_challenge;
  
  initial begin
    $display("Time %0t: Start", $time);
    // TODO: Adicionar atraso para chegar ao tempo 10
    $display("Time %0t: After first delay", $time);
    // TODO: Adicionar atraso para chegar ao tempo 25
    $display("Time %0t: After second delay", $time);
    // TODO: Adicionar atraso para chegar ao tempo 40
    $display("Time %0t: End", $time);
    $finish;
  end
  
endmodule

quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Fundamentos