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
endAsignaciones bloqueantes en bloques Always (Lógica combinacional)
always @(*) begin
temp = a & b; // Paso 1
out = temp | c; // Paso 2 (usa temp del paso 1)
endEl orden importa. Esto está bien para la lógica combinacional.
Bloqueante vs No bloqueante
Bloqueante (=) | No bloqueante (<=) | |
|---|---|---|
| Ejecución | Uno tras otro | Todo a la vez |
| ¿Espera la siguiente línea? | Sí | No |
| Usos | Lógica combinacional | Lógica secuencial (flip-flops) |
Importante: No use asignaciones bloqueantes para Flip-Flops
Desafío
Agrega las asignaciones bloqueantes que faltan para intercambiar los valores de x e y usando una variable temporal.
Qué hacer:
- Asigna el valor de
xatemp(guarda x en temp) - Asigna el valor de
yax(mueve y a x) - Asigna el valor de
tempay(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)
endBloqueante (=) |
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
endmoduleEsta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Fundamentos
1Introducción
¿Qué es Verilog?Hardware vs SoftwareNiveles de abstracción de diseñoTu primer móduloComentarios4Operadores Parte 1
Operadores aritméticosOperador de móduloOperadores de comparaciónRepaso - Matemáticas simplesOperadores bit a bit7Asignación y Compuertas
Asignación ContinuaAsignación con OperadoresPrimitivas de Compuertas IntegradasCompuertas AND OR NOTCompuertas XOR XNORResumen - Circuito de Compuertas Lógicas10Toma de decisiones
Sentencia IfIf - ElseRepaso - Comparador simpleSentencia CaseCasex y CasezRepaso - Diseño de ALU5Operadores Parte 2
Operadores lógicosOperadores de reducciónOperadores de desplazamientoOperador de concatenaciónOperador condicionalResumen - Desafío de operadores3Sistema de numeración
Representación binariaNúmeros con tamaño definidoNúmeros sin tamaño definidoNúmeros negativosValores especiales X y ZResumen - Formatos de números6Módulos
Estructura del móduloPuertos de entrada y salidaPuertos InoutInstanciación de módulosMapeo de puertos por nombreMapeo de puertos por ordenResumen: Construye un módulo9Bloques procedimentales
Bloque AlwaysBloque InitialLista de sensibilidadAsignación bloqueanteAsignación no bloqueanteResumen - Always vs Initial