Altifigence Academy

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を進め、値比較が失敗することを確認して戻します。行頭のクリアを外して早い列の出力を許すと、異なる行の列が混ざります。有効性と状態進行を一緒にテストする必要があります。

直接畳み込みと比較するには、各ウィンドウを同じ平坦化カーネルと内積し、空間順へ戻します。自動比較の前に最初のウィンドウを手で検査します。再現できるよう設定、受け入れ添字、経過サイクルを証拠に残します。

実行可能なファイル

javascript
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をインストールした環境で外部実行します。

sh
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サイクルです。受け入れ添字は固定で、経過到着時刻は遅くなります。

Lesson files

window-lab.mjs ↓cnn_window3x3.sv ↓cnn_conv3x3.sv ↓tb_cnn_stream.sv ↓

選択はこのブラウザに適用されます。フッターからいつでも変更できます。