Altifigence Academy

15 / 37 · Concept

Affectations non bloquantes et mise à jour simultanée

Séparer anciennes et prochaines valeurs pour interpréter correctement pipelines et compteurs RTL.

Évaluer le membre droit sur l'état précédent

Dans un bloc séquentiel cadencé, <= évalue le membre droit puis applique le résultat lors de la mise à jour non bloquanteAffectation non bloquante Affectation <= du RTL séquentiel : le membre droit est évalué puis la mise à jour planifiée, permettant aux registres du même front de calculer à partir de l'ancien état.. Plusieurs registresRegistre Circuit stockant plusieurs bits d'état. Les registres synchrones du cours capturent leur entrée définie sur un front d'horloge. En savoir plus peuvent ainsi changer au même front sans que les nouvelles valeurs traversent les lignes successives du code.

SystemVerilog
always_ff @(posedge clk) begin
  if (rst) begin
    a <= 8'd0;
    b <= 8'd0;
  end else begin
    a <= d;
    b <= a;
  end
end
ak+1=dk,bk+1=aka_{k+1}=d_k,\qquad b_{k+1}=a_k

Avec a=b=0 et les entrées 5,9,2, les couples après les fronts sont (5,0),(9,5),(2,9). Lire a déjà mis à jour dans la deuxième ligne supprimerait un étage de pipelinePipeline Structure divisant le calcul en étages séparés par des registres pour traiter plusieurs entrées en recouvrement. Données, valid et commandes doivent rester alignés. En savoir plus.

Chaque colonne observe un front montantFront montant Instant où l'horloge passe de 0 à 1, distinct du niveau désignant tout l'intervalle CLK=1. En savoir plus. Les entrées sont celles d'avant le front et after désigne l'état après mise à jour ; l'alignement n'est pas un retard physiqueRetard de propagation Temps nécessaire après un changement d'entrée pour que la sortie se stabilise à sa valeur correcte. Équivalence logique et caractéristiques temporelles sont distinctes. En savoir plus. À partir de a=b=0, a stocke le nouveau d tandis que b stocke l'ancien a : les lignes sont décalées d'un étage.

a et b lisent le même état précédent
Voir les données du chronogramme
Données du chronogramme : chaque caractère représente un intervalle ; un point maintient l'état précédent ; p représente un cycle d'horloge.
SignalForme d'ondeValeurs du bus
edge234E0 → E1 → E2
d2345 → 9 → 2
a après2345 → 9 → 2
b après2340 → 5 → 9

Pourquoi remplacer par des affectations bloquantes est risqué

Avec a=d; b=a; dans un même bloc, b peut utiliser a déjà modifié. L'ordonnancement avec d'autres blocs séquentiels peut aussi créer une course. Par défaut, utilisez les affectations bloquantes pour les calculs combinatoires et non bloquantes pour l'état ; une exception exige de maîtriser les événements.

Éviter plusieurs affectations au même registre

Si plusieurs affectations non bloquantes de q s'exécutent dans une procédure, la dernière exécutée peut déterminer le résultat. Préférez if / else if / else ou une variable explicite d'état suivant à plusieurs if indépendants masquant la priorité. Évitez plusieurs blocs pilotant un même registre.

En revue RTL, écrivez une équation d'état suivant par registre. Deux équations ou une condition non définie invitent à réexaminer les priorités.

Essayez vous-même

À partir de a=1,b=4, un même bloc cadencé exécute a<=b; b<=a;. Donnez l'état après un puis deux fronts.

Lire l’explication

Après un front, (a,b)=(4,1) ; après deux, (1,4). Les affectations lisent le même état précédent et échangent les valeurs. Avec a=b; b=a;, les deux peuvent devenir l'ancien b : ce n'est pas la même fonction.

Votre choix s’applique à ce navigateur. Modifiez-le à tout moment en bas de page.