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调试环境搭建与工程导入流程 ① 安装与环境配置 VERDI_HOME / PATH LD_LIBRARY_PATH / NOVAS_HOME ② License检查 SNPSLMD_LICENSE_FILE lmstat -a | grep verdi ③ 编译Verdi KDB vcs -kdb 或 vericom -kdb 生成 kdb.elab++ / kdb.src++ ④ 加载波形 FSDB / VCD verdi -ssf wave.fsdb Verdi 调试界面 Hierarchy 层次树 Source 源码窗口 Wave 波形窗口 Trace 驱动追踪 核心调试动作 信号拖入波形窗口 Trace Driver / Load Load Source 跳转RTL 层次树逐层展开定位 结果:波形异常 → 源码定位 → 驱动追踪 形成从"看到现象"到"找到根因"的完整闭环 常见问题与判断依据 License报错:先看Feature名和错误码,再查lmstat KDB为空:检查编译是否加-kdb,-top是否匹配 波形全X:检查dump范围、起始时间、信号路径 源码找不到:补充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行
提示:如果团队使用统一的模块化环境脚本(module load),建议把 VERDI_HOME、PATH、LD_LIBRARY_PATH 和 SNPSLMD_LICENSE_FILE 都写进脚本,避免每次手动export。同时注意VCS与Verdi版本匹配,跨大版本混用可能导致KDB格式不兼容。
注意:FSDB dump会显著增加仿真时间和磁盘占用。在大型SoC仿真中,建议按层次和信号范围分层dump,例如只dump关键模块的 +all,其余模块按需dump,而不是全局 $fsdbDumpvars(0, tb_top, "+all")。否则波形文件可能达到几十GB,加载和调试效率都会下降。