跳转至

实验步骤

本页给出建议的实验顺序。每个阶段都有“完成标志”,用于自检;如果卡住,先回到对应章节排查。整个实验建议预留 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。

先做一个最简单的总线冒烟测试:

  1. 读 STATUS(0x2000_0004),确认总线能正常返回、不卡死;
  2. 写 CMD(0x2000_0000)触发一次 LDTILE;
  3. 连续读 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:

  1. 把 A 的 4 行写入 L0A(每行 4 个 int8,打包成一个 32 位字);
  2. 把 B 的 4 行写入 L0B;
  3. 写 B_BASE=0,写 CMD=LDTILE,等待完成;
  4. 写 A_BASE=0、C_BASE=0、M_M1=3,写 CMD=TMUL(acc=0),等待完成;
  5. 从 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. 优化

从优化方向中选多项,完成设计、实现和评测:

  1. 先记录优化前的性能数据;
  2. 实现优化,保证功能仍然正确;
  3. 重新评测,记录优化后的性能数据;
  4. 如果改变了阵列规模或每周期运算次数,重新计算峰值算力;
  5. 分析收益和代价(资源、频率、复杂度、通用性)。

完成标志

优化前后都有完整、可复现的数据;能解释“为什么有效”以及“代价是什么”。

7. 报告与答辩

报告建议包含以下部分:

  1. 设计概述:系统结构、NPU 接口、数据通路;
  2. 正确性验证:测试了哪些规模、如何与参考实现对比;
  3. 性能评测:数据表、公式、单位、Gantt 图、数据流图、瓶颈分析;
  4. 优化:优化思路、实现、前后对比、代价;
  5. 总结与反思:哪些做得好、哪些没达到预期、如果继续做会怎么改进;
  6. AI 使用说明(如果有):哪些部分使用了 AI、如何验证。

完成标志

能对着自己的框图和数据,把自己的设计和优化过程讲清楚。

作者:Jiajie Chen