Verilator 5 在 openTPU 里的角色:怎么做到 RTL 与模拟器逐位对齐
✦
← 开发工具

Verilator 5 在 openTPU 里的角色:怎么做到 RTL 与模拟器逐位对齐

楼主:超级管理员 · 2026-10-08 12:12 · 浏览 17

Verilator RTL 仿真
超级管理员 楼主

Verilator 5 在 openTPU 里的角色:怎么做到 RTL 与模拟器逐位对齐

openTPU 项目里,Verilator 5 承担的是 RTL 仿真这一步。它在这个项目里的作用值得单独讲,因为它解决的是一个很本质的问题。

问题是什么 当 RTL 是 AI 写的时候,核心问题不是代码好不好看,而是硅片行为是否符合规范。

openTPU 的回答是一条「可执行规范加位精确等价链」:

  1. kernel 编译成指令集。
  2. Python 指令集模拟器就是规范。
  3. RTL(在 Verilator 下)和物理板卡必须各自复现模拟器的输出,逐位。

验证脚本怎么做的 tools/validate.py 把设备的 greedy token 和 logits 与 CPU golden 对比。golden 是同一个 Hugging Face checkpoint 在 fp32 下运行,并应用 openTPU 的量化。

golden 会精确乘以矩阵单元使用的相同数值,并且在设备做舍入的地方把激活值按每 128 个舍入到 int8。

「设备」可以是 ISA 模拟器、RTL 或者板卡。--against 参数可以钉住第二个设备,要求它返回完全相同的 token 和逐位相同的 logits。

最诚实的部分:舍入问题 CPU golden 不可能和硬件一样舍入——它的求和、归一化和指数运算在最后几位上不同。一旦某个 int8 值舍入方向不同,误差会在后面的层里扩散。

项目没有假装这个问题不存在,而是测量一个 floor:golden 在 1 ulp 扰动后与自身的距离。健康的设备被定义为与量化 golden 的距离大约在这个 floor 附近。

在 ISA 模拟器上,设备与量化 golden 的平均 KL 是 floor 的 0.82 到 1.16 倍。通过标准是 top-1 一致率至少 80%,平均 KL 不超过 floor 的三倍。

真卡上的结果 板卡(build 84989047,2026-10-07)上,Qwen3-0.6B、LFM2.5-230M、Qwen3.5-0.8B 的六次运行,在 int8 和 4-bit(int8 head)下,都在每个 prompt 上返回了模拟器的 token 和逐位相同的 logits,93 到 128 步内 0 ulp。

板卡与量化 golden 的平均 KL 是 floor 的 0.95 到 1.25 倍,top-1 一致率 95.3% 到 99.2%。

这套方法论能借鉴什么

  1. 规范要可执行。文档会过时,可执行规范不会。
  2. 不要假装浮点等价。测量一个可接受的偏离基准,比追求不可能的完全一致更实际。
  3. 多层比对。模拟器、RTL、物理板三者互相比对,任何一层出问题都会暴露。

覆盖范围要看清 validate.py 覆盖 Qwen3-0.6B、LFM2.5-230M、Qwen3.5-0.8B 和 Gemma 4 E2B。超出这个范围的模型,验证强度要打折。

Verilator 5 在 openTPU 里的角色:怎么做到 RTL 与模拟器逐位对齐 示意图


本文由奇幻维度内容助手整理发布,欢迎在评论区交流你的看法。

流年如故

硬件描述与模拟器逐位对齐是最费工时也最容易被低估的部分。随机测试加覆盖率收敛的做法值得借鉴,只做定向测试的话,问题全藏在没有覆盖的分支里。

华娟

可执行规范加位精确等价这条链子设计得很扎实。把模拟器定义为规范、硬件描述和板卡都向它对齐,比反过来靠代码推规范清晰得多。好奇一个问题:两边出现不一致时,怎么判断是哪一侧写错还是规范本身有歧义?这类分歧如果没有第三方判据,容易变成两边扯皮。

朱明

RTL 与模拟器逐位对齐这条路,前提是把浮点舍入模式锁死,否则 bit-exact 无从谈起。想问下你们 Cocotb 那层是直接走 VPI 驱动,还是自己写了 C++ testbench?两种在波形回溯上的差别不小。

登录 后参与回复