121、NPU的硬件仿真:使用VerilogVHDL设计MAC单元
121、NPU的硬件仿真:使用Verilog/VHDL设计MAC单元去年做一款边缘AI芯片的RTL验证,仿真跑了一周,结果发现卷积层的输出全是NaN。追了三天,最后定位到MAC单元的累加器——那个该死的溢出标志位被我写成了组合逻辑,导致流水线拍数对不上。更气人的是,综合工具没报错,仿真波形看起来也“正常”,直到把中间结果打印成十六进制才发现高位被截断了。从那以后,我设计MAC单元必做三件事:定点数格式文档化、饱和处理显式化、仿真脚本里加断言检查溢出。今天这篇笔记,就聊聊怎么用Verilog(VHDL同理,语法不同但思路一样)写一个能用的MAC单元。不扯高大上的理论,全是调过仿真、上过FPGA、流过片的经验。MAC单元到底在算什么MAC就是乘累加,公式简单:acc = acc + a * b。但在NPU里,这个操作会被疯狂复用。一个卷积层,输入特征图256通道,权重256组,每个输出像素要算256次乘加。所以MAC单元的设计直接决定了NPU的吞吐和能效。实际芯片里,MAC很少单独存在,通常是一个乘加阵列。但理解单个MAC是理解阵列的基础。我们这里先搞定单路MAC,后续文章再扩展到脉动阵列。定点数选择:别用浮点,除非你不在乎面积很多初学者上来就用float或real,仿真能跑,但综合会告诉你“不支持”。NPU里99%的情况用定点数。常见格式是Qm.n,m位整数位,n位小数位,总位宽m+n。我习惯用