Verdi 调试工具使用指南
从环境配置到波形分析,EDA 工程师必备技能全解析
#Verdi #EDA #仿真调试 #SystemVerilog #IC验证
Verdi(原 Novas Debussy)是业界主流的硬件设计调试工具,支持波形查看、原理图追踪、代码高亮等功能。在 Linux 环境下使用 Verdi 前,需要正确配置以下三个环境变量。
1.1 三个关键环境变量
|
环境变量 |
作用 |
说明 |
|
VERDI_HOME / NOVAS_HOME |
指定 Verdi 安装目录 |
告知仿真器默认路径,为设置 PATH 做准备 |
|
PATH |
让系统找到 Verdi 可执行文件 |
执行 verdi、nWave 等命令的前提 |
|
LD_LIBRARY_PATH |
让系统找到 Verdi 所需库文件 |
包含 *.so(共享对象)、*.a(静态库)等 |
1.2 三个常用验证命令
|
命令 |
用途 |
示例 |
|
echo $VAR |
查询环境变量内容 |
echo $LD_LIBRARY_PATH | sed ‘s/:/\n/g’ |
|
which verdi |
验证 Verdi 是否已在 PATH 中 |
成功则显示可执行文件路径 |
|
uname -m |
查询系统硬件平台 |
返回 x86_64 等信息,用于选择 PLI 库版本 |
�� LD_LIBRARY_PATH 的搜索机制:依次搜索各目录,匹配到库文件后停止。可用 echo $LD_LIBRARY_PATH | sed ‘s/:/\n/g’ 按行打印各路径,方便排查配置问题。
二、Dump 波形的两大方法
Verdi 支持两种主流的波形 Dump 方式,各有优劣,工程实践中通常推荐使用 ucli/TCL 接口。
2.1 方法对比
|
方法 |
原理 |
优点 |
缺点 |
|
系统函数 |
在 Verilog/SV 代码中插入 $fsdbDumpfile/$fsdbDumpvars 等 |
工程师熟悉 Verilog,上手快 |
需重新编译;不支持正则;灵活性差 |
|
ucli/TCL 接口 |
通过外部 TCL 脚本控制仿真器行为 |
无需重编译;支持正则;可动态调整 dump 范围;交互式控制 |
需要掌握 TCL 语言 |
2.2 常用 ucli/TCL 函数速查
|
函数名 |
功能 |
|
fsdbDumpvars 0 “tb_top” |
从 tb_top 开始 dump 所有层次(0=全部层次) |
|
fsdbDumpMDA |
Dump 多维数组(MDA) |
|
fsdbDumpSVA |
Dump SVA(System Verilog Assertions) |
|
fsdbDumpon / fsdbDumpoff |
运行中动态开启/关闭 dump |
|
fsdbSwitchDumpfile |
切换 dump 文件 |
|
fsdbAutoSwitchDumpfile |
按大小自动切换 dump 文件 |
|
fsdbDumpFinish |
结束 dump,关闭文件 |
|
fsdbDumpflush |
强制刷新 dump 到磁盘 |
2.3 典型 TCL dump 脚本
以下为标准的 dump_fsdb_vcs.tcl 脚本结构(VCS 版):
global env
fsdbDumpfile “$env(demo_name).fsdb” ;# 波形文件名受环境变量控制
fsdbDumpvars 0 “tb_top” ;# 0 = dump 所有层次
run ;# 启动仿真(仿真器由 ucli 接管)
�� fsdbDumpvars 的第一个参数 0 表示“所有层次“,而非“最大层次数为0″,这是一个常见误解。
三、三大仿真器与 Verdi 集成
Verdi 支持 Synopsys VCS、Cadence IRUN(Incisive)、Mentor Questa 三大主流仿真器。各仿真器的集成方式略有差异,核心思路相同:编译时加载 PLI 库,执行时通过 ucli/TCL 脚本控制波形 dump。
3.1 VCS + Verdi
▌ 编译脚本关键参数:
VCS \
-sverilog \
-debug_pp \ # 使能 ucli 调试接口
-LDFLAGS -rdynamic \ # 传递给 linker,与 PLI 加载配合
-P ${VERDI_HOME}/share/PLI/VCS/${PLATFORM}/novas.tab \ # 加载表格文件
${VERDI_HOME}/share/PLI/VCS/${PLATFORM}/pli.a \ # 加载静态库
./${demo_name}/tb_top.f \
+vcs+lic+wait \
-l compile.log
▌ 执行脚本关键参数:
./simv \
-ucli -i ./scripts/dump_fsdb_vcs.tcl \ # -i 指定 ucli 输入脚本
+fsdb+autoflush \ # 边仿真边 dump,防止断电丢数据
-l sim.log
3.2 IRUN(Cadence Incisive)+ Verdi
▌ 编译脚本关键参数:
irun \
-elaborate \
-access +r \ # 必须:赋予信号读权限,否则 PLI 无法访问
./${demo_name}/tb_top.f \
-top tb_top \
-licqueue \
-l elaborate.log
▌ 执行脚本关键参数:
irun \
-input ./scripts/dump_fsdb_irun.tcl \ # -input 指定 ucli 脚本(非 -i)
+fsdb+autoflush \
-licqueue \
-l sim.log
▌ IRUN TCL 脚本与 VCS 的差异:
global env
call fsdbDumpfile “$env(demo_name).fsdb” ;# IRUN 需要加 call 命令前缀
call fsdbDumpvars 0 “tb_top”
run
quit ;# IRUN 不会自动结束,必须加 quit
�� IRUN 与 VCS 的两个关键区别:①TCL 函数调用需加 call 前缀;②仿真结束后需手动执行 quit 命令,否则进程不会退出。
3.3 Questa(Mentor)+ Verdi
▌ 编译脚本关键参数:
vlib work && vmap work work
vlog \
-64 \
+acc \ # 必须:使 PLI 加载有效
./${demo_name}/tb_top.f \
-l compile.log
▌ 执行脚本关键参数:
vsim \
-64 -batch -novopt \
-pli ${VERDI_HOME}/share/PLI/MODELSIM/${PLATFORM}/novas_fli.so \ # 加载共享库
work.tb_top \
-do ./scripts/dump_fsdb_questa.tcl \ # -do 指定 TCL 脚本(非 -input)
+fsdb+autoflush \
-l sim.log
▌ Questa TCL 脚本:
global env
sdbDumpfile “$env(demo_name).fsdb”
sdbDumpvars 0 “tb_top”
run -all ;# 运行到仿真结束
quit -sim ;# 退出仿真
3.4 三大仿真器集成对比
|
仿真器 |
公司 |
PLI 库类型 |
ucli 脚本参数 |
特殊注意 |
|
VCS |
Synopsys |
pli.a(静态库) |
-i |
-debug_pp 使能调试 |
|
IRUN |
Cadence |
novas_pli.so |
-input |
TCL 函数需加 call;需 quit |
|
Questa |
Mentor |
novas_fli.so(共享库) |
-do |
+acc 编译选项必须 |
四、Dump 波形的工程策略
合理控制 dump 的空间范围和时间范围,可显著减小 FSDB 文件体积,提升仿真和调试效率。
4.1 不同验证场景的 Dump 策略
|
场景 |
空间范围 |
时间范围 |
说明 |
|
Block 验证 |
顶层→ 最底层(全层次) |
0 → 仿真结束 |
单模块调试,需看所有信号 |
|
全芯片验证 |
顶层→ 中间层(底层已验证) |
仿真结束 |
底层已充分验证,只关注模块间接口 |
|
接口时序分析 |
仅接口部分 Block |
根据用例选择 |
关注 Block 间接口时序,再逐步深入 |
|
初始化用例 |
按需设置 |
从 0 时刻开始 |
覆盖完整初始化流程 |
|
功能测试用例 |
按需设置 |
初始化完成后开始 |
跳过初始化,节省文件空间 |
�� dumpon/dumpoff 的黄金用法:在 TCL 脚本中结合仿真时间动态控制 dump 范围,例如:run 100ns → fsdbDumpoff → run 200ns → fsdbDumpon → run,可精准捕获感兴趣的时间段。
五、Verdi 加载设计与波形
5.1 加载设计脚本
Verdi 的设计加载参数与 VCS 类似,支持同一套文件列表(.f 文件):
verdi \
-sverilog \
-f ./${demo_name}/tb_top.f \ # 设计文件列表
-top tb_top \ # 指定顶层模块
-nologo \ # 关闭欢迎界面
# 其他常用参数:
# +incdir+<dir> 设置 include 文件目录
# +libext+.v 设置库文件后缀
# -v <file> 指定可搜索的设计文件
# -y <dir> 设置可搜索设计的目录
5.2 加载波形
|
方式 |
操作 |
说明 |
|
手动加载 |
nWave 菜单 → File → Open |
适合临时查看单个波形文件 |
|
自动加载 |
dbg 脚本中加 -ssf ${waveform} |
启动 Verdi 时直接加载指定 FSDB |
|
重新加载设计 |
nTrace → File → Reload Design |
代码修改后无需重启 Verdi |
|
重新加载波形 |
nWave → File → Reload |
仿真完成后刷新波形,无需重开窗口 |
��善用“重新加载“功能,可以避免频繁开关 Verdi 界面和重复申请 License,在 License 紧张的团队中尤为重要。
六、nWave 波形查看技巧
6.1 选择信号的两种方式
|
界面 |
操作方式 |
说明 |
|
nTrace(层级树) |
鼠标左键拖拽选框 / Ctrl+W |
从原理图层级选取信号,拖到 nWave |
|
nWave(波形) |
支持通配符 * 批量匹配 |
可输入 tb_top.u0.* 批量选择信号 |
6.2 波形操作快捷键速查
|
快捷键 |
功能 |
说明 |
|
Z |
放大波形(推荐) |
以当前鼠标位置为中心放大 |
|
Shift+Z |
缩小波形 |
|
|
鼠标中键按住拖动 |
平移波形(推荐) |
快速横向移动查看不同时刻 |
|
Ctrl+P |
复制选中信号 |
配合 Ctrl+V 在不同层添加同一信号 |
|
Del |
删除选中信号 |
清理 nWave 中不需要的信号行 |
|
M |
添加 Marker 标记 |
在当前时刻点添加标记,方便定位 |
|
| (竖线) |
跳到下一个 ns |
快速步进时间 |
|
点击 1% 符号 |
左侧放大 |
6.3 时间线与 Marker
|
元素 |
触发方式 |
用途 |
|
黄色时间线 |
鼠标左键单击 |
主游标,显示当前时刻信号值 |
|
白色时间线 |
鼠标中键单击 |
辅游标,与黄色线配合显示时间差 |
|
时间差显示 |
两条线之间 |
直接读取时间差,也可换算成频率 |
|
Marker |
快捷键 M |
标记关键时间点,方便在长波形中定位 |
6.4 信号值查找(Search)
|
搜索类型 |
应用场景 |
特点 |
|
任意值变化 |
组合逻辑指示信号 |
捕获信号任何变化时刻 |
|
信号上升沿/下降沿 |
时钟使能、握手信号 |
精确定位上升沿或下降沿 |
|
总线值 |
数据总线查找特定值 |
支持 2/8/10/16 进制,支持部分匹配 |
|
模拟值 |
数字采样正弦波、ADC数据 |
适用于模拟量信号 |
|
进制显示 |
查看字符型数据 |
支持 ASCII 显示,方便看字符串 |
|
有符号/无符号 |
有符号运算结果 |
推荐使用 2’s 补码有符号显示 |
|
状态机状态 |
FSM 调试 |
直接显示状态名,而非编码值 |
写在最后
本文内容涵盖从环境搭建到实际波形分析的完整工作流。核心要点如下:
·① 环境变量配置是基础:VERDI_HOME → PATH → LD_LIBRARY_PATH,三者缺一不可
·② 优先使用 ucli/TCL 接口 Dump 波形,灵活性远超系统函数方式
·③ 三大仿真器集成原理相同,关键差异在于:PLI 库类型、脚本参数名、TCL 语法细节
·④ 合理规划 Dump 的空间+时间范围,避免生成 GB 级 FSDB 文件拖慢调试效率
·⑤ 善用 Reload(重新加载)功能,减少反复申请 License 的时间浪费
·⑥ 熟练掌握 Z/Shift+Z/鼠标中键 等快捷键,波形分析效率至少提升 3 倍
夜雨聆风