2. 波形分析入门

各位做验证的兄弟,今天咱们聊聊波形分析。说实话,我刚入行那会儿,觉得看波形就是对着信号线发呆。后来踩了不少坑,才慢慢摸出门道。这一章,我把最基础的东西掰开揉碎了讲给你听。

一、波形是怎么生成的?VCS/Verdi 流程

先搞清楚一件事:波形不是凭空变出来的。你得告诉仿真器「我要抓波形」。我个人习惯用 VCS 做仿真,配合 Verdi 看波形,这套组合拳在业界很常见。

基本流程是这样的:

  1. 编译阶段:用 vlogan、vhdlan 把 RTL 代码编译成库
  2. 仿真阶段:用 vcs 跑仿真,同时生成波形文件
  3. 查看阶段:用 Verdi 打开波形文件,开始分析

嗯,这里有个关键点——你得在 Testbench 里加上波形 dump 的代码。不然仿真跑完了,波形文件是空的。

核心命令示例:

# 编译
vlogan -sverilog -work work top.sv
vcs -debug_access+all -l vcs.log top

# 仿真(带波形)
./simv -l sim.log

# 用 Verdi 打开
verdi -ssf waveform.fsdb &

我在项目中遇到过好几次,同事忘了加 -debug_access+all 选项,结果波形里只能看到顶层信号,内部模块全黑。说白了,这个选项就是给仿真器开绿灯,让它把内部信号都吐出来。

二、FSDB vs VPD:选哪个?

波形格式这事儿,其实挺有意思。市面上主流就两种:FSDB 和 VPD。你想想看,为什么会有两种?因为背后是两家公司——Synopsys 推 VPD,NOVAS(现在被 Synopsys 收了)推 FSDB。

对比项 FSDB VPD
文件大小 较小(压缩率高) 较大
加载速度 快 中等
工具支持 Verdi 原生支持 VCS 原生支持
调试功能 支持波形比较、查找 基本功能
我的推荐 日常调试首选 回归测试用

我个人习惯用 FSDB。为什么?因为 Verdi 对 FSDB 的支持最好,加载快,而且文件小。我曾经有个项目,VPD 文件 20GB,换成 FSDB 后只有 6GB。你想想看,省了多少硬盘空间。

小技巧:如果你用 VCS 仿真,想生成 FSDB 波形,需要在 Testbench 里这样写:

initial begin
    $fsdbDumpfile("waveform.fsdb");
    $fsdbDumpvars(0, top_tb);
end

这里的 0 表示 dump 所有层级。如果只想看某几个模块,可以指定层级深度。

三、波形加载与基本查看操作

波形文件生成好了,怎么打开?怎么用?别急,我一步步说。

3.1 加载波形

打开 Verdi 后,有两种方式加载波形:

  • 命令行加载:verdi -ssf waveform.fsdb &
  • GUI 加载:File → Open Database → 选择 .fsdb 文件

我记得第一次用 Verdi 时,找了半天「Open」按钮。其实快捷键是 Ctrl+O,直接弹窗选文件就行。

3.2 添加信号到波形窗口

波形加载后,默认是空的。你得把想看的信号拖进去。操作很简单:

  1. 在源代码窗口选中信号名
  2. 按住鼠标左键,拖到波形窗口
  3. 松开,信号就出现了

或者更快的办法:选中信号后按 Ctrl+W,直接添加到波形窗口。

避坑指南:我曾经一次性拖了 200 个信号进波形窗口,结果 Verdi 卡死了。后来学乖了——先加关键信号,看明白了再加别的。别贪多,一口吃不成胖子。

3.3 基本查看操作

信号加进来了,怎么用?这几个操作你必须会:

  • 放大/缩小:鼠标滚轮,或者按 Z(放大)/ Shift+Z(缩小)
  • 拖动时间轴:按住 Ctrl + 鼠标左键拖动
  • 测量时间差:按 M 键,在波形上点两个位置,自动显示时间差
  • 查找信号值:按 F 键,输入要查找的值(比如 1、0、X)

嗯,这里有个小细节。测量时间差时,Verdi 默认显示的是时间。如果你想看相对时间,可以在波形窗口右键 → Time Format → 选 Relative。这样两个光标之间的差值就显示出来了。

3.4 信号分组与颜色

信号多了怎么办?分组!我习惯把同一总线的信号放在一组,比如 AXI 的地址、数据、控制信号各一组。操作:

  • 选中多个信号,右键 → Group → New Group
  • 给组起个名字,比如 "AXI_ADDR"
  • 还可以给组设置颜色,方便区分

颜色怎么设?双击信号名左边的颜色方块,弹出色盘。我个人喜欢把时钟信号设成红色,复位信号设成蓝色,数据信号设成绿色。这样一眼就能看出来。

我的经验:信号分组 + 颜色标记,能让你的调试效率提升 50%。别不信,试试就知道了。

四、知识体系总览

说了这么多,咱们用一张图把本章内容串起来:

波形分析入门知识体系 波形分析入门 VCS/Verdi 生成流程 FSDB vs VPD 选择 加载与基本查看 编译 (vlogan) 仿真 (vcs) 查看 (verdi) FSDB 格式 VPD 格式 文件大小对比 加载波形文件 添加信号 分组与颜色

这张图把本章的三个核心内容串起来了:生成流程是基础,格式选择是决策,加载查看是实操。三者缺一不可。

五、避坑指南

最后,分享几个我踩过的坑:

  • 波形文件太大:仿真跑了一整天,波形文件 100GB,硬盘爆了。后来我学会了用 $fsdbDumpvars(2, top_tb) 限制层级深度,只抓关键模块。
  • 信号名乱码:Verdi 打开波形,信号名全是乱码。原因是编译时没加 -sverilog 选项,SystemVerilog 的关键字没识别。重新编译就好了。
  • 波形和代码对不上:明明改了代码,波形还是老样子。嗯,忘了重新编译。记住:改代码后一定要重新编译+仿真,不然波形不会更新。

最后一个小建议:刚开始学看波形,别追求一次看全。先加 3-5 个关键信号,看明白了再加。慢慢来,比较快。