VCD 与 SAIF:芯片功耗分析的两种活动数据格式
在 DPA 技术报告 里我们反复提到,动态功耗分析的本质是"拿到真实业务激励下电路的翻转活动(toggle activity),再乘上工艺库的单元功耗模型"。但翻转活动落到磁盘上,长什么样?这份文档专门讲清楚两种最常被功耗工具消费的格式:VCD 和 SAIF。
术语前置:VCD(Value Change Dump,值变化转储)是 IEEE 1364 标准定义的波形文件,记录每个信号在每一时刻的取值变化;SAIF(Switching Activity Interchange Format,翻转活动交换格式)是 Synopsys 定义的统计格式,只记录每个网表节点在一段时间内的翻转次数/翻转率,不保留逐时刻波形。
1 为什么需要专门的活动格式
仿真器/Emulator 跑起来后,芯片内部每个寄存器和线网都在频繁跳变。要把"哪里在翻转、翻了多少次"告诉后端的 PrimePower、PT‑PX 去做功耗计算,就必须把活动外化成一种双方都认的格式。
这里有个工程上的根本矛盾:
- 想要最全的信息(任意时刻任意信号的值)→ VCD,但体积爆炸;
- 想要够算功耗的信息(每个节点的翻转次数就够了)→ SAIF,体积小几个数量级。
功耗计算其实只需要"每个节点翻了几次",并不需要"某个信号在第 1234 个周期具体是 0 还是 1"。这就是 SAIF 存在的理由。
2 VCD:完整的波形真相,但太重
2.1 结构长什么样
VCD 是纯文本(或压缩二进制变体),核心由三部分组成:
- 头声明:时间精度(
$timescale)、日期、仿真器版本; - 变量定义:把每个信号映射成一个短标识符(如
!),并标注层次路径、位宽、类型(wire/reg 等); - 值变化序列:时间戳
#100后跟0!(信号!变 0)、1"(信号"变 1)这样的记录,按时间顺序一直写下去。
2.2 怎么生成
- RTL/门级仿真(VCS、Xcelium、ModelSim)里
$dumpvars/dump -file xxx.vcd打开; - 综合后的门级网表仿真能 dump 到标准单元级信号,精度最高;
- Emulator 一般不原生吐 VCD(太慢),但通过 DPA‑DB 可以导出等价活动(见 DPA‑DB 文档)。
2.3 致命问题:体积
一个十亿门 SoC 跑几百万周期,每个周期几亿个信号可能跳变,VCD 就是天文数字级别的文件。全芯片亿周期几乎不可能直接 dump VCD——磁盘先爆了,下游工具也读不动。所以它通常只用于小模块、短窗口的精细调试,不适合系统级 DPA。
3 SAIF:为功耗而生的统计格式
3.1 它记的是什么
SAIF 不记录逐时刻波形,而是记录每个网表节点的统计:
- 节点标识符与层次路径;
- 一段时间内的 0→1 翻转次数、1→0 翻转次数(或合并的 total toggle 数);
- 节点被观测的时长(用来折算翻转率);
- 部分实现还带静态概率(节点为 1 的时间占比),供工具做更准的功耗估算。
功耗公式里动态功耗 ∝ 翻转率,所以"翻了几次"就是 SAIF 给的全部燃料。
3.2 生成链路
3.3 为什么 SAIF 体积可控
因为它对"时间"做了聚合——不再保留每一拍的瞬时值,只留汇总统计量。同样一个 SoC 跑长周期,SAIF 可能只有几十到几百 MB,而 VCD 会到 TB。这就是为什么 DPA 报告第 3、4 章 里强调,系统级功耗采集的输出物是 SAIF 而不是 VCD。
4 两者怎么选
| 维度 | VCD | SAIF |
|---|---|---|
| 信息粒度 | 逐时刻逐信号波形 | 每节点翻转统计 |
| 体积 | 极大(TB 级风险) | 小(MB~GB 级) |
| 适合场景 | 小模块调试、时序问题定位 | 系统级功耗计算、DPA 输出 |
| 后端消费 | 部分工具可吃,但慢 | PrimePower/PT‑PX 首选 |
| 时序信息 | 含(可看毛刺) | 不直接含,需配合 SDF 重放 |
一个常见组合:Emulator/DPA‑DB 跑长周期出 SAIF 做整体功耗;对尖峰窗口用 Xcelium + SDF 回放导出带时序的 SAIF/VCD 补毛刺(见 UPF/.lib/SDF 文档)。
5 一句话总结
VCD 是把"每一拍发生了什么"全记下来,真但重;SAIF 只记"每个节点翻了几次",够算功耗且轻——系统级 DPA 几乎永远选 SAIF,VCD 留给小范围精细调试。