描述张量运算单元的验证策略

解读

张量运算单元(Tensor Compute Unit, TCU)是AI加速器里吞吐最大、面积占比最高的计算子系统,通常包含多维矩阵乘(GEMM)、卷积(CONV)、转置、池化、激活、量化/反量化等硬连线或微码控制的数据通路。验证难点集中在三点:

  1. 数据维度高、shape 动态可变,导致状态空间爆炸;
  2. 运算精度链路长(FP16→FP32→INT8→INT4),舍入、饱和、溢出、下溢、Subnormal、NaN、Inf 都要覆盖;
  3. 带宽与算力强耦合,数据搬运(load/store、tile buffer、double buffer、prefetch)一旦出错会直接表现为“算对但结果延迟”或“算错但时序满足”,定位困难。

因此面试官想听到的是:你如何把“高维数据+混合精度+复杂调度”拆成可量化、可收敛、可 sign-off 的验证策略,而不是简单罗列 UVM 组件名字。

知识点

  1. 张量运算微架构:systolic array、outer-product、reduction tree、Winograd、FFT-CONV、sparse-dense 混合计算。
  2. 数据格式:FP16/BF16/FP32、INT8/INT4、Sub-byte、Block-Floating-Point、Microscaling (MX) format。
  3. IEEE-754 舍入模式(RNE、RZ、RP、RM)及 PMSA(Positive/Negative Minimum Subnormal Accuracy)检查。
  4. 维度参数空间:NHWC/NCHW、batch、M-K-N、stride、dilation、padding、group、tile-size、split-K。
  5. 覆盖率模型:cross-covergroup(shape×precision×舍入×scale×zero-point×稀疏度×调度策略)。
  6. 参考模型:Python/TensorFlow/PyTorch 黄金模型 + bit-accurate C-model + 定点化误差阈值。
  7. 形式验证:数据一致性(datatype transformation)+ 死锁(systolic array stall)+ 仲裁公平性。
  8. 性能验证:throughput(TOPS)、utilization(%)、bandwidth efficiency(%)、double-buffer 隐藏延迟。
  9. 低功耗场景:clock-gating、memory-gating、power-gating 与功能正确性交叉。
  10. 硬件加速验证:Palladium/Zebu 跑完整网络子图,对比 RTL 与 C-model 的逐层余弦相似度 > 0.9999。

答案

我将张量运算单元的验证拆成“六层漏斗”策略,层层收敛,最终在 6 周内达到零关键 bug、覆盖率达到 100 %(covergroup + assertion + toggle + code)的目标。

  1. 需求层:
    把算法团队给出的《算子精度白皮书》和架构 SPEC 拆成 183 条可量化 feature,每条绑定一条 SVA 或 cover-property;例如“INT8 GEMM 的累加器位宽 ≥ 32 bit,溢出时必须饱和而不是回绕”,直接写成 assert property (acc_overflow |-> acc_q === 32'h7FFF_FFFF)

  2. 数据层:
    用 Python 脚本离线生成 1.2 GB 的“维度+精度+稀疏”三维组合向量,覆盖边界:

    • shape:M=1/7/63/511/1023,K=1/15/255/2047,N=1/31/1023;
    • 精度:FP16/BF16/INT8/INT4 交叉;
    • 稀疏:结构化 2:4、非结构化 50 %、dense;
      数据以 HDF5 落盘,UVM 序列通过 DPI-C 直接 mmap 读取,保证随机但可重复。
  3. 参考模型层:
    在 DPI 里封装三套参考:
    a) 黄金浮点:PyTorch 1.13 + CUDA,误差阈值 1e-6;
    b) 定点/bit-accurate:C-model 与 RTL 同一套 quantize/scale/zero-point;
    c) 性能模型:cycle-accurate SystemC,提前预测 stall 周期,用于性能覆盖率。
    每日 CI 自动对比 RTL 与三套参考,误差 > 阈值即触发邮件告警。

  4. 测试平台层:
    UVM 环境采用“主机-协处理器”双域架构:

    • host域:AXI4 master 驱动 weight/activation DMA;
    • TCU域:tile-buffer 与 systolic array 做 ping-pong 计算;
      关键组件:
    • tensor_sequence:随机产生合法/非法 tensor descriptor,非法 descriptor 必须触发中断;
    • tile_scoreboard:把 3D 张量切成 2D tile,按 K 维度做 split-K 重排,实时比对;
    • precision_monitor:监控每一级 pipeline 的尾数/指数/饱和位,统计 Subnormal 出现次数;
    • performance_probe:采样 utilzation 寄存器,低于 80 % 自动 dump waveform。
      覆盖率模型共 27 个 cross-covergroup,例如 cg_shape_precision_rounding,bin 数 12 k,用 UCIS 合并回归结果,每晚自动分析 unreachable bin,第二天补充定向 case。
  5. 形式与加速层:

    • 对 datatype transform 模块(FP16→INT8)做形式验证,证明绝对误差 ≤ 1 LSB;
    • 对 systolic array 的 stall/flush 做 14 级深度形式验证,证明无死锁;
    • 用 Palladium 跑 ResNet50 首层(112×112×64 卷积),3.2 M 向量比对,余弦相似度 0.99993,性能误差 < 2 %。
  6. sign-off 层:

    • 代码覆盖率:line 100 %,branch 98 %,FSM 100 %,toggle 97 %(剩余 3 % 为 tied 常量);
    • assertion 覆盖率:1 847 条 SVA 100 %;
    • 性能 KPI:在 1 GHz、INT8 条件下,实测 25.4 TOPS,架构指标 26 TOPS,达成率 97.7 %;
    • 功耗验证:VCS-NLP 联合仿真,动态功耗 3.8 W,与 PowerArtist 静态估算误差 < 5 %;
    • 最终交付《验证报告》《覆盖率报告》《 waiver 清单》《风险列表》,经技术评审委员会一次性通过,进入物理实现。

拓展思考

  1. 若 TCU 支持可变 tile size(8×8~64×64),如何证明 array 边角填充(padding)不会引入性能悬崖?
    答:可在 scoreboard 里增加“有效 MAC 利用率”探针,当 tile 小于 16×16 时利用率下降 > 10 % 即报警,并用形式验证证明边角 stall 信号与 tile 大小呈线性关系,无指数爆炸。

  2. 若未来引入 4-bit 浮点(e2m1),如何更新参考模型?
    答:在 DPI 里新增 microscaling format 查表,把 4-bit 指数偏移、尾数隐藏位、Subnormal 区间全部参数化,重新标定误差阈值;同时把 covergroup 的 precision bin 从 4 扩到 5,确保老 case 可复用。

  3. 若芯片回片后实测 TOP5 精度比仿真低 0.3 %,如何定位是 TCU 还是 DDR 带宽问题?
    答:在 FPGA 原型上复现同一 batch,把 DDR 降频 20 %,若精度下降扩大,则瓶颈在带宽;若精度不变,则回到 TCU,检查是否因温度升高导致动态舍入模式被意外切到 RZ。