15 / 24 · Übung
Praktikum: Fenster, die Pausen überstehen
Ändern sich Fensterwerte oder Anzahl, wenn stattdessen Takt Null, eins und zwei pausiert werden und schließlich alle Eingaben übernommen werden? Wie groß ist die Gesamttaktzahl?
Lektionen sind frei lesbar. Schreibe dich ein, um deinen Fortschritt zu speichern.
Ziel und Ausführung
Erzeugen Sie 3×3-Fenster aus einer seriellen Eingabe und verifizieren Sie, dass Pausen Werte und Reihenfolge erhalten. Erstellen Sie window-lab.mjs, kopieren Sie den Code und führen Sie node window-lab.mjs aus. Es benötigt Node.js und kein Paket. Sie können dieselbe Datei über einen unterstützten Dateiablauf in installiertem Digital Design Studio manuell erstellen und untersuchen. Dies belegt keine Ausführung innerhalb von DDS und keine automatische Erstellung eines entfernten Projekts.
Das Modell pausiert nur die Übernahme von Eingaben. Es implementiert weder ein vollständiges output-ready-Protokoll noch Speicherbus, Auffüllung, Dilatation oder Mehrkanaleinheit. Einträge in stalls bezeichnen vergangene Takte; accepted bezeichnet Eingabepositionen. Die Trennung dieser Zähler ist der Zweck der Übung. Eine Pause lässt Puffer, Fenster und Eingabeindex unverändert.
Durchgerechnete Erwartungen
Interpretieren Sie eins bis sechzehn mit Breite vier. Das erste normale Fenster hat acceptedIndex zehn und Werte [1,2,3,5,6,7,9,10,11]. Fensterindizes sind [10,11,14,15]. Normale Ausführung dauert sechzehn Takte. Pausen in Takt zwei, drei und zwölf verlängern sie auf neunzehn Takte und verschieben das erste Fenster nach Takt dreizehn. Sein Index übernommener Eingaben bleibt zehn. Das Timing ändert sich, Inhalt und Reihenfolge nicht.
Die gemeldeten siebzehn Speicherproben umfassen acht Zeilenverzögerungsplätze und neun Fensterplätze. JavaScript-Arrays messen keine synthetisierten SRAM-Bytes oder Flächen. Das unbegrenzte Fensterprotokoll ist ein Verifikationsnachweis, keine endliche Hardwarewarteschlange.
Führen Sie zuerst die ursprünglichen Assertions aus. Erhöhen Sie vorübergehend accepted während einer Pause, bestätigen Sie das Fehlschlagen des Wertevergleichs und stellen Sie den Code wieder her. Entfernt man das Löschen am Zeilenbeginn und erlaubt gleichzeitig Ausgabe früher Spalten, werden Spalten unterschiedlicher Zeilen vermischt. Gültigkeit und Zustandsfortschritt müssen gemeinsam getestet werden.
Für den Vergleich mit direkter Faltung berechnen Sie das Skalarprodukt jedes Fensters mit demselben abgeflachten Kernel und ordnen Ausgaben räumlich an. Prüfen Sie das erste Fenster von Hand, bevor Sie automatischem Vergleich vertrauen. Bewahren Sie Konfiguration, Übernahmeindizes und vergangene Takte im Nachweis auf, damit ein weiterer Lauf das Ergebnis reproduzieren kann.
Ausführbare Datei
import assert from 'node:assert/strict';
// Two row delays plus three horizontal shift registers: valid 3x3, one channel.
export function streamWindows(pixels, width, stalls = new Set()) {
const previous = Array(width).fill(0), older = Array(width).fill(0);
const window = Array.from({length: 3}, () => Array(3).fill(0));
const windows = []; let accepted = 0, cycles = 0;
while (accepted < pixels.length) {
if (stalls.has(cycles++)) continue;
const row = Math.floor(accepted / width), col = accepted % width;
if (col === 0) window.forEach(r => r.fill(0));
const current = pixels[accepted];
[older[col], previous[col], current].forEach((v, r) => {window[r].shift(); window[r].push(v);});
older[col] = previous[col]; previous[col] = current;
if (row >= 2 && col >= 2) windows.push({acceptedIndex: accepted, cycle: cycles - 1, values: window.flat()});
accepted++;
}
return {windows, accepted, cycles, storageSamples: 2 * width + 9};
}
const pixels = Array.from({length: 16}, (_, i) => i + 1);
const normal = streamWindows(pixels, 4);
const paused = streamWindows(pixels, 4, new Set([2, 3, 12]));
assert.deepEqual(normal.windows.map(w => w.acceptedIndex), [10, 11, 14, 15]);
assert.deepEqual(normal.windows[0].values, [1, 2, 3, 5, 6, 7, 9, 10, 11]);
assert.deepEqual(paused.windows.map(w => w.values), normal.windows.map(w => w.values));
assert.equal(paused.cycles, 19);
console.log(JSON.stringify({normal, paused}));RTL-Praktikum: ein begrenztes Fenster im Datenstrom
Speichern Sie die Anhänge cnn_window3x3.sv, cnn_conv3x3.sv und tb_cnn_stream.sv gemeinsam. Der synthetisierbare Fenstergenerator übernimmt pro synchronem, aktiv hohem Reset ein zeilenweises 4×4-Bild mit vorzeichenbehafteten int8-Werten. Er unterstützt einen Kanal, 3×3 ohne Auffüllung, Schrittweite/Dilatation eins und keine Randauffüllung. Fortschritt erfolgt nur, wenn in_valid und in_ready an einer steigenden Flanke beide hoch sind. Halten Sie Eingabedaten/valid während einer Pause; auch ein blockiertes Ausgabefenster bleibt stabil. Setzen Sie vor dem nächsten Bild zurück.
Führen Sie bei installiertem Icarus Verilog extern aus:
iverilog -g2012 -s tb_cnn_stream -o cnn-sim cnn_window3x3.sv cnn_conv3x3.sv tb_cnn_stream.sv
vvp cnn-simDie selbstprüfende Testbench vergleicht die neun Proben und Koordinaten jedes Fensters, Zeilengrenzen, Eingabe-/Ausgabepausen, Reset mit ausstehender Ausgabe und Bildabschluss. Bei Eingaben eins bis sechzehn lauten die Koordinaten (0,0),(0,1),(1,0),(1,1). Ihr abschließendes PASS muss frames=6, windows=24, outputs=24, kernels=2 und positive stalled_cycles melden. Reichen Sie Ihr tatsächliches Protokoll ein; ein nicht ausgeführter Befehl ist kein bestandener Test. Untersuchen Sie Dateien bei Verfügbarkeit manuell über einen unterstützten Dateiablauf im installierten DDS; DDS-Ausführung und Synthese benötigen separate Nachweise.
Änderungsübung: Ersetzen Sie die erste Eingabe durch zwei, prüfen Sie das erste Fenster von Hand und untersuchen Sie eine Wellenform der angehaltenen Ausgabe. Fensterwerte und Reihenfolge müssen mehrere Takte mit niedrigem ready überstehen. Das Entfernen der registrierten Fensterstufe erfordert eine neue Begründung für Rückstau und Zustandsstabilität.
Selbst ausprobieren
Ändern sich Fensterwerte oder Anzahl, wenn stattdessen Takt Null, eins und zwei pausiert werden und schließlich alle Eingaben übernommen werden? Wie groß ist die Gesamttaktzahl?
Erklärung lesen
Dieselben vier Fenster bleiben in derselben Reihenfolge. Sechzehn übernommene Eingaben plus drei Pausen benötigen neunzehn Takte. Übernahmeindizes bleiben fest; vergangene Ankunftszeiten verschieben sich nach hinten.