• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • YouClaw
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

SOC/IP验证工程师

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

在 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)

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 波形的生成过程,实现灵活的调试功能。

posted on 2025-06-20 21:37  SOC验证工程师  阅读(933)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3