告别手动敲命令!用这个Makefile模板,一键搞定Cadence Xrun的UVM仿真(附Verdi调试)

告别手动敲命令!用这个Makefile模板,一键搞定Cadence Xrun的UVM仿真(附Verdi调试)

在IC验证领域,效率就是生命线。每次启动仿真都要手动输入一长串Xrun命令的日子该结束了——这不仅浪费时间,还容易因参数遗漏导致仿真失败。本文将分享一个经过实战检验的Makefile模板,它能帮你实现:

  • 一键编译 :自动处理文件依赖和编译顺序
  • 智能运行 :内置随机种子生成和测试用例管理
  • 无缝调试 :与Verdi深度集成,波形查看零障碍
  • 覆盖率收集 :自动归并不同种子下的覆盖率数据

1. 环境配置与模板解析

1.1 目录结构设计

规范的目录结构是自动化仿真的基石。建议采用以下布局(通过Makefile变量定义):

SIM_DIR  = .          # 仿真执行目录
LOG_DIR  = ../log     # 日志存放路径
FSDB_DIR = ../wave/fsdb # 波形文件存储
TC_DIR   = ../tc/cfg  # 测试用例配置文件
COV_DIR  = ../cov/imc/cov_work # 覆盖率数据库

关键目录作用说明:

目录类型 存储内容 是否版本控制
LOG_DIR 每次仿真的运行日志
FSDB_DIR 波形文件(FSDB格式) 选择性保留
TC_DIR 测试用例的 .cfg 配置文件
COV_DIR 覆盖率数据(IMC格式) 阶段性归档

1.2 UVM环境配置

确保正确指向UVM库路径(示例为UVM 1.1d):

uvm_version     = uvm_1.1d
export UVM_HOME   = /path/to/uvm-1.1d
export UVM_PKG    = $(UVM_HOME)/src/uvm_pkg.sv
export UVM_EXT_HOME = /edaTools/Cadence/XCELIUM20.09.007/tools/methodology/UVM/CDNS-1.1d

提示:使用 export 确保这些变量在子进程中可见,这对Verdi调试尤为重要

2. 核心功能实现

2.1 编译阶段自动化

通过 com 目标实现智能编译:

com:
    @echo "******XRUN Compile Start******"
    xrun -compile -elaborate \
    -uvmhome $(UVM_HOME) -uvmexthome $(UVM_EXT_HOME) \
    -64bit -debug -plidebug \
    -access +rwc -genhier \
    -f ./incfilelist.f \
    -top $(TOP_BENTCH) \
    -l $(SIM_DIR)/xrun_compile.log
    @echo "*******XRUN Compile End*******"

关键编译选项解析:

  • -access +rwc :开启信号读写权限(Verdi调试必需)
  • -genhier :生成层次化结构信息
  • -debug 系列:启用不同级别调试功能

2.2 运行阶段智能控制

run 目标支持动态参数配置:

tc   = default_test  # 默认测试用例
seed = $(shell date +%s%N | cut -b 12-) # 自动生成随机种子

run:
    xrun -R \
    +UVM_TC_CFG_NAME=$(tc) \
    +UVM_VERBOSITY=$(vbt) \
    +ntb_random_seed=$(seed) \
    -covoverwrite -covworkdir $(COV_DIR) \
    -l $(LOG_DIR)/$(tc)_$(seed).log

参数覆盖示例(命令行调用时):

make run tc=algo_err_inj_test seed=12345 vbt=UVM_HIGH

3. 高级调试技巧

3.1 Verdi波形调试集成

通过PLI接口实现FSDB波形自动记录:

WAVE_SIM_OPTS += +loadpli1=${VERDI_HOME}/share/PLI/IUS/LINUX64/boot/debpli.so:debpli_boot
WAVE_SIM_OPTS += +dump_fsdb=on

verdi:
    verdi -sv -ntb_opts uvm-1.1 \
    -f ./incfilelist.f \
    -ssf $(FSDB_DIR)/*.fsdb \
    -top $(TOP_BENTCH) &

典型调试流程:

  1. 执行仿真(生成波形):

    make run fsdb=on
    
  2. 启动Verdi查看波形:

    make verdi
    
  3. 在Verdi中快速定位:

    • 使用 uvm_info 过滤器查看日志
    • 通过 uvm_top 层次浏览测试环境

3.2 覆盖率分析与合并

IMC覆盖率操作命令封装:

imc_merge:
    cd $(COV_DIR) && \
    imc -execcmd "merge * -overwrite -out merged"

覆盖率收集最佳实践:

  • 分阶段收集:

    # 基础覆盖率
    make run tc=sanity_test cov=basic
    # 错误注入覆盖率  
    make run tc=err_inj_test cov=all
    
  • 最终合并:

    make imc_merge
    

4. 工程化扩展建议

4.1 多测试用例批处理

添加 regress 目标实现回归测试自动化:

TEST_LIST := sanity_test algo_verify_test err_inj_test

regress:
    $(foreach test, $(TEST_LIST), \
        make run tc=$(test); \
    )
    make imc_merge

4.2 自动化清理策略

智能清理不同级别的临时文件:

clean:
    -rm -rf xcelium.d* *.log *.dsn *.trn

clean_all: clean
    -rm -rf $(FSDB_DIR)/* $(COV_DIR)/*

注意: clean_all 会删除所有波形和覆盖率数据,慎用

5. 常见问题排查

当遇到仿真失败时,建议按以下顺序检查:

  1. 编译错误

    • 查看 xrun_compile.log 中的语法错误
    • 确认 incfilelist.f 包含所有必需文件
  2. 运行时错误

    grep -i "error" log/default_test_*.log
    
  3. 波形问题

    • 确保编译时带有 -access +rwc 选项
    • 检查 debpli.so 路径是否正确
  4. 覆盖率异常

    • 确认 cov_config.ccf 包含正确的覆盖组配置
    • 检查IMC版本与Xrun的兼容性

这个Makefile模板已经在多个7nm项目验证中稳定运行,平均节省了40%的仿真启动时间。最让我惊喜的是它的可扩展性——新增测试用例时只需在 tc/cfg 目录添加对应配置文件,无需修改Makefile主体。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值