Retrasos de asignación
Parte de la sección Fundamentos del Journey de Verilog de Coddy. Lección 69 de 90.
En lecciones anteriores, vimos los retardos generales (#10 a = b;) y los retardos de puerta (and #5 (out, a, b);). Ahora veremos los retardos de asignación, que son retardos que ocurren dentro de un bloque procedural (como initial o always) como parte de una sentencia de asignación.
Un retraso de asignación espera durante un tiempo especificado y después realiza la asignación. El retraso se coloca después del símbolo # y antes de la asignación.
Sintaxis:
variable = #delay expression;A diferencia de un retraso general #10 a = b; (retrasar y después asignar), un retraso de asignación a = #10 b; toma el valor de b en ese momento, espera 10 unidades de tiempo y después lo asigna a a.
Retardo de asignación frente a retardo general
| Retardo general | Retardo de asignación | |
|---|---|---|
| Sintaxis | #10 a = b; | a = #10 b; |
| ¿Cuándo se lee el valor? | En el momento de la asignación (después del retardo) | Inmediatamente (antes del retardo) |
| ¿Qué valor se asigna? | El valor de b en ese momento | El valor de b en el tiempo 0 (o en el momento de lectura) |
| ¿Cuándo se asigna el valor? | Después del retardo | Después del retardo |
Ejemplo: La diferencia
initial begin
b = 1;
#5 b = 0;
// Retraso general
#10 a1 = b; // Espera 10, luego lee b (b=0) → a1=0
// Retraso de asignación
a2 = #10 b; // Lee b ahora (b=0), espera 10, luego asigna → a2=0
endAmbos dan el mismo resultado aquí. La diferencia aparece cuando b cambia durante el retraso.
Ejemplo de diferencia clave
To show b changing during the delay, we need two separate initial blocks that run in parallel:
initial begin
b = 1;
a1 = #10 b; // Lee b=1 en el tiempo 0, asigna a1=1 en el tiempo 10
end
initial begin
#5 b = 0; // Cambia b a 0 en el tiempo 5 (durante el retardo)
end- En el tiempo 0:
a1leeb = 1 - En el tiempo 5:
bcambia a0(mientrasa1todavía está esperando) - En el tiempo 10: se asigna
1aa1(el valor leído en el tiempo 0), no0
Con un retraso general #10 a2 = b; en un bloque separado, b se leería en el tiempo 10 (valor 0).
Reglas importantes
| Regla | Explicación |
|---|---|
= va antes de # | a = #10 b;, no a #10 = b; |
| El valor se lee inmediatamente | El lado derecho se evalúa de inmediato |
| La asignación ocurre después del retraso | El lado izquierdo recibe el valor más tarde |
| Solo para bloques procedurales | Se usa en initial o always |
Desafío
Qué hacer:
Añade el retraso de asignación que falta para que a obtenga el valor de b después de 15 unidades de tiempo, pero lea b inmediatamente.
Pruébalo tú mismo
module assignment_challenge;
reg a, b;
// Bloque separado para cambiar b durante el retardo
initial begin
b = 1;
// TODO: Añadir retardo de asignación
// a debería obtener b después de 15 unidades de tiempo
// Leer b ahora, asignar después del retardo
end
initial begin
#5 b = 0; // Cambia b durante el retardo
#20 $display("Time %0t: a = %b", $time, a);
$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 VerilogHardware frente a softwareTu primer móduloComentariosNiveles de abstracción del diseño4Operadores, parte 1
Operadores aritméticosOperador móduloOperadores de comparaciónRepaso: matemáticas simplesOperadores bit a bit7Asignaciones y compuertas
Asignación continuaAsignación con operadoresPrimitivas de compuertas integradasCompuertas AND, OR y NOTCompuertas XOR y XNORRepaso: circuito de compuertas lógicas10Toma de decisiones
Sentencia IfIf - ElseRepaso - Comparador simpleSentencia CaseCasex y CasezRepaso - Diseño de ALU13Temporización y retrasos
Qué son los retrasosRetrasos de puertaRetrasos de asignaciónDirectiva de escala temporalGeneración de relojRepaso: control de la temporización5Operadores, parte 2
Operadores lógicosOperadores de reducciónOperadores de desplazamientoOperador de concatenaciónOperador condicionalRepaso: desafío de operadores11Bucles
Bucle ForBucle WhileBucle de repeticiónBucle infinitoInstrucción DisableRepaso: patrones de bucles3Sistema numérico
Representación binariaNúmeros con tamañoNúmeros sin tamañoNúmeros negativosValores especiales X y ZRepaso: formatos numéricos6Módulos
Estructura de módulosPuertos de entrada y salidaPuertos inoutInstanciación de módulosAsignación de puertos por nombreAsignación de puertos por ordenRepaso: construir un móduloPractica por tu cuenta: Compilador de Verilog online