Menu
Coddy logo textTech

Affectation bloquante

Fait partie de la section Fondamentaux du Journey Verilog de Coddy — leçon 49 sur 90.

Le Verilog possède deux types d'affectations procédurales : bloquante (=) et non bloquante (<=). Dans cette leçon, nous nous concentrons sur l'affectation bloquante.

L'affectation bloquante utilise l'opérateur =. Elle est appelée « bloquante » car elle bloque l'exécution de l'instruction suivante jusqu'à ce que l'affectation actuelle soit terminée. Le code s'exécute étape par étape, dans l'ordre.

Syntaxe :

variable = expression;

Quand utiliser l'affectation bloquante

L'affectation bloquante (=) est utilisée pour la logique combinatoire — des circuits où les sorties changent immédiatement lorsque les entrées changent, sans horloge et sans mémoire.

Exemples de logique combinatoire :

  • Portes AND / OR / XOR
  • Additionneurs et soustracteurs
  • Multiplexeurs
  • Décodeurs

Exemple Verilog :

always @(*) begin
  sum = a + b;      // Affectation bloquante
  carry = a & b;    // Affectation bloquante
end

Affectations bloquantes dans les blocs Always (Logique combinatoire)

always @(*) begin
  temp = a & b;    // Étape 1
  out = temp | c;  // Étape 2 (utilise temp de l'étape 1)
end

L'ordre est important. Cela convient pour la logique combinatoire.

Bloquant vs Non-bloquant

 Bloquant (=)Non-bloquant (<=)
ExécutionL'un après l'autreTous en même temps
La ligne suivante attend ?OuiNon
UtilisationsLogique combinatoireLogique séquentielle (bascules)

Important : Ne pas utiliser d'affectations bloquantes pour les bascules (Flip-Flops)

challenge icon

Défi

Ajoutez les affectations bloquantes manquantes pour échanger les valeurs de x et y en utilisant une variable temporaire.

Ce qu'il faut faire :

  1. Affectez la valeur de x à temp (sauvegardez x dans temp)
  2. Affectez la valeur de y à x (déplacez y dans x)
  3. Affectez la valeur de temp à y (déplacez le x sauvegardé dans y)

Aide-mémoire

L'affectation bloquante (=) s'exécute de manière séquentielle — chaque instruction se termine avant que la suivante ne commence. Elle est utilisée pour la logique combinatoire à l'intérieur des blocs always @(*).

always @(*) begin
  temp = a & b;    // Étape 1
  out = temp | c;  // Étape 2 (utilise la valeur mise à jour de temp)
end
Bloquante (=) Non bloquante (<=)
Exécution L'une après l'autre Toutes en même temps
Utilisation pour Logique combinatoire Logique séquentielle (bascules)

Essayez vous-même

module swap;
  reg x, y;
  reg temp;
  
  initial begin
    x = 1;
    y = 0;
    
    $display("Before swap: x=%d, y=%d", x, y);
    
    // À FAIRE : Étape 1 - Assigner x à temp
    
    // À FAIRE : Étape 2 - Assigner y à x
    
    // À FAIRE : Étape 3 - Assigner temp à y
    
    $display("After swap: x=%d, y=%d", x, y);
    $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