Altifigence Academy

11 / 24 · Travaux pratiques

TP : suivre deux étages et les bulles

Calculez l’état suivant à partir de l’état précédent et comparez les étiquettes, les valeurs et les fronts de sortie.

Modéliser des registres mis à jour ensemble

Construisez un modèle par cycles de la fonction à deux étages f(a, b)=3(a+b). Chaque itération représente un front montant. Consommez d’abord l’ancien s2. Calculez ensuite le nouveau deuxième étage à partir de l’ancien s1, puis mettez à jour les deux étages. Mettre à jour s1 avant de calculer s2 permet à tort à une entrée de franchir deux registres au même front.

Ajoutez manuellement pipeline-model.mjs à votre projet, enregistrez-le et exécutez node pipeline-model.mjs dans un terminal Node.js. Acceptez quatre entrées aux fronts 0 à 3, puis vidangez aux fronts 4 et 5. Toutes les entrées sont acceptées selon ce contrat toujours prêt. Null représente un étage vide, et non le nombre zéro. Un résultat zéro valide représente bien une transaction.

javascript
import assert from 'node:assert/strict';
const inputs = [[1,2], [250,10], [100,0], [255,255]];
let s1 = null, s2 = null;
const seen = [];
for (let edge = 0; edge < 6; edge++) {
  if (s2 !== null) seen.push({ edge, ...s2 });
  const next2 = s1 === null ? null : {
    tag: s1.tag, y: (s1.sum * 3) % 256
  };
  const next1 = edge < inputs.length ? {
    tag: edge, sum: inputs[edge][0] + inputs[edge][1]
  } : null;
  s1 = next1;
  s2 = next2;
}
assert.deepEqual(seen, [
  { edge: 2, tag: 0, y: 9 },
  { edge: 3, tag: 1, y: 12 },
  { edge: 4, tag: 2, y: 44 },
  { edge: 5, tag: 3, y: 250 }
]);
assert.equal(s1, null);
assert.equal(s2, null);
console.log('PIPELINE PASS: 4 ordered results, latency=2');
FrontEntrée acceptéeSortie livrée
0tag0: 1+2Aucune
1tag1: 250+10Aucune
2tag2: 100+0tag0: y9
3tag3: 255+255tag1: y12
4Bulletag2: y44
5Bulletag3: y250

La deuxième transaction conserve la somme 260 et réduit 780 à 12. La dernière réduit 1530 à 250. Comparer explicitement le front, l’étiquette et la valeur détecte les erreurs temporelles autant que les erreurs arithmétiques. Les bulles de vidange vident les deux étages pour empêcher la répétition d’anciennes sorties.

Pour explorer les entrées manquantes, insérez null à certains fronts d’acceptation et incrémentez les étiquettes uniquement pour les transactions acceptées. Les interruptions en sortie suivent les bulles, tandis que les transactions valides conservent une latence de deux fronts. Ce modèle ne comporte pas de contre-pression en sortie. Le chapitre suivant ajoute un comportement élastique. La réussite des vérifications Node valide ce modèle d’état, et non une compilation HDL ou une exécution de simulation DDS.

Essayez vous-même

S’il n’y a aucune entrée au front 1 et que B, C, D sont acceptées aux fronts 2, 3, 4, quels sont les fronts de livraison des étiquettes 0 à 3 ?

Lire l’explication

A est transférée au front 2. B, C, D sont transférées aux fronts 4, 5, 6. Le front 3 est une bulle de sortie. Attribuez les étiquettes dans l’ordre d’acceptation, 0, 1, 2, 3, au lieu d’utiliser le numéro du front physique.

Lesson files

pipeline-model.mjs ↓

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