1. Verdi调试环境搭建与工程导入
Verdi是Synopsys公司推出的波形查看与调试平台,在数字前端验证、FPGA原型调试和SoC集成阶段被广泛使用。它的核心价值在于把仿真产生的波形数据(FSDB/VCD)与RTL源码、设计层次、信号驱动关系关联起来,让工程师能够从"看到异常波形"快速定位到"哪一行代码产生了这个异常"。要发挥这套能力,第一步是把环境搭对、把工程导进来。本章围绕安装配置、License检查、编译Verdi KDB、加载FSDB/VCD波形、打开设计层次与源码关联这条主线展开,给出可复现的操作路径和判断依据。
一、安装与基础环境配置
Verdi通常随VCS一起安装,安装目录形如 $VERDI_HOME,其下包含 bin/、share/、platform/ 等子目录。安装完成后需要配置三类环境变量:
export VERDI_HOME=/tools/synopsys/verdi/V-2023.03
export PATH=$VERDI_HOME/bin:$PATH
export LD_LIBRARY_PATH=$VERDI_HOME/share/FsdbReader/lib:$LD_LIBRARY_PATH
export NOVAS_HOME=$VERDI_HOME # 兼容旧脚本中的NOVAS变量
其中 LD_LIBRARY_PATH 指向FSDB读取库非常关键,缺少它时Verdi可能启动正常但无法打开FSDB文件。NOVAS_HOME 是历史遗留变量名,很多老Makefile仍在使用,建议一并设置。配置完成后用 which verdi 和 verdi -version 验证可执行文件路径与版本号是否与预期一致。
二、License检查
Verdi依赖Synopsys License,常见Feature包括 Verdi、Verdi_Interactive、Verdi_HDL 等。检查分两步:先确认License服务器可达,再确认Feature可用。
# 1. 确认环境变量指向正确的License
echo $SNPSLMD_LICENSE_FILE
# 例如 27020@lic-server.company.com
# 2. 用lmstat查询Feature占用情况
lmstat -a -c $SNPSLMD_LICENSE_FILE | grep -i verdi
如果 lmstat 返回 Cannot connect to license server,说明网络或端口不通;如果返回 Error: ... Invalid host,通常是主机名解析问题。若Feature显示 Users of Verdi: (Total of 10 licenses issued; Total of 10 in use),说明License已被占满,需要等待释放或申请临时授权。启动Verdi时若弹出License错误对话框,应优先看对话框中的Feature名称和错误码,而不是盲目重装。
三、编译Verdi KDB
KDB(Knowledge Database)是Verdi用于存储设计结构、源码索引和信号信息的数据库。没有KDB,Verdi只能看波形,无法做源码关联和层次追踪。生成KDB有两种方式:
方式一,在VCS编译时直接加 -kdb 选项,让VCS在编译阶段同步生成KDB:
vcs -full64 -sverilog -debug_access+all -kdb \
-f filelist.f -top tb_top -o simv
方式二,对已有设计单独运行 vericom 生成KDB:
vericom -full64 -kdb -sv -f filelist.f -top tb_top \
-o ./kdb_dir
生成后目录中会出现 kdb.elab++、kdb.src++ 等文件。判断KDB是否可用的方法:启动Verdi后打开 Source → Open Design,若能正常列出模块层次树,说明KDB有效;若层次树为空或报 KDB not found,则需要检查编译时是否遗漏 -kdb,或 -top 指定的顶层模块名是否与实际一致。
四、加载FSDB与VCD波形
FSDB是Verdi原生波形格式,压缩率高、加载快,推荐优先使用。在Testbench中加入FSDB dump语句:
initial begin
$fsdbDumpfile("wave.fsdb");
$fsdbDumpvars(0, tb_top, "+all");
$fsdbDumpMDA(); // 导出多维数组
$fsdbDumpSVA(); // 导出SystemVerilog断言
end
仿真结束后得到 wave.fsdb。启动Verdi加载:
verdi -ssf wave.fsdb -nologo &
若只有VCD文件,Verdi也能直接打开,但VCD体积大、无压缩,且不包含FSDB中的MDA/SVA等扩展信息。加载VCD时可用 verdi -vcd wave.vcd,或在Verdi中通过 File → Open → VCD 导入。加载后应检查波形窗口左侧信号树是否完整、时间轴范围是否覆盖仿真区间、关键信号是否有跳变。若信号全为X或时间轴为空,通常是dump范围设置过窄或dump起始时间晚于仿真结束。
五、打开设计层次与源码关联
波形加载后,Verdi的调试能力才真正开始体现。常用操作包括:
- 层次树浏览:在
Hierarchy窗口中展开tb_top → dut → sub_module,逐层查看实例。 - 源码关联:选中某个信号,右键
Trace → Load Source,Verdi会跳转到该信号在RTL中的声明位置。 - 驱动追踪:右键
Trace → Driver,查看该信号由哪些逻辑驱动;Load则反向查看负载。 - 信号添加到波形:在源码或层次树中选中信号,拖入波形窗口即可观察。
源码关联能否成功,取决于KDB中是否记录了正确的文件路径。如果RTL文件被移动过,Verdi会提示找不到源文件,此时可在 Tools → Preferences → Source File Path 中补充搜索路径,或重新生成KDB。
六、环境验证清单
完成上述步骤后,建议按以下清单逐项确认,避免在后续调试中反复排查环境问题:
| 检查项 | 验证命令/操作 | 通过标准 |
|---|---|---|
| Verdi可执行 | which verdi | 返回 $VERDI_HOME/bin/verdi |
| 版本正确 | verdi -version | 显示预期版本号 |
| License可达 | lmstat -a -c $SNPSLMD_LICENSE_FILE | 能列出Verdi Feature且未占满 |
| KDB生成 | 查看编译输出目录 | 存在 kdb.elab++ 等文件 |
| FSDB可加载 | verdi -ssf wave.fsdb | 波形窗口正常显示信号跳变 |
| 源码关联 | 选中信号 → Load Source | 跳转到对应RTL行 |
VERDI_HOME、PATH、LD_LIBRARY_PATH 和 SNPSLMD_LICENSE_FILE 都写进脚本,避免每次手动export。同时注意VCS与Verdi版本匹配,跨大版本混用可能导致KDB格式不兼容。
+all,其余模块按需dump,而不是全局 $fsdbDumpvars(0, tb_top, "+all")。否则波形文件可能达到几十GB,加载和调试效率都会下降。