Altifigence Academy

6 / 20 · Travaux pratiques

TP : élément de traitement MAC signé

Utilisez un modèle autonome pour vérifier les opérandes valides, les blocages et l’effacement.

Exécuter le contrat d’un PE

Enregistrez ceci sous pe-lab.mjs et exécutez node pe-lab.mjs avec Node.js. Aucun paquet externe n’est utilisé et le programme affiche PE lab passed. Il vérifie un modèle arithmétique et de commande ; il ne compile pas SystemVerilog et ne démontre pas une exécution dans DDS. Considérez le traitement ordinaire à deux termes comme W=8, K=2, AW=17, tandis que le modèle utilise des entiers larges pour sa référence.

Le PE reçoit des drapeaux de validité A et B distincts. Il accumule uniquement lorsqu’ils sont tous deux vrais. La transmission suit le drapeau de validité propre à chaque opérande. Une leçon ultérieure ajoute des étiquettes pour garantir que deux opérandes valides appartiennent au même terme de réduction.

javascript
import assert from 'node:assert/strict';
const pe = {acc:0,a:0,b:0,av:false,bv:false};
function edge({a=0,b=0,av=false,bv=false,
               advance=true,clear=false,reset=false}={}) {
  if (reset || clear) {
    Object.assign(pe,{acc:0,a:0,b:0,av:false,bv:false});
  } else if (advance) {
    if (av && bv) pe.acc += a*b;
    Object.assign(pe,{a,b,av,bv});
  }
  return {...pe};
}
edge({clear:true});
assert.equal(edge({a:-2,b:3,av:true,bv:true}).acc,-6);
const held={...pe};
assert.deepEqual(edge({a:99,b:99,av:true,bv:true,advance:false}),held);
assert.equal(edge({a:4,b:-5,av:true,bv:true}).acc,-26);
assert.equal(edge({a:8,b:8,av:true,bv:false}).acc,-26);
assert.equal(pe.av,true); assert.equal(pe.bv,false);
edge({clear:true,a:100,b:100,av:true,bv:true});
assert.equal(pe.acc,0); assert.equal(pe.av,false);
assert.equal(edge({a:-128,b:-128,av:true,bv:true}).acc,16384);
edge({reset:true,advance:false});
assert.deepEqual(pe,{acc:0,a:0,b:0,av:false,bv:false});
console.log('PE lab passed');

Prévoir et mettre à l’épreuve le résultat

La première paire produit −6. Une pause ignore les valeurs 99 proposées et conserve tout l’état. La paire valide suivante contribue −20, atteignant −26. Le jeton A sans partenaire est transmis, mais ne contribue à aucun MAC. Clear l’emporte sur la paire valide simultanée ; minimum×minimum donne ensuite 16384. Reset efface l’état de validité même lorsque advance est faux.

Traduisez la même priorité dans always_ff avec des signaux product et addend explicitement signés. Lors de la modélisation d’un réseau, lisez l’état précédent et écrivez un état suivant distinct. Mettre à jour les objets PE sur place peut accidentellement permettre à un jeton de traverser plusieurs PE au cours d’un même front.

Remplacez la condition d’accumulation AND par OR. L’assertion sur le jeton sans partenaire doit échouer. Essayez aussi d’appliquer advance uniquement à l’accumulateur tout en laissant la transmission avancer. Expliquez le contrat protégé par chaque assertion ; un seul message de réussite ne constitue pas tout l’objectif pédagogique.

Enregistrez séparément les opérandes proposés et consommés : les valeurs quatre-vingt-dix-neuf pendant la pause sont visibles à l’interface mais jamais consommées. L’enveloppe doit conserver le terme prévu suivant jusqu’à la reprise d’advance. Les copies d’état renvoyées conservent les observations précédentes. Examinez les drapeaux de validité de transmission et l’accumulateur lorsque vous traduisez ces vérifications dans un banc de test à formes d’onde.

RTL réel : le PE MAC signé

Enregistrez ensemble les pièces jointes signed_mac_pe.sv, systolic_2x2.sv et tb_systolic_2x2.sv. Les deux premiers fichiers sont du RTL synthétisable ; le banc de test est réservé à la simulation. Le PE étend le signe de son produit complet sur 2W bits vers AW avant l’accumulation. Les vérifications W=8, K=4 utilisent AW=18 pour 65536, −65024 et 64516. Les étiquettes k ordonnées rejettent les termes incohérents via protocol_error.

La priorité est reset, clear, puis advance. Clear se termine avant le premier front de données. Observez l’accumulateur mis à jour après chaque front montant ; les voisins consomment la transmission enregistrée au front advance suivant. Une pause conserve toutes les valeurs, drapeaux de validité, étiquettes et compteurs. Un traitement s’exécute entre deux effacements, sans quantification de sortie ni intégration DDS.

Avec Icarus Verilog installé, exécutez :

bash
iverilog -g2012 -s tb_systolic_2x2 -o systolic.vvp signed_mac_pe.sv systolic_2x2.sv tb_systolic_2x2.sv
vvp systolic.vvp

Attendez RTL PASS: ; les échecs terminent par $fatal. Modifiez addend pour utiliser une extension par zéros et reproduisez l’échec du produit négatif. Expliquez la première somme préfixe incorrecte, rétablissez l’extension de signe et relancez. Conservez des journaux Node et HDL distincts.

Essayez vous-même

Insérez une paire valide (0, 7) entre (−2, 3) et (4, −5). Quelle est la somme et en quoi un zéro valide diffère-t-il d’un jeton invalide ?

Lire l’explication

La somme vaut −26. Un zéro valide consomme un véritable terme k et fait avancer le comptage des termes et les étiquettes. Un jeton invalide ne consomme aucun terme. Pour un traitement à trois termes, mettez à jour K, l’analyse de largeur et la commande de fin en conséquence.

Lesson files

pe-lab.mjs ↓signed_mac_pe.sv ↓systolic_2x2.sv ↓tb_systolic_2x2.sv ↓

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