Menu
Coddy logo textTech

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
end

Ejemplo sencillo

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

Esto 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
end

Esto 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
end
initial begin
  #100;
  disable clock_gen;   // Ahora esto funciona
end

Forever frente a otros bucles

Bucle¿Se detiene?Cuándo usarlo
forSí (después de iteraciones fijas)Número conocido de repeticiones
whileSí (cuando la condición es falsa)Condición de parada desconocida
repeatSí (después de iteraciones fijas)Número conocido de repeticiones
foreverNo (nunca)Señales continuas (reloj)

Reglas importantes

ReglaExplicación
Debe incluir un retardo#10 o @(posedge clk)
Sin retardo, la simulación se bloqueaBucle infinito sin avance de tiempo
Usar con disable para detenerO la simulación nunca termina
Mejor usado en testbenchesNo sintetizable
challenge icon

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
end

Detenga 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;
end

Reglas clave:

  • Debe incluir un retraso (#10 o @(posedge clk)), de lo contrario la simulación se bloquea
  • Use disable para 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
endmodule
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Fundamentos