Menu
Coddy logo textTech

Laço Forever

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

O loop forever repete um bloco de código continuamente, para sempre. Ele nunca para por conta própria.

Um loop forever executa repetidamente sem fim. Ele é útil para gerar clocks e outros sinais contínuos em testbenches.

Sintaxe:

forever begin
  // Código que se repete para sempre
end

Exemplo Simples

forever begin
  $display("This prints forever");
end

Isso imprimirá infinitamente e travará sua simulação. Sempre adicione um atraso ou uma condição de parada.

Gerando um Clock (Uso Comum)

O uso mais comum de forever é para gerar um clock:

initial begin
  clk = 0;
  forever begin
    #5 clk = ~clk;   // Alterna a cada 5 unidades de tempo
  end
end

Isso cria um relógio que funciona durante toda a simulação.

Forever com Disable

Você pode interromper um loop forever usando uma instrução disable:

initial begin : clock_gen   // Nome adicionado aqui
  clk = 0;
  forever begin
    #5 clk = ~clk;
  end
end
initial begin
  #100;
  disable clock_gen;   // Agora isso funciona
end

Forever vs Outros Loops

LoopPara?Quando Usar
forSim (após iterações fixas)Número conhecido de repetições
whileSim (quando a condição for falsa)Condição de parada desconhecida
repeatSim (após iterações fixas)Número conhecido de repetições
foreverNão (nunca)Sinais contínuos (clock)

Regras Importantes

RegraExplicação
Deve incluir um atraso (delay)#10 ou @(posedge clk)
Sem atraso, a simulação travaLoop infinito sem avanço de tempo
Use com disable para pararOu a simulação nunca termina
Melhor utilizado em testbenchesNão sintetizável
challenge icon

Desafio

O que fazer:

Adicione o loop forever que falta para gerar um clock que alterna a cada 10 unidades de tempo.

Folha de consulta

O loop forever repete um bloco de código continuamente sem parar. Sempre inclua um atraso para evitar o travamento da simulação.

initial begin
  clk = 0;
  forever begin
    #5 clk = ~clk; // Alterna a cada 5 unidades de tempo
  end
end

Pare um loop forever usando disable com um bloco nomeado:

initial begin : clock_gen
  clk = 0;
  forever begin
    #5 clk = ~clk;
  end
end

initial begin
  #100;
  disable clock_gen;
end

Regras principais:

  • Deve incluir um atraso (#10 ou @(posedge clk)), caso contrário a simulação trava
  • Use disable para parar, ou a simulação nunca termina
  • Não sintetizável — apenas para uso em testbench

Experimente você mesmo

module forever_challenge;
  reg clk;
  
  initial begin
    clk = 0;
    // TODO: Adicione um loop forever para alternar o clk a cada 10 unidades de tempo
  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