实验步骤
本页给出建议的实验顺序。每个阶段都有“完成标志”,用于自检;如果卡住,先回到对应章节排查。整个实验建议预留 1–2 周,不要等到最后一周才开始。
0. 阅读与准备
先读一遍NPU 原理、NPU 硬件实现和Wishbone 接口与顶层,重点理解:
- B 矩阵如何驻留、A 如何斜入、C 如何斜出;
- LDTILE/TMUL 两条指令的时序,以及
busy/done的含义; 0x2000_0000地址窗口和各个寄存器的单位;- L0C 读端口为什么需要仲裁。
完成标志
能用自己的话解释 LDTILE 和 TMUL 各需要多少拍、acc 的作用,以及 A_BASE / C_BASE 的单位。
1. 获取代码并加入工程
git clone https://github.com/thu-cs-lab/cod-npu.git
把 cod-npu 仓库根目录下的 rtl/sv/*.sv 加入 Vivado 工程。如果使用 Chisel 版,需要自行加入到你的 Chisel 工程当中。
完成标志
Vivado 综合通过,npu_top 出现在层次结构中,资源占用合理。
2. 接入 Wishbone 总线
按照集成、编译与运行修改 Wishbone 多路选择器,增加 0x2000_0000 的从机端口,并例化 npu_top。
先做一个最简单的总线冒烟测试:
- 读
STATUS(0x2000_0004),确认总线能正常返回、不卡死; - 写
CMD(0x2000_0000)触发一次 LDTILE; - 连续读
STATUS,观察busy位是否先变高、再变低。
完成标志
CPU 能稳定读写 NPU 的寄存器,写 CMD 后 busy 能正确变化,说明地址译码、ACK 和复位都没有问题。
如果总线卡死
先检查地址窗口是否和 SRAM/UART 重叠、wb_ack 是否在正确的周期拉高、npu_top 的 rst_i 极性是否接反。可以先不接 NPU,单独用 ILA 抓 wb_* 波形。
3. 跑通 4x4x4
用 cod-npu 仓库根目录下的 software/npu.c 的接口完成一次最简单的 4x4x4:
- 把 A 的 4 行写入 L0A(每行 4 个 int8,打包成一个 32 位字);
- 把 B 的 4 行写入 L0B;
- 写
B_BASE=0,写CMD=LDTILE,等待完成; - 写
A_BASE=0、C_BASE=0、M_M1=3,写CMD=TMUL(acc=0),等待完成; - 从 L0C 读回 4x4 的结果,和
npu_matmul_sw对比。
建议先自己构造一组小整数(例如 0..15),把期望值写在纸上或用 Python 算好,避免“参考实现也错了”的情况。
完成标志
4x4x4 的结果与软件参考完全一致,连续跑两次结果稳定。
4. 通用矩阵乘
在 4x4 跑通的基础上,验证 v1 和 v2:
- v1:三层循环,每个 C 子块独立计算。先跑 8x8x8、16x16x16、32x32x32;
- v2:一次 LDTILE 复用到两个 C 行子块,要求
M/4为偶数。对比 v1/v2 的 LDTILE 次数和周期数; - 重复执行:连续做两次矩阵乘,检查状态机和
status_done能否正确复位。
当前驱动的限制
npu.c 只支持 M/N/K 是 4 的倍数;v2 还要求 M/4 是偶数。非 4 倍数需要你自己做 padding 或尾块处理,这本身也可以作为一项扩展。
完成标志
8x8x8、16x16x16、32x32x32 全部与软件参考一致。
5. 性能评测
按照性能评测与优化的方法,完成:
- 至少 5 种规模;
- 每种规模至少 5 次,去掉前 2 次,取后 3 次的平均;
- 记录周期数,计算实际算力、峰值算力、利用率;
- 分析周期构成,画出 Gantt 图和数据流图。
完成标志
有一张包含至少 5 组规模、周期、实际算力、利用率的数据表;能指出当前最大的瓶颈在哪里,并用数据支撑。
6. 优化
从优化方向中选多项,完成设计、实现和评测:
- 先记录优化前的性能数据;
- 实现优化,保证功能仍然正确;
- 重新评测,记录优化后的性能数据;
- 如果改变了阵列规模或每周期运算次数,重新计算峰值算力;
- 分析收益和代价(资源、频率、复杂度、通用性)。
完成标志
优化前后都有完整、可复现的数据;能解释“为什么有效”以及“代价是什么”。
7. 报告与答辩
报告建议包含以下部分:
- 设计概述:系统结构、NPU 接口、数据通路;
- 正确性验证:测试了哪些规模、如何与参考实现对比;
- 性能评测:数据表、公式、单位、Gantt 图、数据流图、瓶颈分析;
- 优化:优化思路、实现、前后对比、代价;
- 总结与反思:哪些做得好、哪些没达到预期、如果继续做会怎么改进;
- AI 使用说明(如果有):哪些部分使用了 AI、如何验证。
完成标志
能对着自己的框图和数据,把自己的设计和优化过程讲清楚。