Bucle Forever
Parte de la sección Fundamentos del Journey de Verilog de Coddy — lección 61 de 90.
El bucle forever repite un bloque de código continuamente, para siempre. Nunca se detiene por sí solo.
Un bucle forever se ejecuta repetidamente sin fin. Es útil para generar relojes y otras señales continuas en bancos de pruebas (testbenches).
Sintaxis:
forever begin
// Código que se repite indefinidamente
endEjemplo sencillo
forever begin
$display("This prints forever");
endEsto se imprimirá infinitamente y bloqueará tu simulación. Añade siempre un retraso o una condición de parada.
Generación de un reloj (Uso común)
El uso más común de forever es generar un reloj:
initial begin
clk = 0;
forever begin
#5 clk = ~clk; // Alternar cada 5 unidades de tiempo
end
endEsto crea un reloj que funciona durante toda la simulación.
Forever con Disable
Puedes detener un bucle forever usando una sentencia disable:
initial begin : clock_gen // Nombre añadido aquí
clk = 0;
forever begin
#5 clk = ~clk;
end
endinitial begin
#100;
disable clock_gen; // Ahora esto funciona
endForever frente a otros bucles
| Bucle | ¿Se detiene? | Cuándo usarlo |
|---|---|---|
for | Sí (después de iteraciones fijas) | Número conocido de repeticiones |
while | Sí (cuando la condición es falsa) | Condición de parada desconocida |
repeat | Sí (después de iteraciones fijas) | Número conocido de repeticiones |
forever | No (nunca) | Señales continuas (reloj) |
Reglas importantes
| Regla | Explicación |
|---|---|
| Debe incluir un retardo | #10 o @(posedge clk) |
| Sin retardo, la simulación se bloquea | Bucle infinito sin avance de tiempo |
Usar con disable para detener | O la simulación nunca termina |
| Mejor usado en testbenches | No sintetizable |
Desafío
Qué hacer:
Agrega el bucle forever que falta para generar un reloj que cambie de estado cada 10 unidades de tiempo.
Hoja de referencia
El bucle forever repite un bloque de código continuamente sin detenerse. Incluya siempre un retraso para evitar que la simulación se bloquee.
initial begin
clk = 0;
forever begin
#5 clk = ~clk; // Toggle every 5 time units
end
endDetenga un bucle forever usando disable con un bloque con nombre:
initial begin : clock_gen
clk = 0;
forever begin
#5 clk = ~clk;
end
end
initial begin
#100;
disable clock_gen;
endReglas clave:
- Debe incluir un retraso (
#10o@(posedge clk)), de lo contrario la simulación se bloquea - Use
disablepara detenerlo, o la simulación nunca terminará - No es sintetizable — solo para uso en bancos de pruebas (testbench)
Pruébalo tú mismo
module forever_challenge;
reg clk;
initial begin
clk = 0;
// TODO: Agregar un bucle forever para alternar clk cada 10 unidades de tiempo
end
endmoduleEsta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Fundamentos
1Introducción
¿Qué es Verilog?Hardware vs SoftwareNiveles de abstracción de diseñoTu primer móduloComentarios4Operadores Parte 1
Operadores aritméticosOperador de móduloOperadores de comparaciónRepaso - Matemáticas simplesOperadores bit a bit7Asignación y Compuertas
Asignación ContinuaAsignación con OperadoresPrimitivas de Compuertas IntegradasCompuertas AND OR NOTCompuertas XOR XNORResumen - Circuito de Compuertas Lógicas10Toma de decisiones
Sentencia IfIf - ElseRepaso - Comparador simpleSentencia CaseCasex y CasezRepaso - Diseño de ALU5Operadores Parte 2
Operadores lógicosOperadores de reducciónOperadores de desplazamientoOperador de concatenaciónOperador condicionalResumen - Desafío de operadores3Sistema de numeración
Representación binariaNúmeros con tamaño definidoNúmeros sin tamaño definidoNúmeros negativosValores especiales X y ZResumen - Formatos de números6Módulos
Estructura del móduloPuertos de entrada y salidaPuertos InoutInstanciación de módulosMapeo de puertos por nombreMapeo de puertos por ordenResumen: Construye un módulo