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 couvert les general delays (#10 a = b;) et les gate delays (and #5 (out, a, b);). Maintenant, nous couvrons les assignment delays, qui sont des delays qui se produisent à l'intérieur d'un block procédural (comme initial ou always) dans le cadre d'une instruction d'assignment.

Un assignment delay waits pendant un time spécifié, puis exécute l'assignment. Le delay est placé after le symbole # et avant l'assignment.

Syntaxe :

variable = #delay expression;

Contrairement à un delay général #10 a = b; (delay puis assign), un assignment delay a = #10 b; prend la valeur de b à ce moment-là, waits 10 time units, puis l'assigns à a.

Assignment Delay vs General Delay

 General DelayAssignment Delay
Sintaxe#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 assignée ?Valeur de b à ce moment-làValeur de b au temps 0 (ou au moment de la lecture)
Quand la valeur est-elle assigné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 result ici. La différence apparaît lorsque b changes during le delay.

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 passe à 0 (pendant que a1 attend toujours)
  • À 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
= va avant #a = #10 b; non a #10 = b;
La valeur est lue immédiatementCôté droit évalué tout de suite
L'affectation a lieu 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 :

Add le assignment delay manquant de sorte que a gets la valeur de b after 15 time units, mais reads 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