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
endExemplo Simples
forever begin
$display("This prints forever");
endIsso 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
endIsso 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
endinitial begin
#100;
disable clock_gen; // Agora isso funciona
endForever vs Outros Loops
| Loop | Para? | Quando Usar |
|---|---|---|
for | Sim (após iterações fixas) | Número conhecido de repetições |
while | Sim (quando a condição for falsa) | Condição de parada desconhecida |
repeat | Sim (após iterações fixas) | Número conhecido de repetições |
forever | Não (nunca) | Sinais contínuos (clock) |
Regras Importantes
| Regra | Explicação |
|---|---|
| Deve incluir um atraso (delay) | #10 ou @(posedge clk) |
| Sem atraso, a simulação trava | Loop infinito sem avanço de tempo |
Use com disable para parar | Ou a simulação nunca termina |
| Melhor utilizado em testbenches | Não sintetizável |
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
endPare 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;
endRegras principais:
- Deve incluir um atraso (
#10ou@(posedge clk)), caso contrário a simulação trava - Use
disablepara 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
endmoduleEsta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Fundamentos
1Introdução
O que é VerilogHardware vs SoftwareNíveis de Abstração de ProjetoSeu Primeiro MóduloComentários4Operadores Parte 1
Operadores AritméticosOperador de MóduloOperadores de ComparaçãoRecapitulação - Matemática SimplesOperadores Bitwise7Atribuição e Portas Lógicas
Atribuição ContínuaAtribuição com OperadoresPrimitivas de Portas IntegradasPortas AND, OR e NOTPortas XOR e XNORRecapitulação - Circuito de Portas Lógicas10Tomada de Decisão
Instrução IfIf - ElseRecapitulação - Comparador SimplesInstrução CaseCasex e CasezRecapitulação - Projeto de ALU2Tipos de Dados
Tipo WireTipo RegInteger e RealVetoresArraysParâmetrosRecapitulação - Declarar Sinais5Operadores Parte 2
Operadores LógicosOperadores de ReduçãoOperadores de DeslocamentoOperador de ConcatenaçãoOperador CondicionalRecapitulação - Desafio de Operadores3Sistemas de Numeração
Representação BináriaNúmeros com Tamanho DefinidoNúmeros sem Tamanho DefinidoNúmeros NegativosValores Especiais X e ZRecapitulação - Formatos de Números6Módulos
Estrutura de MóduloPortas de Entrada e SaídaPortas InoutInstanciação de MóduloMapeamento de Portas por NomeMapeamento de Portas por OrdemRecapitulação - Construa um Módulo