Menu
Coddy logo textTech

Délais d'affectation

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 abordé 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 d'assignation, qui sont des délais survenant à l'intérieur d'un bloc procédural (comme initial ou always) dans le cadre d'une instruction d'assignation.

Un délai d'assignation attend pendant un temps spécifié, puis effectue l'assignation. Le délai est placé après le symbole # et avant l'assignation.

Syntaxe :

variable = #delay expression;

Contrairement à un délai général #10 a = b; (délai puis affectation), un délai d'affectation a = #10 b; prend la valeur de b à ce moment-là, attend 10 unités de temps, puis l'affecte à a.

Délai d'affectation vs Délai général

 Délai généralDélai d'affectation
Syntaxe#10 a = b;a = #10 b;
Quand la valeur est-elle lue ?Au moment de l'affectation (après le délai)Immédiatement (avant le délai)
Quelle valeur est affectée ?Valeur de b à ce moment-làValeur de b au temps 0 (ou au moment de la lecture)
Quand la valeur est-elle affectée ?Après le délaiAprès le délai

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 affecte → a2=0
end

Les deux donnent le même résultat ici. La différence apparaît quand b change 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 à l'instant 0, affecte a1=1 à l'instant 10
end

initial begin
  #5 b = 0;       // Modifie b à 0 à l'instant 5 (pendant le délai)
end
  • À l'instant 0 : a1 lit b = 1
  • À l'instant 5 : b passe à 0 (pendant que a1 est toujours en attente)
  • À l'instant 10 : a1 reçoit la valeur 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
= se place avant #a = #10 b; et non a #10 = b;
La valeur est lue immédiatementLe côté droit est évalué immédiatement
L'affectation se produit après le délaiLe côté gauche reçoit la valeur plus tard
Uniquement pour les blocs procédurauxUtilisé dans initial ou always
challenge icon

Défi

Ce qu'il faut faire :

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

Aide-mémoire

Le délai d'assignation lit le côté droit immédiatement, attend le délai, puis effectue l'assignation :

variable = #delay expression;

Différence clé par rapport au délai général :

Délai général #10 a = b;Délai d'assignation a = #10 b;
Valeur de b lueAprès le délaiImmédiatement
Valeur assignéeAprès le délaiAprès le délai

Lorsque b change pendant le délai, les résultats diffèrent :

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

Uniquement valide à l'intérieur des blocs procéduraux (initial ou always).

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 recevoir b après 15 unités de temps
    // Lire b maintenant, affecter 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