這是一個基於開源工具鏈的最簡單 DNN(深度神經網路)電路實作範例,使用 MAC(乘法累加)單元作為核心元件。
dnnic/
├── mac_unit.v # MAC 單元的 Verilog 實作
├── test_mac.py # cocotb 測試程式
├── Makefile # 測試和合成配置
├── synth.ys # Yosys 合成腳本
├── mac_unit.pcf # FPGA 約束檔案
└── README.md # 本說明文件
MAC 單元是 DNN 加速器的核心元件,執行 C = A × W + B 運算:
- A: 8位元輸入資料
- W: 8位元權重
- B: 16位元偏置或累積值
- C: 16位元輸出結果
- Python 3.6+
- cocotb: Python 測試框架
- Verilator: 開源 Verilog 模擬器
- Yosys: 開源邏輯合成工具
# 安裝 Python 依賴
pip install cocotb
# 安裝 Verilator (macOS)
brew install verilator
# 安裝 Yosys (macOS)
brew install yosys執行 cocotb 測試來驗證 MAC 單元的功能:
make這會執行以下測試:
- 基本功能測試:
(10 × 2 + 5) = 25 - 最大值測試:
(255 × 255 + 0) = 65025 - 隨機值測試:10 組隨機輸入
- 邊界條件測試:零乘法和零偏置
使用 Yosys 將 Verilog 程式碼合成為閘級網表:
make synth這會產生:
mac_unit_synth.v: 合成後的 Verilog 網表mac_unit.json: JSON 格式的網表(用於 FPGA 流程)
如果您有 iCE40 FPGA 開發板,可以執行完整的 FPGA 流程:
# 合成(產生 JSON 網表)
yosys -p 'synth_ice40 -top mac_unit -json mac_unit.json' mac_unit.v
# 佈局繞線
nextpnr-ice40 --hx1k --json mac_unit.json --pcf mac_unit.pcf --asc mac_unit.asc --freq 25
# 產生位元流
icepack mac_unit.asc mac_unit.bin
# 燒錄到 FPGA
iceprog mac_unit.bin成功的測試輸出應該類似:
** TEST STATUS SIM TIME (ns) REAL TIME (s) RATIO (ns/s) **
** test_mac.mac_test_basic PASS 1.00 0.00 2398.12 **
** test_mac.mac_test_max_values PASS 1.00 0.00 8701.88 **
** test_mac.mac_test_random PASS 10.00 0.00 19004.55 **
** test_mac.mac_test_edge_cases PASS 2.00 0.00 9845.78 **
** TESTS=4 PASS=4 FAIL=0 SKIP=0 14.00 0.00 6198.72 **
執行 make synth 後,Yosys 會產生詳細的合成報告:
=== mac_unit ===
+----------Local Count, excluding submodules.
|
872 wires
916 wire bits
4 public wires
48 public wire bits
4 ports
48 port bits
412 cells
8 $_ANDNOT_
85 $_AND_
164 $_NAND_
1 $_NOR_
14 $_OR_
34 $_XNOR_
106 $_XOR_
合成後的 mac_unit_synth.v 包含:
- 412 個邏輯閘:包含 AND、NAND、XOR、XNOR 等基本邏輯閘
- 872 條內部連線:連接各個邏輯閘
- 48 個 I/O 位元:8+8+16+16 = 48 位元的輸入輸出
MAC 單元的邏輯結構:
A[7:0] ──┐
│
├─→ 8×8 乘法器 ──┐
│ │
W[7:0] ──┘ │
├─→ 16位元加法器 ──→ C[15:0]
│
B[15:0] ──────────────────┘
- 乘法器優化:8×8 乘法器被優化為 412 個基本邏輯閘
- 加法器優化:16位元加法器使用進位傳播加法器結構
- 面積效率:總共使用 412 個邏輯閘實現完整的 MAC 功能
- MAC 單元的 Verilog 實作
- 8位元 × 8位元乘法器
- 16位元加法器
- 純組合邏輯設計
- 使用 cocotb 撰寫的測試程式
- 包含多種測試案例
- 自動化驗證功能正確性
- cocotb 測試配置
- 合成目標
- 清理目標
- Yosys 合成腳本
- 優化設定
- 輸出格式配置
- FPGA 約束檔案
- 引腳對應設定
- 適用於 iCE40 FPGA
本專案已擴展為完整的 2 層神經網路加速器:
輸入層 (4 個輸入) → 隱藏層 (3 個神經元) → 輸出層 (2 個輸出)
- 狀態機控制: 自動化運算流程
- 權重儲存: 內建權重和偏置記憶體
- 時鐘同步: 完整的時鐘域設計
- 控制信號: start、done、valid 信號
-
測試 DNN 加速器:
source venv/bin/activate make test-dnn -
合成 DNN 加速器:
make synth-dnn
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 輸入層 │ │ 隱藏層 │ │ 輸出層 │
│ 4 個輸入 │───▶│ 3 個神經元 │───▶│ 2 個輸出 │
└─────────────┘ └─────────────┘ └─────────────┘
│ │ │
▼ ▼ ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ MAC 單元 │ │ MAC 單元 │ │ MAC 單元 │
│ 4×3 權重 │ │ 3×2 權重 │ │ 偏置加法 │
└─────────────┘ └─────────────┘ └─────────────┘
** TEST STATUS SIM TIME (ns) REAL TIME (s) RATIO (ns/s) **
** test_dnn.dnn_test_basic_functionality PASS 230.00 0.00 280107.41 **
** test_dnn.dnn_test_multiple_computations PASS 440.00 0.00 477365.17 **
** test_dnn.dnn_test_state_machine PASS 230.00 0.00 672726.58 **
** test_dnn.dnn_test_edge_cases PASS 440.00 0.00 333001.40 **
** test_dnn.dnn_test_random_inputs PASS 1080.00 0.00 787936.74 **
** TESTS=5 PASS=5 FAIL=0 SKIP=0 2420.00 0.01 367176.69 **
執行 make synth-dnn 後,Yosys 會產生詳細的合成報告:
=== dnn_accelerator ===
+----------Local Count, excluding submodules.
|
1425 wires
1796 wire bits
45 public wires
396 public wire bits
15 ports
117 port bits
671 cells
25 $_ANDNOT_
132 $_AND_
24 $_DFFE_PN0P_
32 $_DFFE_PP_
27 $_MUX_
228 $_NAND_
7 $_NOR_
9 $_NOT_
17 $_ORNOT_
24 $_OR_
41 $_XNOR_
105 $_XOR_
1 submodules
1 mac_unit
合成後的 dnn_accelerator_synth.v 包含:
- 671 個邏輯閘:包含 AND、NAND、XOR、XNOR、MUX、DFF 等基本邏輯閘
- 1425 條內部連線:連接各個邏輯閘
- 117 個 I/O 位元:時鐘、重置、控制信號和資料輸入輸出
- 1 個子模組:內嵌的 MAC 單元
本專案實現了完整的軟硬體 DNN 一致性驗證流程:
使用 PyTorch 訓練一個小型 2 層神經網路:
make train-model訓練結果:
- 測試準確率:79.5%
- 模型架構:4 輸入 → 3 隱藏神經元 → 2 輸出
- 參數數量:18 個權重 + 5 個偏置
將軟體模型參數轉換為硬體相容格式:
make convert-params轉換結果:
- Layer 1 權重:4×3 矩陣,8 位元整數
- Layer 1 偏置:3 個值,16 位元整數
- Layer 2 權重:3×2 矩陣,8 位元整數
- Layer 2 偏置:2 個值,16 位元整數
實作可配置的硬體 DNN 加速器:
- 支援動態參數載入
- 狀態機控制計算流程
- MAC 單元並行運算
比較軟體和硬體 DNN 的輸出結果:
python3 verify_consistency.py驗證結果:
=== Software-Hardware DNN Consistency Verification ===
Loaded 10 test vectors
Test 1: Input=[70, 120, 201, 51]
Software: [104450.00, 72861.00]
Hardware: [104450.00, 72861.00]
Difference: [ 0.00, 0.00] ✅ PASS
Test 2: Input=[65, 64, 127, 96]
Software: [ 59.00, -47.00]
Hardware: [ 59.00, -47.00]
Difference: [ 0.00, 0.00] ✅ PASS
... (所有 10 個測試案例)
=== Summary ===
Maximum difference across all tests: 0.000000
✅ ALL TESTS PASSED - Software and hardware outputs are consistent!
執行完整的訓練和驗證流程:
make full-pipeline這將依序執行:
- 軟體模型訓練
- 參數轉換
- 硬體測試
- 一致性驗證
- 增加層數: 擴展為多層深度神經網路
- 並行處理: 實作多個 MAC 單元並行運算
- 記憶體介面: 增加外部記憶體存取權重和資料
- 激活函數: 加入 ReLU、Sigmoid 等激活函數
- 量化支援: 支援不同位元寬度的量化運算
- 流水線設計: 增加暫存器來提高時鐘頻率
-
cocotb 安裝失敗
pip install --upgrade pip pip install cocotb
-
Verilator 找不到
export PATH="/opt/homebrew/bin:$PATH"
-
Yosys 合成錯誤
- 檢查 Verilog 語法
- 確認模組名稱正確
make clean # 清理測試檔案
make clean-all # 清理所有檔案本專案使用 MIT 授權條款。