
2026/01/03 4:13
TinyTinyTPU:FPGA上に実装された、2×2システマティックアレイ型のTPUスタイル行列乗算ユニット
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
Summary:
TinyTinyTPUは、SystemVerilogで記述された小型の2 × 2システマティックアレイ・行列乗算エンジンで、Basys3 Xilinx Artix‑7 FPGAに実装されています。全てのポストMAC(multiply‑accumulate)処理―積算、活性化、正規化、量子化―をサポートしており、小規模な多層パーセプトロン(MLP)モデルを完全にハードウェア上で実行できます。UARTコマンドによりホストPCが重みと活性化データをロードし、推論を起動し、結果を読み戻すことができ、付属のPythonドライバはこのワークフローを自動化します。本設計は約1 000 LUT、1 000フリップフロップ、および8つのDSP48E1スライスしか使用せず、大きなリソースフットプリントが不要なハイボリッジや教育プロジェクトに最適です。デモモデルとして単純な2層ジェスチャー分類器が提供されています。将来的にはVerilator/Cocotbテストで検証を拡張し、VivadoまたはYosys/nextpnr経由でビットストリームを生成し、拡張設計に伴うタイミングや配線問題を解決する予定です。構築フローをオープンソース化することで、TinyTinyTPUは他の最小限FPGAベースAIアクセラレータのテンプレートとして利用可能なアクセスしやすい例を提供します。
Summary Skeleton
テキストが主に伝えようとしていること(メインメッセージ)
TinyTinyTPUは、SystemVerilogで書かれたコンパクトな2 × 2システマティックアレイ行列乗算ユニットであり、Basys3 Xilinx Artix‑7 FPGA上に実装され、小規模MLPモデルのために完全なポストMAC処理とUART制御推論を提供します。
証拠/理由(なぜそう言われているか)
設計には4つのPE、積算/活性化/正規化/量子化パイプライン全体、重み・活性化ロードと実行のためのUARTコマンド、および重みをロードし推論を実行して結果を読み取るデモスクリプトが含まれ、リソースレポートは約1 000 LUT、約1 000 FF、8 DSP48E1スライスです。
関連ケース/背景(文脈・過去の出来事・周囲情報)
プロジェクトは
rtl/にRTLモジュール、sim/にcocotbテスト、VivadoまたはYosys/nextpnr用のFPGAビルドスクリプト(build_vivado.tcl)、およびPythonホストドライバをhost/に配置して構成されています。標準Basys3接続(UARTピンB18/A18、100 MHzクロック、リセットBTNC)に依存し、model/に2層ジェスチャー分類器の学習スクリプトがあります。
今後起こり得ること(将来開発/予測)
次のステップはVerilator/Cocotbテスト(
make test)を実行し、Vivadoでビットストリームを生成するか、FASMをXilinx形式に変換し、Yosys/nextpnrをより複雑な設計で使用した際のタイミング/配線問題を解決する可能性があります。
影響(ユーザー/企業/産業へのインパクト)
低リソースTPUはハイボリッジや教育者がFPGAベースのニューラル推論デモに採用でき、オープンソース構築フローは組み込みAIコミュニティで類似した最小限アクセラレータプロジェクトを刺激する可能性があります。
本文
TinyTinyTPU – 2×2 TPUスタイルの最小マトリクス乗算ユニット
(SystemVerilogで実装、Xilinx Basys 3にデプロイ)
目次
- プロジェクト概要
- クイックスタート
- 必要環境
- インストール
- シミュレーション & テスト
- テスト実行
- 波形生成
- FPGA ビルドとデプロイ
- 推論の実行
- プロジェクト構成
- アーキテクチャ詳細
- オープンソースツール (Yosys / nextpnr)
- トラブルシューティング
- 貢献方法
- 参考文献 & 謝辞
1. プロジェクト概要
TinyTinyTPU は Google の TPU を教育用に再現し、2×2 システマティック配列へ縮小したものです。以下を示します。
| 機能 | 説明 |
|---|---|
| システマティック配列 | 4つの処理要素(PE)が 2×2 配置 |
| MAC 後パイプライン | アキュムレータ → 活性化関数 → 正規化 → 量子化 |
| ホストインタフェース | UART ベースのコマンドプロトコル |
| 推論 | マルチレイヤMLP(ダブルバッファ付き活性化)をサポート |
| FPGA ターゲット | Basys 3 (Xilinx Artix‑7 XC7A35T) |
リソース使用率 (Basys 3)
- LUTs: 約1,000(5 %)
- フリップフロップ: 約1,000(3 %)
- DSP48E1: 8スライス
- BRAM: 約10–15ブロック
- 推定ゲート数: ~25k
2. クイックスタート
必要環境
| カテゴリ | ツール | バージョン |
|---|---|---|
| シミュレーション | Verilator | ≥ 5.022 |
| Python | ≥ 3.8 | |
| cocotb | – | |
| GTKWave / Surfer | – | |
| FPGA ビルド | Vivado | 2020.1+ (Basys 3 用) |
| Yosys / nextpnr | 任意、オープンソース代替 | |
| 推論実行 | Python | ≥ 3.8 |
| pyserial | – |
インストール
# リポジトリをクローン git clone <repository-url> cd tinytinyTPU-co # シミュレーション環境 (Python 仮想env) cd sim python3 -m venv venv source venv/bin/activate # Windows: venv\Scripts\activate pip install -r requirements.txt
3. シミュレーション & テスト
すべてのシミュレーションコマンドは
sim/ ディレクトリから実行します。
テスト実行
cd sim # すべてのテストを走らせる make test # 波形生成付きで実行 make test WAVES=1 # 個別モジュールテスト make test_pe # Processing Element make test_mmu # Matrix Multiply Unit make test_uart # UART コントローラ # …etc.
波形生成
# 利用可能な波形一覧 make waves # 特定のモジュール波形を開く make waves MODULE=pe make waves MODULE=mmu
波形は
sim/waves/ に保存されます。
4. FPGA ビルドとデプロイ
ハードウェア接続 (Basys 3)
| ピン | 機能 |
|---|---|
| B18 | UART RX (PC → FPGA) |
| A18 | UART TX (FPGA → PC) |
| 100 MHz 発振器 | クロック |
| BTNC (U18) | グローバルリセット |
| LED | 状態表示( を参照) |
Vivado でビルド
cd fpga vivado -mode batch -source build_vivado.tcl
が生成されるbasys3_top.bit- 利用率・タイミングレポートが作成される
オープンソース代替: Yosys + nextpnr
- 合成 –
(README のスクリプトを参照)yosys synth.ys - 配置とルーティング –
nextpnr-xilinx … - ビットストリーム生成 – Xilinx ツールまたは
が必要fasm2bit
注意: Vivado は安定したビルドが保証されます。Yosys/nextpnr は実験的です。
FPGA プログラミング
- Vivado GUI: Hardware Manager → Auto‑connect →
でプログラムbasys3_top.bit - コマンドライン (Vivado):
vivado -mode tcl <<EOF open_hw_manager connect_hw_server open_hw_target set_property PROGRAM.FILE {basys3_top.bit} [get_hw_devices xc7a35t_0] program_hw_devices [get_hw_devices xc7a35t_0] EOF - OpenOCD (任意): Digilent JTAG ケーブルと
を使用してフラッシュopenocd
5. 推論の実行
Python ホストドライバ
from tpu_driver import TPUDriver # 接続(ポートを調整) tpu = TPUDriver('/dev/ttyUSB0') # Linux # tpu = TPUDriver('COM3') # Windows # 重みと活性化をロード weights = [[1, 2], [3, 4]] activations = [[5, 6], [7, 8]] tpu.write_weights(weights) tpu.write_activations(activations) # 推論実行 tpu.execute() # 結果行列を取得 result = tpu.read_result() print("Result:", result)
デモスクリプト
cd host python3 inference_demo.py # 基本デモ python3 gesture_demo.py # ジェスチャ分類器(学習済モデルが必要) python3 test_tpu_driver.py # ドライバ単体テスト
ジェスチャーデモ – マウス移動データで 2 層 MLP を訓練し、FPGA 上でリアルタイム推論を実行。
6. プロジェクト構成
tinytinyTPU-co/ ├── rtl/ # SystemVerilog RTL ソース ├── sim/ # シミュレーション環境(Makefile、テスト、波形) ├── fpga/ # Vivado / Yosys ビルド成果物と制約ファイル ├── host/ # Python ドライバとデモスクリプト ├── model/ # ML 訓練スクリプト + JSON モデル └── README.md # 本書類
主要 RTL モジュール:
pe.sv, mmu.sv, weight_fifo.sv, accumulator.sv, activation_pipeline.sv, tpu_top.sv など。
7. アーキテクチャ詳細
システマティック配列のデータフロー
PE00 ──> PE01 (活性化は右へ流れる) | | PE10 ──> PE11 (部分和は下へ流れる) | | acc0 acc1 (出力をアキュムレータへ)
重みロード(対角波形フロント)
| サイクル | アクション |
|---|---|
| 0 | W10 → 列0(キャプチャなし) |
| 1 | W00 → 列0(キャプチャ)、W11 → 列1(キャプチャなし) |
| 2 | W01 → 列1(キャプチャ) |
活性化フロー
- 行 0:
→ PE00 → PE01A00 - 行 1:
→ PE10 → PE11 (1 サイクルずらし)A10
パイプライン段階
- Weight FIFO – 列方向に重みを保存し、スキュー付きで出力。
- MMU (システマティック配列) – MAC 演算実行。
- Accumulator – 列を揃え、ダブルバッファリング。
- Activation Pipeline – ReLU/ReLU6 → 正規化(gain × bias + shift)→ 量子化 (int8, saturate)。
- Unified Buffer – FIFO と ready/valid ハンドシェイク。
マルチレイヤMLP
- コントローラ FSM:
。IDLE → LOAD_WEIGHT → LOAD_ACT → COMPUTE → DRAIN → TRANSFER → NEXT_LAYER → WAIT_WEIGHTS - ダブルバッファにより、現在の結果をドレインしながら次層の重みロードが重なり可能。
8. オープンソースツールチェーン (Yosys / nextpnr)
インストール
# Ubuntu/Debian sudo apt-get install yosys git clone https://github.com/YosysHQ/nextpnr.git cd nextpnr && cmake . -DARCH=xilinx && make -j$(nproc) && sudo make install # macOS (Homebrew) brew install yosys # nextpnr は手動ビルドが必要
ビルド手順
- 合成 –
をyosys synth.ys
内で実行。fpga/ - 配置とルーティング –
を実行。nextpnr-xilinx … - ビットストリーム生成 – Xilinx ツールか
が必要。fasm2bit
Tip: Vivado の方が安定します。Yosys/nextpnr は実験用です。
9. トラブルシューティング
| 問題 | 原因の可能性 | 対策 |
|---|---|---|
| Verilator エラー | Verilator が古い、または構文エラー | ≥ 5.022 をインストールし を実行 |
| テスト失敗 | 波形が不足してデバッグできない | で実行し VCD を確認 |
| FPGA タイミング違反 | 制約不足 / クロックが速すぎる | 制約を追加、クロックを 50 MHz に下げる |
| UART が動作しない | COM ポートまたはボーレート不一致 | を確認、115200 に設定 |
| LED が反応しない | ビットストリームがプログラムされていない | Vivado GUI または CLI で再プログラミング |
10. 貢献方法
以下の点で PR や Issue を歓迎します。
- テストカバレッジ追加
- RTL の速度/面積最適化
- ドキュメント改善
- Yosys/nextpnr サポート強化
- 配列サイズ拡張(4×4、8×8 など)
11. 参考文献 & 謝辞
- Google TPU の論文とアーキテクチャブログ
- システマティック配列に関する文献
- Basys 3 リファレンスマニュアル
謝辞 – Google の TPU デザインからインスパイア(Cliff, Richard, TinyTPU チーム、Yosys/Symbiotic EDA クルー、Stanford FAF、Princeton ECE など)。