Altifigence Academy

5 / 24 · Concept

Lire les transferts entre registres aux fronts d’horloge

Distinguez l’état précédent de l’état suivant et suivez la conservation des valeurs stockées par les signaux d’activation.

Tous les registres lisent l’état précédent

Commencez par identifier l’information qui doit subsister entre les cycles. Un accumulateur, des opérandes capturés, un compteur de boucle et le signal de validité de sortie sont des états. La somme de l’accumulateur courant et de l’opérande est une valeur combinatoire. Écrire une variable n’explique pas à lui seul son stockage ; précisez l’événement qui capture sa valeur.

Cet accumulateur ajoute x uniquement aux fronts montants où en est actif. Lorsque en est bas, il conserve sa valeur. Un résultat intermédiaire sur neuf bits rend l’addition explicite ; la sélection de ses huit bits de poids faible définit un comportement modulo 256. Les affectations non bloquantes dans always_ff planifient l’état suivant à partir des valeurs lues au front courant. Interpréter ce bloc comme des affectations logicielles immédiates conduit à une lecture incorrecte lorsque plusieurs registres interviennent.

SystemVerilog
logic [7:0] acc;
logic [8:0] next_sum;
assign next_sum = {1'b0, acc} + {1'b0, x};
always_ff @(posedge clk) begin
  if (rst) acc <= 8'd0;
  else if (en) acc <= next_sum[7:0];
end

La réinitialisation est synchrone et prioritaire sur l’activation. L’absence d’affectation séquentielle lorsque en est bas signifie que le registre conserve sa valeur. L’absence d’affectation dans un chemin combinatoire peut en revanche inférer un verrou involontaire. Dans une logique combinatoire d’état suivant, fournissez des valeurs par défaut, puis remplacez-les pour les conditions particulières.

FrontrstenxAncien accNouvel acc
0119Inconnu0
101707
20010077
30125071

Au front 2, l’entrée visible 100 n’a pas été acceptée. Au front 3, 7+250=257 est réduit à 1. Distinguer la présentation de l’acceptation reste essentiel lorsque en devient ensuite valid ET ready.

Pour a<=x; b<=a;, les anciennes valeurs a=5 et x=9 produisent a=9 et b=5. Si b doit recevoir 9, connectez son entrée à x. Complétez d’abord la colonne de l’état précédent, puis calculez toutes les valeurs de l’état suivant ensemble ; cela révèle les décalages d’un cycle entre données et commande.

Essayez vous-même

Initialement, a=4 et b=0. Les entrées x valent 8 puis 12, avec a<=x; b<=a à chaque front. Que valent a et b après le deuxième front ?

Lire l’explication

Après le premier front, a=8 et b=4. Après le deuxième, a=12 et b=8. Chaque mise à jour de b utilise l’ancien a : x=12 ne traverse donc pas les deux registres au même front.

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