在 Synopsys VCS 中通过 TCL 脚本生成 FSDB 格式的波形文件
在 Synopsys VCS 中通过 TCL 脚本生成 FSDB 格式的波形文件,需要执行以下步骤:
完整操作流程
1. 编译阶段:启用调试功能并链接 Verdi 库
vcs -full64 -debug_acc+all -sverilog \
-LDFLAGS "-Wl,--no-as-needed" \
-P ${VERDI_HOME}/share/PLI/VCS/LINUX64/novas.tab \
${VERDI_HOME}/share/PLI/VCS/LINUX64/pli.a \
-f filelist.f -top tb_top
关键选项说明:
-debug_acc+all:启用所有调试功能-LDFLAGS:链接器选项,确保正确加载 PLI-P:指定 Verdi 的 PLI 接口文件pli.a:Verdi 的 PLI 库文件- 重要:确保
${VERDI_HOME}环境变量已正确设置
2. 创建 TCL 脚本 (dump_fsdb.tcl)
# 设置 FSDB 文件名
fsdbDumpfile "wave.fsdb"
# 设置波形抓取参数
fsdbDumpvars 0 tb_top ;# 0=抓取所有层次,tb_top=顶层模块名
fsdbDumpMDA ;# 抓取多维数组(如存储器)
fsdbDumpSAC ;# 启用层次化压缩
# 可选:延迟抓取(避免初始化波形)
run 100ns
fsdbDumpoff ;# 暂停抓取
fsdbDumpon ;# 继续抓取(可选)
# 运行仿真
run -all ;# 运行到结束
# 退出仿真
exit
3. 执行仿真
./simv -ucli -do dump_fsdb.tcl
参数说明:
-ucli:启用统一命令行接口-do:指定要执行的 TCL 脚本
关键 TCL 命令详解
1. 基本波形抓取命令
# 设置波形文件名
fsdbDumpfile "wave.fsdb"
# 抓取信号:
# 参数1:层次深度 (0=所有层次)
# 参数2:模块路径
fsdbDumpvars 0 tb_top ;# 抓取整个测试平台
# 抓取特定模块:
fsdbDumpvars 2 tb_top.dut ;# 只抓取dut模块下2层信号
2. 高级控制选项
# 多维数组抓取
fsdbDumpMDA
# 波形压缩(减少文件大小)
fsdbDumpSAC ;# 层次压缩
fsdbDumpSingle ;# 单节点压缩
# 动态控制抓取
fsdbDumpoff ;# 暂停波形记录
fsdbDumpon ;# 恢复波形记录
# 按时间分段抓取
run 1us
fsdbDumpflush ;# 立即写入磁盘
3. 信号过滤(减少文件大小)
# 只抓取特定信号
fsdbDumpvars 0 "tb_top.clk"
fsdbDumpvars 0 "tb_top.reset"
fsdbDumpvars 0 "tb_top.data*"
# 排除特定信号
fsdbDumpignore "tb_top.debug_*"
完整示例
文件结构
project/
├── rtl/
├── tb/
├── scripts/
│ └── dump_fsdb.tcl # TCL脚本
└── run_vcs.sh # 运行脚本
run_vcs.sh 内容
#!/bin/bash
# 设置环境变量
export VERDI_HOME=/opt/synopsys/verdi
export VCS_HOME=/opt/synopsys/vcs
# 编译命令
$VCS_HOME/bin/vcs -full64 -debug_acc+all -sverilog \
-LDFLAGS "-Wl,--no-as-needed" \
-P $VERDI_HOME/share/PLI/VCS/LINUX64/novas.tab \
$VERDI_HOME/share/PLI/VCS/LINUX64/pli.a \
-f filelist.f -top tb_top -l compile.log
# 执行仿真
./simv -ucli -do scripts/dump_fsdb.tcl -l sim.log
dump_fsdb.tcl 内容
# 延迟100ns后开始抓取(避免复位信号)
run 100ns
# 设置波形文件
fsdbDumpfile "wave.fsdb"
# 抓取整个测试平台(顶层)
fsdbDumpvars 0 tb_top
# 特殊抓取:存储器内容
fsdbDumpMDA tb_top.ram_inst
# 运行到结束
run -all
# 保存并退出
fsdbDumpflush
exit
常见问题解决
1. 无法生成 FSDB 文件
- 检查项:
# 确认 PLI 路径正确 echo ${VERDI_HOME} ls ${VERDI_HOME}/share/PLI/VCS/LINUX64/pli.a # 检查编译日志 grep "PLI" compile.log | grep "Loading" - 解决方案:
- 更新 PLI 路径:
export VERDI_HOME=/path/to/verdi - 检查操作系统架构(LINUX 或 LINUX64)
- 更新 PLI 路径:
2. 信号缺失
- 可能原因:信号被优化
- 解决方案:
# 编译时添加防优化选项 vcs ... -debug_region+cell+lib# TCL 中强制抓取 fsdbDumpforce "tb_top.hidden_signal"
3. 波形文件过大
- 优化方法:
# 限制抓取深度 fsdbDumpvars 3 tb_top # 只抓取3层 # 只抓取特定模块 fsdbDumpvars 0 tb_top.dut.module_a # 启用压缩 fsdbDumpSAC fsdbDumpSingle
4. 部分时间段无波形
# 在关键时间点开启抓取
run 1us
fsdbDumpon
run 100ns
fsdbDumpoff
查看波形
仿真完成后,使用 Verdi 打开 FSDB 文件:
verdi -ssf wave.fsdb &
通过以上步骤,您可以在 VCS 仿真中通过 TCL 脚本精确控制 FSDB 波形的生成过程,实现灵活的调试功能。
浙公网安备 33010602011771号