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.
Les leçons sont gratuites. Inscrivez-vous pour enregistrer vos progrès.
É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.
always_ff @(posedge clk) begin
if (rst) begin
a <= 8'd0;
b <= 8'd0;
end else begin
a <= d;
b <= a;
end
endAvec 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.
Voir les données du chronogramme
| Signal | Forme d'onde | Valeurs du bus |
|---|---|---|
| edge | 234 | E0 → E1 → E2 |
| d | 234 | 5 → 9 → 2 |
| a après | 234 | 5 → 9 → 2 |
| b après | 234 | 0 → 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.