Menu
Coddy logo textTech

Assignment Delays

Fait partie de la section Fondamentaux du Journey Verilog de Coddy. Leçon 69 sur 90.

Dans les leçons précédentes, nous avons étudié les délais généraux (#10 a = b;) et les délais de porte (and #5 (out, a, b);). Nous abordons maintenant les délais assignment, c'est-à-dire des délais qui se produisent à l'intérieur d'un bloc procédural (comme initial ou always), dans le cadre d'une instruction d'affectation.

Un assignment delay attend pendant une durée time spécifiée, puis effectue l’assignment. Le delay est placé after le symbole # et before l’assignment.

Syntaxe :

variable = #delay expression;

Contrairement à un délai General #10 a = b; (delay puis assign), un délai d’affectation a = #10 b; prend la valeur de b à ce moment-là, attend 10 unités de time, puis l’affecte à a.

Assignment Délai vs General Délai

 General DélaiAssignment Délai
Syntaxe#10 a = b;a = #10 b;
Quand la valeur est-elle lue ?Au moment de l’assignation (after delay)Immédiatement (avant delay)
Quelle valeur est assignée ?Valeur de b à ce moment-làValeur de b à time 0 (ou temps de lecture)
Quand la valeur est-elle assignée ?After delayAfter delay

Exemple : La différence

initial begin
  b = 1;
  #5 b = 0;
  
  // Délai général
  #10 a1 = b;     // Attend 10, puis lit b (b=0) → a1=0
  
  // Délai d'affectation
  a2 = #10 b;     // Lit b maintenant (b=0), attend 10, puis assigne → a2=0
end

Les deux donnent le même résultat ici. La différence apparaît lorsque b changes pendant le délai.

Exemple de différence clé

To show b changing during the delay, we need two separate initial blocks that run in parallel:

initial begin
  b = 1;
  a1 = #10 b;     // Lit b=1 au temps 0, assigne a1=1 au temps 10
end

initial begin
  #5 b = 0;       // Change b à 0 au temps 5 (pendant le délai)
end
  • À l’instant 0 : a1 lit b = 1
  • À l’instant 5 : b devient 0 (alors que a1 attend toujours)
  • À l’instant 10 : a1 reçoit 1 (la valeur lue à l’instant 0), et non 0

Avec un délai général #10 a2 = b; dans un bloc séparé, b serait lu à l’instant 10 (valeur 0).

Règles importantes

RègleExplication
= vient avant #a = #10 b; et non a #10 = b;
La valeur est lue immédiatementLe côté droit est évalué immédiatement
L’Assignment se produit après le delayLe côté gauche gets la valeur plus tard
Uniquement pour les blocs procédurauxUtilisé dans initial ou always
challenge icon

Défi

Que faire :

Ajoutez le délai d’affectation manquant afin que a reçoive la valeur de b après 15 unités de temps, mais lise b immédiatement.

Essayez vous-même

module assignment_challenge;
  reg a, b;
  
  // Bloc séparé pour changer b pendant le délai
  initial begin
    b = 1;
    // TODO: Ajouter un délai d'affectation
    // a devrait obtenir b après 15 unités de temps
    // Lire b maintenant, assigner après le délai

  end
  
  initial begin
    #5 b = 0;      // Change b pendant le délai
    #20 $display("Time %0t: a = %b", $time, a);
    $finish;
  end
endmodule
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Fondamentaux

Entraînez-vous par vous-même : Compilateur Verilog en ligne