Retardos de asignación
Parte de la sección Fundamentos del Journey de Verilog de Coddy — lección 69 de 90.
En lecciones anteriores, cubrimos los retardos generales (#10 a = b;) y los retardos de compuerta (and #5 (out, a, b);). Ahora cubriremos los retardos de asignación, que son retardos que ocurren dentro de un bloque procedimental (como initial o always) como parte de una sentencia de asignación.
Un retardo de asignación espera un tiempo especificado y luego realiza la asignación. El retardo se coloca después del símbolo # y antes de la asignación.
Sintaxis:
variable = #delay expression;A diferencia de un retardo general #10 a = b; (retardo y luego asignación), un retardo de asignación a = #10 b; toma el valor de b en ese momento, espera 10 unidades de tiempo y luego lo asigna a a.
Retraso de asignación frente a retraso general
| Retraso general | Retraso 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 retraso) | Inmediatamente (antes del retraso) |
| ¿Qué valor se asigna? | Valor de b en ese momento | Valor de b en el tiempo 0 (o momento de lectura) |
| ¿Cuándo se asigna el valor? | Después del retraso | Después del retraso |
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
Para mostrar que b cambia durante el retardo, necesitamos dos bloques initial separados que se ejecuten en paralelo:
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: a
a1se le asigna1(el valor leído en el tiempo 0), no0
Con un retardo 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 procedimentales | Usado en initial o always |
Desafío
Qué hacer:
Añade el retraso de asignación faltante para que a obtenga el valor de b después de 15 unidades de tiempo, pero lea b inmediatamente.
Hoja de referencia
El retraso de asignación lee el lado derecho inmediatamente, espera el retraso y luego realiza la asignación:
variable = #delay expression;Diferencia clave frente al retraso general:
Retraso General #10 a = b; | Retraso de Asignación a = #10 b; | |
|---|---|---|
| Valor de b leído | Después del retraso | Inmediatamente |
| Valor asignado | Después del retraso | Después del retraso |
Cuando b cambia durante el retraso, los resultados difieren:
initial begin
b = 1;
a1 = #10 b; // Reads b=1 now, assigns a1=1 at time 10
#5 b = 0; // b changes at time 5 — a1 still gets 1
// With #10 a2 = b; → reads b=0 at time 10, so a2=0
endSolo es válido dentro de bloques procedimentales (initial o always).
Pruébalo tú mismo
module assignment_challenge;
reg a, b;
// Bloque separado para cambiar b durante el retraso
initial begin
b = 1;
// TODO: Agregar retraso de asignación
// a debe obtener b después de 15 unidades de tiempo
// Leer b ahora, asignar después del retraso
end
initial begin
#5 b = 0; // Cambia b durante el retraso
#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 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 ALU13Temporización y retardos
¿Qué son los retardos?Retardos de compuertaRetardos de asignaciónDirectiva TimescaleGeneración de relojResumen - Control de temporización5Operadores 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ódulo