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 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 generalRetraso 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 momentoValor de b en el tiempo 0 (o 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 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: 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 asignación ocurre después del retrasoEl lado izquierdo recibe el valor más tarde
Solo para bloques procedimentalesUsado en initial o always
challenge icon

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ídoDespués del retrasoInmediatamente
Valor asignadoDespués del retrasoDespué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
end

Solo 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
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