Comprendre les instructions assign Verilog : Affectation continue de signaux
Les signaux de type wire ou types similaires nécessitent une affectation continue de valeur. Exemple : fil électrique sur breadboard connectant pièces. Tant que batterie +5V appliquée à une extrémité, composant à l'autre extrémité reçoit la tension requise.

En Verilog, ce concept est réalisé par l'instruction assign où tout wire ou type similaire peut être piloté continuellement avec une valeur (constante ou expression de signaux).
Syntaxe assign
Syntaxe : mot-clé assign suivi du nom de signal (signal unique ou concaténation de nets). Force de pilotage (drive strength) et délai optionnels, utilisés surtout pour modélisation dataflow que synthèse réelle. Expression ou signal côté droit évalué et assigné au net ou expression de nets côté gauche.
assign = [drive_strength] [delay]
Valeurs de délai utiles pour spécifier délais de portes et modéliser comportement temporel matériel réel car dictent quand net doit être assigné avec valeur évaluée.
Règles
- Côté gauche (LHS) : toujours scalaire/vecteur net ou concaténation, jamais registre scalaire/vecteur.
- Côté droit (RHS) : peut contenir registres scalaires/vecteurs et appels de fonctions.
- Chaque fois qu'un opérande RHS change de valeur, LHS mis à jour avec nouvelle valeur.
- Instructions
assign= affectations continues, toujours actives.
Exemple #1
Net out piloté continuellement par expression de signaux i1 et i2 avec ET logique &.

Si fils convertis en ports et synthétisés, schéma RTL comme ci-dessous :

L'instruction d'affectation continue peut représenter des portes combinatoires en Verilog.
Exemple #2
Module prend deux entrées et utilise assign pour piloter sortie z avec part-select et concaténations multi-bit. Traiter chaque cas comme seul code dans module, sinon plusieurs assign sur même signal feront sortie devenir X.
module xyz (input [3:0] x, input y, output [4:0] z);
wire [1:0] a; wire b;
// Supposons x='hC et y='h1, voyons valeur z
// Cas #1: 4-bit x + 1-bit y concaténés -> 5-bit net assigné à z 5-bit. z='b11001 ou 'h19
assign z = {x, y};
// Cas #2: même concaténation assignée à 3-bit sélectionnés de z. 2 bits restants non pilotés -> haute impédance. z='bZ001Z
assign z[3:1] = {x, y};
// Cas #3: bit4 de z piloté avec constante 1. z='b1001Z (bit0 non piloté)
assign z[3:1] = {x, y}; assign z[4] = 1;
// Cas #4: bit3 piloté au lieu, deux drivers pour bit3, même valeur 0 -> pas contention. z='bZ001Z
assign z[3:1] = {x, y}; assign z[3] = 0;
// Cas #5: bit3 piloté valeur 1, deux drivers valeurs différentes (premier 0, second 1) -> inconnu. z='bZX01Z
assign z[3:1] = {x, y}; assign z[3] = 1;
// Cas #6: Sélection partielle opérandes RHS possible, ex 2-bit de x. z='b00001
assign z = {x[1:0], y};
// Cas #7: Assigner explicitement 3-bit de z, laisser reste non connecté. z='bZZ001
assign z[2:0] = {x[1:0], y};
// Cas #8: Même variable utilisée plusieurs fois. z='b00111. 3{y} = {y, y, y}
assign z = {3{y}};
// Cas #9: LHS concaténé: a 2-bit, b scalaire. RHS évalué 11001, LHS 3-bit -> 3 bits LSB de RHS assignés à LHS. a='b00, b='b1
assign {a, b} = {x, y};
// Cas #10: Inverser ordre LHS, RHS même. a='b01, b='b0
assign {b, a} = {x, y};
endmodule
Assigner variables reg
Illégal de piloter/assigner variables reg avec assign. reg stocke données, n'a pas besoin pilotage continu. Signaux reg seulement pilotables dans blocs procéduraux initial et always.
Affectation continue implicite
Quand assign utilisé pour assigner net avec valeur = explicite. Verilog permet assignation à la déclaration = implicite.
wire [1:0] a; assign a = x & y; // Explicite
wire [1:0] a = x & y; // Implicite
Conception logique combinatoire
Circuit numérique à portes combinatoires et code Verilog correspondant.

Logique combinatoire nécessite entrées pilotées continûment pour maintenir sortie (contrairement éléments séquentiels comme bascules où valeur capturée/stockée au front d'horloge). assign convient bien car sortie o mise à jour quand entrées RHS changent.
module combo (input a, b, c, d, output o);
assign o = ~((a & b) | c ^ d);
endmodule
Schéma matériel
Après élaboration et synthèse, circuit combinatoire se comportant comme modélisé par assign.

Signal o devient 1 quand expression RHS vraie, 0 quand fausse. o = X de 0ns à 10ns car entrées X pendant même temps.

Cliquez ici pour diaporama avec exemple simulation !
Verilog
- Maîtriser l'instruction Switch C# : Syntaxe, exemples et bonnes pratiques
- Instruction Break C# : Comment et quand l'utiliser
- Maîtriser l'instruction Continue C# : Comment ignorer efficacement les itérations de boucle
- Maîtriser la concaténation Verilog : Guide pratique
- Comprendre les affectations Verilog : Types, Syntaxe et Bonnes Pratiques
- Verilog Blocking vs Non-Blocking : Différences Clés Expliquées
- Maîtriser les Fonctions Verilog pour une Conception RTL Efficace
- Comprendre les Tasks Verilog : Fonctions vs Tasks, Syntaxe et Utilisation
- Générateur d'Horloge Verilog : Guide de Conception et d'Implémentation