Altifigence Academy

15 / 20 · Übung

Praktikum: Rückstau und Reset

Führen Sie globale Pause, Ergebniserhaltung und Reset eines unterbrochenen Auftrags aus.

Logische Zeit als eine Einheit pausieren

Unser Lernarray verwendet globales advance. Der Randablaufplaner und jedes PE bewegen sich nur, wenn das Bündel des nächsten logischen Schritts verfügbar ist. Eine als ungültig geplante Spur benötigt keinen echten Operanden. Wenn nur ein Datenstrom weiterläuft, wird der Versatz zerstört. Unabhängig angehaltene Verbindungen benötigen zusätzliche Pufferung und Zuordnungsregeln außerhalb dieser Grundvariante.

Die Ausgabe verwendet separate valid/ready-Regeln. Sobald ein Ergebnis bereitsteht, halten Sie valid, data und job stabil, bis eine Flanke mit valid&&ready es genau einmal überträgt. Die einfache Hülle startet keinen neuen Auftrag, solange ein altes Ergebnis aussteht. Die Bereitschaft des Empfängers muss die Berechnung nicht stoppen, wenn ausreichender Ergebnisspeicher vorhanden ist.

Speichern Sie dies als stall-lab.mjs und führen Sie node stall-lab.mjs aus. Es modelliert ein PE mit zwei Termen und einem Ergebnisregister, benötigt keine Pakete und gibt Stall/reset lab passed aus.

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');

Die Prüfungen interpretieren

Eine Pause hält die erste Summe −6 und die Ablaufposition. Der zweite Term ergibt −26. Zwei blockierte Ausgabeflanken erhalten das Ergebnis; eine bereite Flanke überträgt es einmal. Reset während eines unvollständigen Auftrags löscht dessen Akkumulator, Position und Ergebnisgültigkeit, sodass die Wiederaufnahme den Auftrag neu beginnt.

Zwei globale Pausen im vierstufigen 2×2-Ablauf ergeben vier advance-Flanken und sechs physische Flanken. Ergebnisse und Listen verarbeiteter k-Werte müssen dem Lauf ohne Wartezyklen entsprechen. Die logische Abschlussformel bleibt unverändert.

Dies ist eine synchrone Steuerungsreferenz. Physische Reset-Synchronisation und Taktdomänenübergänge erfordern einen separaten Entwurf. Ein durch Reset abgebrochener Auftrag darf niemals erfolgreichen Abschluss melden; leeren Sie vorgelagerte Puffer vor dem Neustart. Modellerfolg belegt keine RTL-, Installations- oder Hardwareabnahme.

Selbst ausprobieren

Halten Sie valid=1 und ready=0 für drei Flanken und setzen Sie dann ready. Welche Signale müssen gehalten werden, wie viele Übertragungen erfolgen und was geschieht, wenn beim Warten Reset eintrifft?

Erklärung lesen

Halten Sie data, job und valid. Beim Warten werden Null Ergebnisse übertragen; die bereite Flanke überträgt eines. Reset verwirft den ausstehenden Gültigkeitszustand und darf diesen Auftrag nicht als erfolgreich ausgeben. Eine Abbruchmeldung benötigt separate Statusregeln.

Lesson files

stall-lab.mjs ↓

Deine Auswahl gilt für diesen Browser. Du kannst sie jederzeit in der Fußzeile ändern.