波形文件格式解析:VCD格式详解、FSDB格式详解、波形文件结构、常用EDA工具支持的格式

各位同学好,我是老陈。做验证这行十几年了,今天咱们来聊聊波形文件格式。说实话,刚入行那会儿我也被这些格式搞得头晕——VCD、FSDB、WLF、SHM……到底用哪个?有什么区别?

嗯,别急。这一章我带你把这些格式扒个底朝天。你搞懂了它们,后面做自动比对才能游刃有余。

波形文件到底是个啥?

说白了,波形文件就是芯片内部信号的「时间旅行记录仪」。它把每个信号在每个仿真时刻的值都记下来。你想想看,一个芯片几百万个门,每个门每纳秒都在跳变,这数据量得多大?

所以波形文件格式的核心就两个问题:怎么存得全?怎么存得快?

我个人习惯把波形文件分成两类:

  • 标准格式:VCD 是 IEEE 标准,谁都能读
  • 厂商格式:FSDB 是 Synopsys 的,WLF 是 Mentor 的,各有所长

核心观点:没有最好的格式,只有最适合你场景的格式。做自动比对时,我建议优先考虑 VCD 和 FSDB,原因后面细说。

VCD 格式详解

VCD(Value Change Dump)是 IEEE 1364 标准定义的波形格式。说白了就是最「老实」的格式——信号怎么变,它就怎么记。

VCD 文件长啥样?

我直接给你看一段真实的 VCD 文件内容:

$date
    April 10, 2025
$end
$timescale
    1 ns
$end
$scope module top $end
$var wire 1 ! clk $end
$var wire 1 @ rst_n $end
$var reg  8 # data_bus $end
$upscope $end
$enddefinitions $end
#0
b00000000 #
1!
1@
#5
0!
#10
1!
b10101010 #

你看,结构其实很清晰:

  • 头部:日期、时间精度、信号定义
  • 信号映射:每个信号用一个符号(!、@、#)代表
  • 时间戳:以 # 开头,后面跟时间值
  • 值变化:信号名 + 新值

小技巧:VCD 文件是纯文本的,你可以用任何文本编辑器打开。我曾经在项目里直接用 Python 的 open() 函数读 VCD 做比对,虽然慢了点,但胜在灵活。

VCD 的优缺点

优点 缺点
IEEE 标准,所有工具都支持 文件体积巨大(纯文本)
可读性强,人能看懂 读写速度慢
无需额外库,直接解析 不支持压缩、索引
跨平台、跨工具 大项目根本跑不动

我记得有一次做后仿,一个 SoC 项目跑了 10 毫秒的仿真,VCD 文件直接干到了 200GB。嗯,从那以后我就学乖了——小模块用 VCD,大项目还是得用 FSDB。

FSDB 格式详解

FSDB(Fast Signal Database)是 Synopsys 的专有格式。说白了就是「又快又小」——它用二进制存储,还带压缩和索引。

FSDB 的核心优势

  • 二进制存储:文件体积只有 VCD 的 1/5 到 1/10
  • 增量加载:不需要把整个文件读进内存
  • 信号索引:可以只加载你关心的信号
  • 层次化结构:保留设计层次信息

注意:FSDB 是 Synopsys 的闭源格式。你要读写 FSDB,必须用 Synopsys 的 VCS 或者他们提供的 API(libfsdb)。我曾经踩过这个坑——换了工具链,结果 FSDB 读不了,只能重新跑仿真。

FSDB 文件结构

FSDB 内部其实分几个区域:

  1. 文件头:版本号、时间精度、创建工具
  2. 信号定义区:所有信号的层次路径、类型、位宽
  3. 时间索引区:每个时间点的偏移量,方便随机访问
  4. 值变化区:实际的信号变化数据

你想想看,有了时间索引,你要看第 1000ns 到 2000ns 的波形,FSDB 直接跳到那个位置读就行。VCD 呢?得从头读到尾。这就是差距。

常用 EDA 工具支持的格式

我整理了一张表,你一看就明白:

工具 厂商 原生格式 支持的其他格式
VCS Synopsys FSDB、VPD VCD
QuestaSim Siemens EDA WLF VCD、FSDB(需插件)
Xcelium Cadence SHM、ISS VCD、FSDB
Verilator 开源 VCD、FST 无
GTKWave 开源 VCD、LXT、FST FSDB(需插件)

我的建议:做自动比对时,如果项目里用的是 Synopsys 工具链,直接用 FSDB。如果是混合环境,VCD 是最保险的选择——虽然慢,但不会出兼容性问题。

波形文件结构对比图

下面这张图是我用 SVG 画的,把三种主流格式的结构放在一起对比,你一看就懂:

波形文件结构对比 VCD(文本格式) 头部(日期/时间精度) 信号定义($scope/$var) 时间戳 #0 值变化记录 时间戳 #5 ... 顺序读取 FSDB(二进制格式) 文件头(版本/精度) 信号定义区(层次化) 时间索引区(偏移量) 值变化区(压缩存储) 随机访问 增量加载 WLF(Questa 格式) 数据库头 设计层次结构 信号列表 波形数据(分页存储) 虚拟内存映射 信号过滤 → →

从这张图你能看出来:VCD 是「一条道走到黑」,FSDB 和 WLF 都支持随机访问。这就是为什么大项目里没人用 VCD 做比对——读一次文件要几个小时,谁受得了?

做自动比对时怎么选格式?

我个人经验总结了几条原则:

  1. 小模块(< 100 个信号):用 VCD,解析简单,Python 几行代码搞定
  2. 中等规模(100-1000 个信号):用 FSDB,配合 Synopsys 的 API 做比对
  3. 大项目(> 1000 个信号):建议用 FSDB 或 WLF,而且只比对关键信号

避坑指南:我曾经在一个项目里试图把整个 SoC 的波形都 dump 出来做比对,结果仿真跑了三天三夜没跑完。后来学乖了——只 dump 接口信号和关键状态机,比对时间从三天降到了十分钟。

好了,这一章的内容就到这儿。你掌握了波形文件的格式和结构,下一章咱们就可以动手写代码做比对了。


可可精品资料库