Menu
Coddy logo textTech

Assignment Delays

Parte de la sección Fundamentos del Journey de Verilog de Coddy. Lección 69 de 90.

En lecciones anteriores, vimos los retardos General (#10 a = b;) y los retardos de compuerta (and #5 (out, a, b);). Ahora veremos los retardos de assignment, que son retardos que ocurren dentro de un bloque procedural (como initial o always) como parte de una instrucción de asignación.

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

Sintaxis:

variable = #delay expression;

A diferencia de un retraso General #10 a = b; (delay después assign), un retraso de assignment a = #10 b; toma el valor de b en ese momento, espera 10 unidades de time y después assigns ese valor a a.

Assignment Delay frente a General Delay

 General DelayAssignment Delay
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 momentoValor de b en el tiempo 0 (o en el momento de lectura)
¿Cuándo se asigna el valor?Después del retrasoDespué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
end

Ambos dan el mismo result aquí. La diferencia aparece cuando b changes durante el delay.

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: a1 reads b = 1
  • En el tiempo 5: b changes to 0 (mientras a1 sigue esperando)
  • En el tiempo 10: se asigna 1 a a1 (el valor leído en el tiempo 0), no 0

Con un retraso 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 asignación ocurre after el retrasoEl lado izquierdo gets el valor más tarde
Solo para bloques proceduralesSe usa en initial o always
challenge icon

Desafío

Qué hacer:

Add el delay de assignment que falta 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

Practica por tu cuenta: Compilador de Verilog online