Altifigence Academy

15 / 20 · Travaux pratiques

TP : contre-pression et réinitialisation

Exécutez pause globale, conservation du résultat et réinitialisation d’un traitement interrompu.

Suspendre le temps logique comme un ensemble

Notre réseau pédagogique utilise advance global. L’ordonnanceur de frontière et chaque PE n’avancent que lorsque le groupe de l’étape logique suivante est disponible. Une voie prévue invalide ne nécessite pas d’opérande réel. Avancer un seul flux rompt le décalage. Des liaisons bloquées indépendamment nécessitent des tampons et règles de correspondance supplémentaires, au-delà de cette base.

La sortie utilise un contrat valid/ready distinct. Dès qu’un résultat est prêt, maintenez valid, les données et job stables jusqu’à un front valid&&ready qui le transfère exactement une fois. L’enveloppe simple ne démarre aucun nouveau traitement tant qu’un ancien résultat attend. La disponibilité du consommateur n’a pas besoin d’arrêter le calcul si le stockage des résultats est suffisant.

Enregistrez ceci sous stall-lab.mjs et exécutez node stall-lab.mjs. Il modélise un PE à deux termes et un registre de résultat, ne nécessite aucun paquet et affiche Stall/reset lab passed.

javascript
import assert from 'node:assert/strict';
let s;
function reset(){s={step:0,acc:0,valid:false,data:0,job:7};}
const pairs=[[-2,3],[4,-5]];
function tick({advance=true,ready=false,rst=false}={}){
 if(rst){reset();return null;}
 if(s.valid){if(!ready)return null;
  const out={data:s.data,job:s.job};s.valid=false;return out;}
 if(advance&&s.step<pairs.length){
  const [a,b]=pairs[s.step];s.acc+=a*b;s.step++;
  if(s.step===pairs.length){s.data=s.acc;s.valid=true;}}
 return null;
}
reset();tick();assert.equal(s.acc,-6);
const held={...s};tick({advance:false});assert.deepEqual(s,held);
tick();assert.equal(s.data,-26);assert.equal(s.valid,true);
const blocked={...s};tick({ready:false});tick({ready:false});
assert.deepEqual(s,blocked);
assert.deepEqual(tick({ready:true}),{data:-26,job:7});
assert.equal(tick({ready:true}),null);
reset();tick();tick({rst:true,advance:false});
assert.deepEqual(s,{step:0,acc:0,valid:false,data:0,job:7});
tick();tick();assert.equal(s.data,-26);
console.log('Stall/reset lab passed');

Interpréter les vérifications

Une pause conserve la première somme −6 et la position d’ordonnancement. Le deuxième terme produit −26. Deux fronts de sortie bloqués conservent le résultat ; un front prêt le transfère une fois. Reset pendant un traitement incomplet efface son accumulateur, sa position et la validité du résultat : la reprise redémarre donc le traitement.

Ajouter deux pauses globales à l’ordonnancement 2×2 à quatre étapes donne quatre fronts advance et six fronts physiques. Les résultats et listes k consommées doivent correspondre à l’exécution sans blocage. La formule logique de fin reste inchangée.

C’est une référence de commande synchrone. La synchronisation physique de reset et le franchissement de domaines d’horloge nécessitent une conception distincte. Un traitement abandonné par reset ne doit jamais annoncer une fin réussie ; effacez les tampons amont avant de redémarrer. La réussite du modèle n’établit pas l’acceptation RTL, de l’application installée ou du matériel.

Essayez vous-même

Maintenez valid=1 et ready=0 pendant trois fronts, puis activez ready. Quels signaux doivent être conservés, combien de transferts ont lieu et que se passe-t-il si reset arrive pendant l’attente ?

Lire l’explication

Conservez données, job et valid. L’attente transfère zéro résultat ; le front prêt en transfère un. Reset abandonne l’état valid en attente et ne doit pas livrer ce traitement comme réussi. Une notification d’annulation nécessite un contrat de statut distinct.

Lesson files

stall-lab.mjs ↓

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