Altifigence Academy

9 / 24 · Concept

Stocker la transaction complète aux frontières du pipeline

Séparez la somme et la mise à l’échelle tout en alignant valid, l’étiquette et les largeurs.

Une frontière de registre transporte une signification autant que des bits

Découpez f(a, b)=3(a+b) en deux étages. Le premier stocke sur neuf bits la somme de deux opérandes non signés sur huit bits. Le deuxième forme une valeur mise à l’échelle sur onze bits et stocke ses huit bits de poids faible. Le résultat large maximal vaut 1530. Réduire la somme intermédiaire conserve ici la valeur finale modulo 256 de cette expression entière, mais perdrait l’information nécessaire au signalement du débordement ou à des comparaisons ultérieures. Gardez la largeur intermédiaire explicite.

Chaque étage stocke valid et l’étiquette avec les données. Valid à zéro indique une bulle. D’anciens bits de données peuvent rester dans un étage vide, mais ne doivent pas compter comme une transaction. Une étiquette nécessite le même retard par registres que sa valeur. Deux registres de données avec un seul registre d’étiquette associent l’identité de la transaction B au résultat de la transaction A.

Ce cœur suppose l’absence de blocages et des ports toujours prêts. Étendez s1 et dimensionnez la constante avant la multiplication. Le deuxième étage lit les anciens s1 et t1 ; la nouvelle entrée ne peut pas traverser les deux registres au même front.

SystemVerilog
logic [8:0] s1;
logic [7:0] s2, t1, t2;
logic v1, v2;
logic [10:0] scaled;
assign scaled = {2'b00, s1} * 11'd3;
always_ff @(posedge clk) begin
  if (rst) begin
    v1 <= 1'b0;
    v2 <= 1'b0;
  end else begin
    v1 <= in_valid;
    v2 <= v1;
    if (in_valid) begin
      s1 <= {1'b0, a} + {1'b0, b};
      t1 <= in_tag;
    end
    if (v1) begin
      s2 <= scaled[7:0];
      t2 <= t1;
    end
  end
end

Acceptez A=(1, 2) au front 0 : ensuite, s1=3. Acceptez B=(250, 10) au front 1 : s1 devient 260 tandis que s2 stocke le résultat 9 de A. A est valide après le front 1 et peut être transféré au front 2. B produit ensuite 780 modulo 256, soit 12.

Faites aussi circuler les bulles dans les registres valid. Conserver l’ancien v1=1 en l’absence d’entrée peut dupliquer une transaction. La réinitialisation efface l’état valid pour empêcher d’anciennes données de devenir un nouveau résultat. À chaque frontière, listez tous les champs associés : opération, étiquette, exception, adresse ou marqueur de fin de paquet. Vérifiez que ces champs restent ceux d’une même transaction tout au long du pipeline.

Essayez vous-même

A=(1, 2, tag=10) et B=(250, 10, tag=11) sont acceptées consécutivement. Si l’on utilise t2<=in_tag, quelle étiquette accompagne le résultat de A ? Donnez la connexion correcte.

Lire l’explication

Au front 1, s2 calcule l’ancienne transaction A alors que in_tag courant vaut 11 : le résultat 9 reçoit donc l’étiquette 11. Utilisez t2<=t1 pour capturer l’ancienne étiquette 10 de A au premier étage.

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