Menu
Coddy logo textTech

Asignación bloqueante

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

Verilog tiene dos tipos de asignaciones procedimentales: bloqueante (=) y no bloqueante (<=). En esta lección, nos enfocamos en la asignación bloqueante.

La asignación bloqueante utiliza el operador =. Se llama "bloqueante" porque bloquea la ejecución de la siguiente sentencia hasta que la asignación actual se completa. El código se ejecuta paso a paso, en orden.

Sintaxis:

variable = expression;

Cuándo usar la asignación bloqueante

La asignación bloqueante (=) se utiliza para la lógica combinacional: circuitos donde las salidas cambian inmediatamente cuando cambian las entradas, sin reloj y sin memoria.

Ejemplos de lógica combinacional:

  • Compuertas AND / OR / XOR
  • Sumadores y restadores
  • Multiplexores
  • Decodificadores

Ejemplo de Verilog:

always @(*) begin
  sum = a + b;      // Asignación bloqueante
  carry = a & b;    // Asignación bloqueante
end

Asignaciones bloqueantes en bloques Always (Lógica combinacional)

always @(*) begin
  temp = a & b;    // Paso 1
  out = temp | c;  // Paso 2 (usa temp del paso 1)
end

El orden importa. Esto está bien para la lógica combinacional.

Bloqueante vs No bloqueante

 Bloqueante (=)No bloqueante (<=)
EjecuciónUno tras otroTodo a la vez
¿Espera la siguiente línea?No
UsosLógica combinacionalLógica secuencial (flip-flops)

Importante: No use asignaciones bloqueantes para Flip-Flops

challenge icon

Desafío

Agrega las asignaciones bloqueantes que faltan para intercambiar los valores de x e y usando una variable temporal.

Qué hacer:

  1. Asigna el valor de x a temp (guarda x en temp)
  2. Asigna el valor de y a x (mueve y a x)
  3. Asigna el valor de temp a y (mueve la x guardada a y)

Hoja de referencia

Asignación bloqueante (=) se ejecuta secuencialmente — cada sentencia se completa antes de que comience la siguiente. Se utiliza para lógica combinacional dentro de bloques always @(*).

always @(*) begin
  temp = a & b;    // Paso 1
  out = temp | c;  // Paso 2 (usa temp actualizado)
end
Bloqueante (=) No bloqueante (<=)
Ejecución Una tras otra Todas a la vez
Uso para Lógica combinacional Lógica secuencial (flip-flops)

Pruébalo tú mismo

module swap;
  reg x, y;
  reg temp;
  
  initial begin
    x = 1;
    y = 0;
    
    $display("Before swap: x=%d, y=%d", x, y);
    
    // TODO: Paso 1 - Asignar x a temp
    
    // TODO: Paso 2 - Asignar y a x
    
    // TODO: Paso 3 - Asignar temp a y
    
    $display("After swap: x=%d, y=%d", x, y);
    $finish;
  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