Menu
Coddy logo textTech

Non Blocking Assignment

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

En la lección anterior, vimos la asignación blocking (=), que se ejecuta paso a paso. Ahora veremos la asignación non-blocking (<=), que se ejecuta toda a la vez, en paralelo.

La asignación no bloqueante utiliza el operador <=. Se denomina «no bloqueante» porque no bloquea la ejecución de la siguiente instrucción. Todas las asignaciones no bloqueantes de 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 usan un reloj y tienen memoria. Las salidas cambian únicamente en un flanco de reloj (normalmente el flanco ascendente).

Ejemplos de lógica secuencial:

  • Flip-flops
  • Registros
  • Contadores
  • Máquinas de estados
  • 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

All tres asignaciones ocurren al mismo tiempo usando los old values. Al end del paso temporal, todas las actualizaciones ocurren juntas.

Non-blocking en bloques Always (lógica secuencial)

Non-blocking se usa para la lógica secuencial: circuitos que usan un clock y tienen memoria (flip-flops, registros, contadores).

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

Ambas asignaciones ocurren al mismo tiempo, usando values de antes del clock edge.

Resumen

ReglaExplicación
Usa <= para la lógica secuencialalways @(posedge clk)
Usa = para la lógica combinacionalalways @(*)
Non bloqueante se ejecuta en paraleloAll las asignaciones ocurren a la vez
Los values se actualizan al end del paso de tiempoNo inmediatamente
challenge icon

Desafío

Completa la asignación Non-Blocking

Add las asignaciones non-blocking que faltan para hacer que este registro de desplazamiento de 2 bits funcione.

Cómo funciona:

  • En cada edge de clock, q1 gets d
  • q2 gets el valor old de q1

Qué hacer:

  1. Assign d a q1 (non-blocking)
  2. Assign q1 a q2 (non-blocking)

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: Añadir 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

Practica por tu cuenta: Compilador de Verilog online