Menu
Coddy logo textTech

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 delays generales (#10 a = b;) y delays de puertas (and #5 (out, a, b);). Ahora cubrimos los delays de asignación, que son delays que ocurren dentro de un bloque procedimental (como initial o always) como parte de una sentencia de asignación.

Un assignment delay waits un time especificado, después realiza el assignment. El delay se coloca after del símbolo # y antes del assignment.

Sintaxis:

variable = #delay expression;

A diferencia de un general delay #10 a = b; (delay después assign), un assignment delay a = #10 b; toma el valor de b en ese momento, waits 10 time units, después lo assigns a a.

Assignment Delay vs General Delay

 General DelayAssignment Delay
Sintaxis#10 a = b;a = #10 b;
¿Cuándo se lee el valor?Al momento de la asignación (después del delay)Inmediatamente (antes del delay)
¿Qué valor se asigna?Valor de b en ese momentoValor de b en el tiempo 0 (o momento de lectura)
¿Cuándo se asigna el valor?Después del delayDespués del delay

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
end

Ambos dan el mismo resultado aquí. La diferencia aparece cuando b cambia durante el retardo.

Ejemplo de diferencia clave

Para mostrar que b cambia durante el retardo, necesitamos dos bloques initial independientes 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: a1 lee b = 1
  • En el tiempo 5: b cambia a 0 (mientras a1 todavía está esperando)
  • En el tiempo 10: a a1 se le asigna 1 (el valor leído en el tiempo 0), no 0

Con un retardo general #10 a2 = b; en un bloque separado, b se leería en el tiempo 10 (valor 0).

Reglas importantes

ReglaExplicación
= va antes de #a = #10 b; no a #10 = b;
El valor se lee inmediatamenteEl lado derecho se evalúa de inmediato
La Assignment ocurre after delayEl lado izquierdo gets el valor más tarde
Solo para bloques procedimentalesUsado en initial o always
challenge icon

Desafío

Qué hacer:

Add el assignment delay faltante para que a gets el valor de b after 15 time units, pero reads 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
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