Menu
Coddy logo textTech

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

Ambos 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: a1 lee b = 1
  • En el tiempo 5: b cambia a 0 (mientras a1 todavía está 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 después del retrasoEl lado izquierdo recibe el valor más tarde
Solo para bloques proceduralesSe usa en initial o always
challenge icon

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