15 / 24 · 実習
実習:停止しても保たれるウィンドウ
代わりにサイクル0,1,2で停止し、最終的に全入力を受け入れると、ウィンドウ値や数は変わりますか。総サイクル数は何ですか。
レッスンは無料で読めます。受講登録すると進捗を保存できます。
目標と実行
直列入力から3×3ウィンドウを生成し、停止が値と順序を保つことを検証します。window-lab.mjsを作り、コードをコピーしてnode window-lab.mjsを実行します。Node.jsが必要でパッケージは不要です。インストール済みDigital Design Studioの対応するファイル操作で同じファイルを手動作成・確認できます。DDS内での実行や自動的なリモートプロジェクト作成を示すものではありません。
モデルは入力受け入れだけを停止します。完全な出力readyプロトコル、メモリバス、パディング、ダイレーション、複数チャネルエンジンは実装しません。stallsは経過サイクル、acceptedは入力位置を示します。このカウンタの分離が演習の要点です。停止ではバッファ、ウィンドウ、入力添字が変わりません。
期待値の計算例
1から16を幅4として解釈します。最初の通常ウィンドウはacceptedIndex=10、値[1,2,3,5,6,7,9,10,11]です。ウィンドウ添字は[10,11,14,15]です。通常は16サイクルです。サイクル2,3,12の停止では19サイクルとなり、最初のウィンドウはサイクル13へ移ります。受け入れ入力添字は10のままです。タイミングは変わり、内容と順序は変わりません。
報告する17記憶サンプルは8行遅延スロットと9ウィンドウスロットです。JavaScript配列は合成SRAMのバイト数や面積を測りません。無制限のwindowsログは検証記録で、有限のハードウェアキューではありません。
まず元のアサーションを実行します。一時的に停止中もacceptedを進め、値比較が失敗することを確認して戻します。行頭のクリアを外して早い列の出力を許すと、異なる行の列が混ざります。有効性と状態進行を一緒にテストする必要があります。
直接畳み込みと比較するには、各ウィンドウを同じ平坦化カーネルと内積し、空間順へ戻します。自動比較の前に最初のウィンドウを手で検査します。再現できるよう設定、受け入れ添字、経過サイクルを証拠に残します。
実行可能なファイル
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実習:範囲を定めたストリーミングウィンドウ
添付cnn_window3x3.sv、cnn_conv3x3.sv、tb_cnn_stream.svを一緒に保存します。合成可能なウィンドウ生成器は、同期アクティブハイリセットごとに1つの行優先4×4符号付きint8フレームを受け入れます。1チャネル、有効3×3、ストライド・ダイレーション1、パディングなしに対応します。立ち上がりでin_validとin_readyがともに高いときだけ進めます。停止中は入力データとvalidを保持し、ブロックされた出力ウィンドウも安定させます。次フレーム前にリセットします。
Icarus Verilogをインストールした環境で外部実行します。
iverilog -g2012 -s tb_cnn_stream -o cnn-sim cnn_window3x3.sv cnn_conv3x3.sv tb_cnn_stream.sv
vvp cnn-sim自己検査ベンチは全ウィンドウの9サンプルと座標、行境界、入出力停止、出力待機中リセット、フレーム完了を比較します。入力1から16の座標は(0,0),(0,1),(1,0),(1,1)です。最終PASSはframes=6、windows=24、outputs=24、kernels=2、正のstalled_cyclesを報告する必要があります。実ログを提出してください。未実行コマンドは合格ではありません。利用可能なら、対応するインストール済みDDSのファイル操作で手動確認します。DDS実行と合成は別の証拠が必要です。
変更演習:最初の入力を2に置き換え、最初のウィンドウを手計算し、停止出力波形を調べます。readyが数サイクル低くても値と順序を保つ必要があります。レジスタ付きウィンドウ段の除去には、新しいバックプレッシャーと状態安定性の説明が必要です。
自分で考えてみましょう
代わりにサイクル0,1,2で停止し、最終的に全入力を受け入れると、ウィンドウ値や数は変わりますか。総サイクル数は何ですか。
解説を見る
同じ4ウィンドウが同じ順で残ります。16受け入れ入力と3停止で19サイクルです。受け入れ添字は固定で、経過到着時刻は遅くなります。