NPU的硬件仿真:使用SystemVerilog设计脉动阵列去年做AI加速器项目,仿真跑了一周,结果发现卷积输出全是NaN。排查到最后,是脉动阵列里一个PE的累加器复位信号没对齐——这种问题,仿真波形上看就是一根毛刺,但实际芯片流片回来就是废片。今天聊聊脉动阵列的SystemVerilog实现,重点放在那些仿真里容易翻车的地方。脉动阵列的核心:数据流与计算节拍脉动阵列(Systolic Array)本质上是一堆PE(Processing Element)排成矩阵,数据像心跳一样有节奏地流过。每个PE只做一件事:乘加运算。但难点在于数据怎么喂、怎么收、怎么对齐。先看一个4x4的脉动阵列结构。输入特征图数据从左边流入,权重从上方流入,部分和沿着对角线方向累加。这个“对角线方向”是很多新手搞混的地方——实际硬件里,部分和是垂直向下传递的,不是斜着走。// 脉动阵列顶层模块 - 4x4版本 module systolic_array #( parameter DATA_WIDTH = 8, parameter ACC_WIDTH = 16 )( input logic clk, input logic rst_n, input logic [DATA_WIDTH-1:0] ifmap [0:3], // 特征图输入,从左到右 input logic [DATA_WIDTH-1:0] weight [0:3], // 权重输入,从上到下