Altifigence Academy

6 / 20 · Übung

Praktikum: ein vorzeichenbehaftetes MAC-Verarbeitungselement

Prüfen Sie gültige Operanden, Wartezyklen und Löschen mit einem eigenständigen Modell.

Die Verhaltensregeln eines PE ausführen

Speichern Sie dies als pe-lab.mjs und führen Sie node pe-lab.mjs mit Node.js aus. Es verwendet keine externen Pakete und gibt PE lab passed aus. Damit wird ein Arithmetik-/Steuerungsmodell geprüft; weder wird SystemVerilog kompiliert noch eine Ausführung in DDS nachgewiesen. Betrachten Sie den gewöhnlichen Auftrag mit zwei Termen als W=8, K=2, AW=17, während das Modell breite Ganzzahlen als Referenz nutzt.

Das PE erhält getrennte Gültigkeitsflags für A und B. Es akkumuliert nur, wenn beide wahr sind. Die Weitergabe folgt dem eigenen Gültigkeitsflag jedes Operanden. Eine spätere Lektion ergänzt Tags, um sicherzustellen, dass zwei gültige Operanden zum selben Reduktionsterm gehören.

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

Das Ergebnis vorhersagen und hinterfragen

Das erste Paar ergibt −6. Eine Pause ignoriert die angebotenen Werte 99 und hält den gesamten Zustand. Das nächste gültige Paar trägt −20 bei und erreicht −26. Das ungepaarte A-Token wird weitergegeben, trägt aber kein MAC bei. Löschen hat Vorrang vor dem gleichzeitig gültigen Paar; Minimum×Minimum ergibt anschließend 16384. Reset löscht den Gültigkeitszustand auch bei advance false.

Übertragen Sie dieselbe Priorität auf always_ff mit ausdrücklich vorzeichenbehafteten Produkt- und Summandensignalen. Lesen Sie beim Modellieren eines Arrays den alten Zustand und schreiben Sie einen getrennten Folgezustand. Werden PE-Objekte unmittelbar verändert, kann ein Token versehentlich mehrere PEs innerhalb einer Flanke durchlaufen.

Ändern Sie die Akkumulationsbedingung von AND in OR. Die Assertion für das ungepaarte Token muss fehlschlagen. Versuchen Sie auch, advance nur auf den Akkumulator anzuwenden und die Weitergabe trotzdem laufen zu lassen. Erklären Sie, welche Regel jede Assertion schützt; eine Erfolgsmeldung allein ist nicht das vollständige Lernziel.

Erfassen Sie angebotene Operanden getrennt von verarbeiteten Operanden: Die angehaltenen Werte neunundneunzig sind an der Schnittstelle sichtbar, werden aber niemals verarbeitet. Die Hülle muss den nächsten geplanten Term halten, bis advance wieder fortgesetzt wird. Zurückgegebene Zustandskopien erhalten frühere Beobachtungen. Prüfen Sie bei der Übertragung dieser Prüfungen auf eine Testbench mit Wellenformen neben dem Akkumulator auch die Gültigkeitsflags der Weitergabe.

Tatsächliches RTL: das vorzeichenbehaftete MAC-PE

Speichern Sie die Anhänge signed_mac_pe.sv, systolic_2x2.sv und tb_systolic_2x2.sv gemeinsam. Die ersten beiden Dateien sind synthetisierbares RTL; die Testbench dient nur der Simulation. Das PE erweitert sein vollständiges 2W-Bit-Produkt vor der Akkumulation mit Vorzeichen auf AW. Prüfungen mit W=8,K=4 verwenden AW=18 für 65536, −65024 und 64516. Geordnete k-Tags lehnen nicht passende Terme über protocol_error ab.

Die Priorität lautet Reset, Löschen, dann advance. Löschen endet vor der ersten Datenflanke. Beobachten Sie den aktualisierten Akkumulator nach jeder steigenden Flanke; Nachbarn verarbeiten registrierte Weitergabe an der nächsten advance-Flanke. Eine Pause hält jeden Wert, Gültigkeitsflag, Tag und Zähler. Zwischen Löschvorgängen läuft ein Auftrag ohne Ausgabequantisierung oder DDS-Integration.

Führen Sie bei installiertem Icarus Verilog Folgendes aus:

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

Erwarten Sie RTL PASS:; Fehler beenden mit $fatal. Ändern Sie addend auf Nullerweiterung und reproduzieren Sie den Fehler der Matrix mit negativen Werten. Erklären Sie den ersten abweichenden PE-Akkumulator, stellen Sie Vorzeichenerweiterung wieder her und führen Sie erneut aus. Bewahren Sie getrennte Node- und HDL-Protokolle auf.

Selbst ausprobieren

Fügen Sie ein gültiges Paar (0,7) zwischen (−2,3) und (4,−5) ein. Wie lautet die Summe und worin unterscheidet sich eine gültige Null von einem ungültigen Token?

Erklärung lesen

Die Summe beträgt −26. Eine gültige Null verbraucht trotzdem einen echten k-Term und lässt Termzählung und Tags fortschreiten. Ein ungültiges Token verbraucht keinen Term. Aktualisieren Sie für einen Auftrag mit drei Termen K, Breitenanalyse und Abschlusssteuerung entsprechend.

Lesson files

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

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