Menu
Coddy logo textTech

Asignación no bloqueante

Parte de la sección Fundamentos del Journey de Verilog de Coddy — lección 50 de 90.

En la lección anterior, cubrimos la asignación bloqueante (=), que se ejecuta paso a paso. Ahora cubriremos la asignación no bloqueante (<=), que se ejecuta todo a la vez, en paralelo.

La asignación no bloqueante utiliza el operador <=. Se llama "no bloqueante" porque no bloquea la ejecución de la siguiente sentencia. Todas las asignaciones no bloqueantes en un bloque se ejecutan al mismo tiempo.

Sintaxis:

variable <= expression;

Cuándo usar la asignación no bloqueante

La asignación no bloqueante (<=) se utiliza para la lógica secuencial: circuitos que utilizan un reloj y tienen memoria. Las salidas cambian solo en un flanco de reloj (normalmente el flanco de subida).

Ejemplos de lógica secuencial:

  • Flip-flops
  • Registros
  • Contadores
  • Máquinas de estado
  • Registros de desplazamiento

Ejemplo de Verilog:

initial begin
  a <= 5;      // Programado, pero aún no ejecutado
  b <= a + 2;  // Programado, usa el valor ANTIGUO de a
  c <= b * 3;  // Programado, usa el valor ANTIGUO de b
end

Las tres asignaciones ocurren al mismo tiempo utilizando los valores antiguos. Al final del paso de tiempo, todas las actualizaciones ocurren juntas.

Non-Blocking en bloques Always (Lógica secuencial)

Non-blocking se utiliza para lógica secuencial — circuitos que utilizan un reloj y tienen memoria (flip-flops, registros, contadores).

always @(posedge clk) begin
  q <= d;           // q recibe d en el flanco de reloj
  count <= count + 1; // count se incrementa en el flanco de reloj
end

Ambas asignaciones ocurren al mismo tiempo, utilizando los valores de antes del flanco de reloj.

Resumen

ReglaExplicación
Use <= para lógica secuencialalways @(posedge clk)
Use = para lógica combinacionalalways @(*)
Las asignaciones no bloqueantes se ejecutan en paraleloTodas las asignaciones ocurren a la vez
Los valores se actualizan al final del paso de tiempoNo inmediatamente
challenge icon

Desafío

Completa la Asignación No Bloqueante

Añade las asignaciones no bloqueantes que faltan para que este registro de desplazamiento de 2 bits funcione.

Cómo funciona:

  • En cada flanco de reloj, q1 recibe d
  • q2 recibe el valor anterior de q1

Qué hacer:

  1. Asigna d a q1 (no bloqueante)
  2. Asigna q1 a q2 (no bloqueante)

Hoja de referencia

La asignación no bloqueante (<=) ejecuta todas las sentencias en paralelo — utilizando los valores antiguos y actualizándolos al final del paso de tiempo.

// Todos usan los valores ANTIGUOS de a y b
a <= 5;
b <= a + 2;  // usa el valor antiguo de a
c <= b * 3;  // usa el valor antiguo de b

Use <= para lógica secuencial (flip-flops, registros, contadores) dentro de bloques always sincronizados por reloj:

always @(posedge clk) begin
  q     <= d;           // no bloqueante
  count <= count + 1;   // no bloqueante
end
AsignaciónUso paraSe ejecuta
<=Lógica secuencial (posedge clk)En paralelo
=Lógica combinacional (always @(*))Paso a paso

Pruébalo tú mismo

module shift_register (
  input clk,
  input reset,
  input d,
  output reg q1,
  output reg q2
);
  
  always @(posedge clk or posedge reset) begin
    if (reset) begin
      q1 <= 0;
      q2 <= 0;
    end else begin
      // TODO: Agregar lógica de desplazamiento
      // Paso 1: Asignar d a q1 (no bloqueante)
      // Paso 2: Asignar q1 a q2 (no bloqueante)
    end
  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