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
endAll 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
endAmbas asignaciones ocurren al mismo tiempo, usando values de antes del clock edge.
Resumen
| Regla | Explicación |
|---|---|
Usa <= para la lógica secuencial | always @(posedge clk) |
Usa = para la lógica combinacional | always @(*) |
| Non bloqueante se ejecuta en paralelo | All las asignaciones ocurren a la vez |
| Los values se actualizan al end del paso de tiempo | No inmediatamente |
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,
q1getsd q2gets el valor old deq1
Qué hacer:
- Assign
daq1(non-blocking) - Assign
q1aq2(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
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 VerilogHardware frente a softwareTu primer móduloComentariosNiveles de abstracción del diseño4Operators Part 1
Arithmetic OperatorsModulo OperatorComparison OperatorsRecap - Simple MathBitwise Operators7Assign And Gates
Continuous AssignmentAssign With OperatorsBuilt In Gate PrimitivesAND OR NOT GatesXOR XNOR GatesRecap - Logic Gate Circuit10Decision Making
If StatementIf - ElseRecap - Simple ComparatorCase StatementCasex And CasezRecap - ALU Design5Operators Part 2
Logical OperatorsReduction OperatorsShift OperatorsConcatenation OperatorConditional OperatorRecap - Operator Challenge3Number System
Binary RepresentationSized NumbersUnsized NumbersNegative NumbersSpecial Values X And ZRecap - Number Formats6Modules
Module StructureInput And Output PortsInout PortsModule InstantiationPort Mapping By NamePort Mapping By OrderRecap - Build A Module9Procedural Blocks
Always BlockInitial BlockSensitivity ListBlocking AssignmentNon Blocking AssignmentRecap - Always vs Initial15Traffic Light Controller
Defining The StatesState Machine LogicPractica por tu cuenta: Compilador de Verilog online