Menu
Coddy logo textTech

Always Block

Parte de la sección Fundamentos del Journey de Verilog de Coddy. Lección 46 de 90.

Un procedural block es un block de código en el que las instrucciones se ejecutan una después de otra, en secuencia, igual que en lenguajes de programación como C o Python. Verilog tiene dos bloques procedurales: initial (se ejecuta una vez) y always (se ejecuta continuamente). Comencemos con el block always.

El bloque always se ejecuta de forma continua. Se repite para siempre una vez que comienza la simulación. Se utiliza para describir hardware que debe seguir ejecutándose, como flip-flops, contadores y lógica combinacional.

Sintaxis básica:

always @(sensitivity_list) begin
  // Código que se ejecuta repetidamente
end

El @(sensitivity_list) indica a block when ejecutarse. Sin él (y sin ningún retraso como #5 dentro), block entraría en un bucle infinito y bloquearía la simulación.

Ejemplo de bloque always: Counter

Aquí tienes un ejemplo de cómo podemos usar el bloque always para crear un contador.

module counter (
  input clk,
  output reg [3:0] count
);
  always @(posedge clk) count <= count + 1;
endmodule

Cómo funciona este código

ParteSignificado
alwaysEjecuta este código repetidamente, para siempre
@(posedge clk)Espera a que el reloj pase de 0 a 1 (flanco ascendente)
count <= count + 1Toma el valor actual de count, suma 1 y vuelve a almacenarlo

El bloque se ejecuta en cada rising edge de clock. Cada vez, count aumenta en 1.

La lista de sensibilidad @(posedge clk) le indica que se ejecute solo en los flancos del reloj, no continuamente. Sin esto, el bucle se ejecutaría indefinidamente sin demora.

Bloque always con múltiples señales

Puedes enumerar señales específicas:

always @(a or b) begin
  out = a & b;
end

Esto se ejecuta cuando a o b changes.

challenge icon

Desafío

Add el bloque always que falta para que este módulo funcione.

Cómo funciona:

  • En cada rising clock edge, out1 toggles (cambia) de 0 a 1 o de 1 a 0
  • out2 follows out1 (tiene el mismo valor que out1)

Qué hacer:

  1. Add un bloque always @(posedge clk)
  2. Dentro, haz que out1 toggles (usa out1 = ~out1)
  3. Haz que out2 sea igual a out1

Pruébalo tú mismo

module toggler (
  input clk,
  output reg out1,
  output reg out2
);

  initial begin
    out1 = 0;
    out2 = 0;
  end

  // TODO: Añadir bloque always con posedge clk
  // out1 alterna en cada clock
  // out2 sigue a out1

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

Practica por tu cuenta: Compilador de Verilog online