Affectation bloquante (=) vs non bloquante (<=) en Verilog
Ce sont deux affectations utilisées dans les blocs always de Verilog, mais le membre de gauche n'est pas mis à jour au même moment. L'affectation bloquante (=) met à jour le membre de gauche dès que la ligne est exécutée, et la ligne suivante utilise la nouvelle valeur. L'affectation non bloquante (<=) évalue d'abord tous les membres de droite du même instant, puis met à jour ensemble les membres de gauche. La règle de base est d'utiliser <= pour la logique séquentielle cadencée par l'horloge et = pour les always de logique combinatoire.
| Critère | Affectation bloquante (=) | Affectation non bloquante (<=) |
|---|---|---|
| Écriture | a = b; | a <= b; |
| Mise à jour du membre de gauche | Immédiate, dès que la ligne est exécutée | Groupée, après l'évaluation de tous les membres de droite du même instant |
| Valeur vue par la ligne suivante | La nouvelle valeur, après mise à jour | L'ancienne valeur, avant mise à jour |
| Dépendance à l'ordre d'écriture | Oui. Permuter les lignes change le résultat | Quasi nulle. Toutefois, si une même variable est affectée deux fois, c'est la dernière affectation qui l'emporte |
| Comportement matériel correspondant | Logique combinatoire qui calcule les valeurs intermédiaires dans l'ordre, de haut en bas | Bascules qui capturent toutes leurs valeurs en même temps au front d'horloge |
| Usage principal | always @(*) de logique combinatoire, procédures de testbench | always @(posedge clk) de logique séquentielle cadencée par l'horloge |
| Registre à décalage à deux étages (bloc cadencé par l'horloge) | Avec q1 = d; q2 = q1;, q2 reçoit aussi d au même front : un seul étage de retard | Avec q1 <= d; q2 <= q1;, q2 reçoit la valeur de q1 d'avant le front : deux étages |
| Échange de valeurs (bloc cadencé par l'horloge) | Avec a = b; b = a;, a et b prennent la même valeur | Avec a <= b; b <= a;, a et b sont échangés |
| Entre plusieurs blocs always | Entre blocs déclenchés par le même front, des courses (race) où le résultat dépend de l'ordre d'exécution apparaissent facilement | Les membres de droite sont tous évalués d'abord, d'où peu de courses |
| En cas de mauvais usage | Utilisée en logique séquentielle, le résultat dépend de l'ordre d'exécution des blocs et peut différer du comportement du circuit synthétisé | Utilisée en logique combinatoire, des valeurs intermédiaires périmées sont lues : la simulation peut différer du circuit synthétisé, ou le bloc est réexécuté inutilement |
Les valeurs indiquées sont des ordres de grandeur typiques et varient selon la génération de procédé et le produit.