在 AI 硬件加速领域,脉动阵列因其高效的数据复用和并行计算能力而备受关注。Google 的 TPU(Tensor Processing Unit)正是基于脉动阵列架构的成功案例。然而,对于 FPGA 开发者而言,理解并实现一个完整的脉动阵列系统仍面临诸多挑战。TinyTinyTPU 项目提供了一个极简但完整的 2×2 脉动阵列 TPU 风格矩阵乘法单元实现,为学习和研究脉动阵列架构提供了绝佳的起点。
脉动阵列的核心优势与设计挑战
脉动阵列是一种规则排列的处理单元(PE)网格,数据在网格中以 "脉动" 的方式流动 —— 激活值水平流动,部分和垂直流动。这种设计最大限度地减少了数据移动,提高了计算密度和能效。然而,在 FPGA 上实现脉动阵列需要考虑多个工程因素:资源利用率、时序收敛、数据流控制以及权重加载机制。
TinyTinyTPU 采用 2×2 的最小规模设计,这并非性能最优的选择,而是为了教学和原型验证的目的。正如研究指出,FPGA 上脉动阵列的资源利用率是一个关键挑战,未充分利用的 FPGA 资源会显著影响推理吞吐量。
2×2 脉动阵列的架构设计
处理单元(PE)设计
PE 是脉动阵列的基本计算单元,每个 PE 执行乘累加(MAC)操作:psum_out = psum_in + (in_act × weight)。TinyTinyTPU 的 PE 设计采用单周期寄存器输出,确保时序可预测性。
关键控制信号包括:
en_weight_pass:在权重加载阶段控制部分和直通en_weight_capture:触发权重寄存器锁存
这种分离的控制机制允许在权重加载期间保持计算流水线的连续性,是脉动阵列高效运行的基础。
矩阵乘法单元(MMU)组织
2×2 MMU 的组织结构如下:
PE00 → PE01 激活值水平流动(向右)
↓ ↓
PE10 → PE11 部分和垂直流动(向下)
↓ ↓
acc0 acc1 输出到累加器
MMU 负责:
- 将激活值馈送到行(row0 直接输入,row1 带偏斜寄存器)
- 通过垂直部分和路径加载权重,每列具有独立的捕获时序
- 向累加器输出两个部分和列
对角线波前权重加载机制
权重加载是脉动阵列设计中最复杂的部分之一。TinyTinyTPU 采用 3 周期交错的权重加载方案,确保权重在阵列中以正确的对角线波前模式传播。
对于权重矩阵 W = [[1, 2], [3, 4]],加载时序如下:
| 周期 | col0_out | col1_out | 列 0 捕获 | 列 1 捕获 |
|---|---|---|---|---|
| 0 | 3 | 0(偏斜) | 否 | 否 |
| 1 | 1 | 4 | 是 | 否 |
| 2 | (保持) | 2 | 否 | 是 |
最终权重分布为:
PE00: W[0,0]=1 PE01: W[0,1]=2
PE10: W[1,0]=3 PE11: W[1,1]=4
这种交错加载机制通过dual_weight_fifo.sv模块实现,该模块包含两个独立的 4 项队列,共享一个数据总线来填充两个 MMU 列。列 0 提供组合逻辑读取输出(无延迟),列 1 提供带 1 周期偏斜的寄存器输出,以支持对角线波前。
完整的后 MAC 流水线设计
TinyTinyTPU 不仅实现了核心的矩阵乘法,还包含了完整的后处理流水线,模拟了真实 TPU 的数据流:
累加器子系统
累加器捕获 MMU 输出,对齐交错的列,并支持累加 / 覆盖模式的双缓冲:
accumulator_align.sv:消除列输出偏斜accumulator_mem.sv:双缓冲 32 位存储
激活流水线
activation_pipeline.sv整合了所有后累加器处理阶段:
- 激活函数:支持 ReLU、ReLU6 或直通
- 归一化:增益 / 偏置 / 移位操作
- 并行损失计算:L1 损失计算
- 仿射 int8 量化:带饱和的量化
统一缓冲区
unified_buffer.sv提供字节宽度的同步 FIFO,支持就绪 / 有效背压机制,确保输出数据的稳定传输。
多层 MLP 推理支持
TinyTinyTPU 的一个重要特性是支持多层神经网络推理。test_mlp_integration.py演示了多层感知机(MLP)的推理流程:
权重FIFO → MMU(脉动) → 累加器 → 激活流水线 → 统一缓冲区
^ |
+------------------ 反馈(下一层) --------------------+
2 层 MLP 示例
考虑一个简单的 2 层 MLP:
- 输入:A = [[5, 6], [7, 8]]
- 第一层权重:W1 = [[1, 2], [3, 4]]
- 第二层权重:W2 = [[1, 1], [1, 1]]
计算过程:
- 第一层:H = ReLU (A × W1) = [[23, 34], [31, 46]]
- 第二层:Y = ReLU (H × W2) = [[57, 57], [77, 77]]
这种反馈机制使得 TinyTinyTPU 能够处理实际的神经网络推理任务,而不仅仅是孤立的矩阵乘法。
SystemVerilog 迁移与测试框架
从 Verilog 到 SystemVerilog
项目从原始的 Verilog 实现迁移到 SystemVerilog,带来了多项改进:
-
类型系统增强:
input wire/output reg→input logic/output logicreg/wire→logic
-
过程块语义化:
always @(posedge clk)→always_ff @(posedge clk)always @(*)→always_comb
-
数组语法简化:
[0:DEPTH-1]→[DEPTH]
-
明确的 case 语句:
case→unique case(适当情况下)
这种迁移不仅提高了代码的可读性和可维护性,还增强了综合兼容性。
基于 cocotb 的测试框架
Verilog 测试平台被 cocotb Python 测试平台取代,带来以下优势:
- 更可维护和可读的测试代码
- 使用 Python 工具进行更轻松的调试
- 通过 Verilator 生成 VCD 波形
- Pytest 集成用于测试发现和报告
测试覆盖包括所有核心模块:PE、MMU、权重 FIFO、累加器、激活函数、归一化器、激活流水线和 MLP 集成测试。
FPGA 部署的工程考虑
流水线时序总结
| 阶段 | 周期数 | 描述 |
|---|---|---|
| 权重加载 | 3 周期 | 带对角线波前的交错列捕获 |
| 计算 | 3 周期 | 带行偏斜的激活值流式传输 |
| 首个结果 | 5 周期 | 从计算开始到第一个累加器输出 |
| 结果间隔 | 1 周期 | 连续有效累加器输出之间的间隔 |
资源利用率优化
虽然 TinyTinyTPU 是 2×2 的最小设计,但实际部署时需要考虑资源优化策略。研究表明,通过将 FPGA 划分为多个方形脉动阵列,并将这些阵列的放置问题表述为 2D 背包问题,可以显著提高资源利用率。
对于大型神经网络,可以采用分区架构,在不同区域部署不同大小的脉动阵列,以匹配各层的计算需求。这种方法的吞吐量增益可达 7-22.7 倍,尽管会有 1.2-7.6 倍的延迟牺牲。
频率与布局考虑
脉动阵列的工作频率受布局位置影响显著。实验数据显示,2×2 脉动阵列在不同 FPGA 区域的工作频率分布呈现明显的空间相关性。优化布局可以确保时序收敛并最大化工作频率。
实际应用与扩展方向
教育价值
TinyTinyTPU 作为一个最小化但完整的实现,具有重要的教育价值:
- 理解脉动阵列基本原理:通过简单的 2×2 设计,清晰展示数据流动模式
- 学习权重加载机制:对角线波前加载是理解更大规模阵列的基础
- 掌握完整 AI 加速器流水线:从矩阵乘法到后处理的完整流程
原型开发平台
对于希望开发自定义 AI 加速器的团队,TinyTinyTPU 可以作为:
- 验证架构概念的起点:快速验证新的数据流或计算模式
- 测试工具链的基础:集成新的编译器或调度器
- 性能建模的参考:建立小规模模型的性能预测
扩展方向
基于 TinyTinyTPU,可以探索多个扩展方向:
- 规模扩展:将 2×2 阵列扩展到更大规模(如 8×8 或 16×16)
- 精度支持:增加对混合精度(int4、fp16 等)的支持
- 稀疏性利用:集成稀疏矩阵乘法优化
- 动态重构:利用 FPGA 的动态部分重构特性
结论
TinyTinyTPU 项目展示了如何在 FPGA 上实现一个完整但最小化的 TPU 风格脉动阵列。通过 2×2 的设计规模,它降低了学习曲线,同时保持了架构的完整性。对角线波前权重加载机制、完整的后 MAC 流水线以及多层 MLP 推理支持,使其成为一个有价值的教学工具和原型开发平台。
对于 FPGA 开发者而言,理解脉动阵列的实现细节是开发现代 AI 加速器的关键一步。TinyTinyTPU 提供了一个绝佳的起点,帮助开发者掌握从基本 PE 设计到完整系统集成的全流程技能。随着 AI 硬件加速需求的不断增长,这类开源项目将在培养下一代硬件工程师方面发挥重要作用。
资料来源
- TinyTinyTPU GitHub 仓库:https://github.com/alanma23/TinyTinyTPU
- "Implementing FPGA-optimized Systolic Arrays using 2D Knapsack and Evolutionary Algorithms" - 关于 FPGA 脉动阵列优化的学术研究
- "A TPU-like Design for FPGA Benchmarking" - FPGA 上 TPU 风格设计的基准测试研究