别再手动点仿真了!用Makefile一键搞定VCS+VERDI联合仿真(附完整脚本)

别再手动点仿真了!用Makefile一键搞定VCS+VERDI联合仿真(附完整脚本)

数字验证工程师的效率革命:基于Makefile的VCS+VERDI全自动仿真方案

在数字芯片验证的日常工作中,工程师们常常需要反复执行相同的仿真流程:编译RTL代码、运行仿真、生成波形、启动调试工具。这种重复劳动不仅消耗宝贵的时间,还容易因手动操作失误导致仿真失败。本文将介绍如何通过精心设计的Makefile脚本,将这一繁琐流程转化为一键式自动化操作,显著提升验证效率。

1. 自动化仿真的必要性

传统仿真流程通常包含以下步骤:

  1. 使用VCS编译RTL和测试平台代码
  2. 运行仿真并生成波形文件
  3. 启动Verdi加载波形进行调试
  4. 清理中间文件准备下次仿真

每次代码修改后,工程师都需要重复执行这些命令,不仅效率低下,还容易因参数输入错误导致仿真失败。更糟糕的是,当团队多人协作时,每个人的仿真习惯和参数设置可能不同,导致仿真结果难以复现。

自动化仿真的核心优势

  • 减少重复劳动,节省30%以上的仿真时间
  • 确保团队使用统一的仿真参数和环境
  • 降低人为操作失误的风险
  • 便于集成到持续集成(CI)流程中

2. Makefile基础架构设计

一个完整的自动化仿真Makefile应包含以下关键target:

.PHONY: all compile sim verdi clean all: clean compile sim verdi compile: vcs -full64 -debug_acc+all -sverilog \ -timescale=1ns/1ps -f filelist.f \ -l compile.log sim: ./simv -l sim.log +fsdb+dumpfile+dump.fsdb verdi: verdi -f filelist.f -ssf dump.fsdb & clean: rm -rf AN.DB csrc simv* *.log *.fsdb

2.1 关键组件解析

编译阶段(compile target)

VCS编译阶段需要特别注意以下参数组合:

参数作用推荐设置
-full64启用64位模式必须
-debug_acc+all开启全调试功能建议
-sverilog支持SystemVerilog按需
-timescale设置时间单位和精度必须
-f指定文件列表必须
仿真阶段(sim target)

仿真阶段的核心是正确生成FSDB波形文件:

./simv -l sim.log +fsdb+dumpfile+dump.fsdb +fsdb+dumpvars+0+top

注意:+fsdb+dumpvars+0+top参数表示转储顶层模块的所有信号,其中0表示递归深度(0表示无限递归)

波形查看(verdi target)

Verdi启动命令的关键参数:

  • -f filelist.f:指定设计文件列表
  • -ssf dump.fsdb:自动加载波形文件
  • &:后台运行,不阻塞终端

3. 高级技巧与避坑指南

3.1 多波形生成策略

在实际项目中,我们可能需要生成多种波形文件。以下是三种主流方法的对比:

  1. 编译选项法

    sim: ./simv +fsdb+all=dump.fsdb

    优点:简单直接
    缺点:波形命名固定为novas.fsdb

  2. TB系统函数法

    initial begin $fsdbDumpfile("custom.fsdb"); $fsdbDumpvars(0, top); end

    优点:可自定义波形名称和范围
    缺点:需要修改测试平台代码

  3. TCL脚本控制法

    # run.tcl fsdbDumpfile dump.fsdb fsdbDumpvars 0 top run

    Makefile调用方式:

    sim: ./simv -ucli -i run.tcl

重要提示:避免同时使用多种波形生成方法,否则可能导致波形文件冲突或仿真性能下降

3.2 参数化Makefile设计

为提高Makefile的复用性,建议使用变量定义关键参数:

# 用户可配置区域 DESIGN_TOP ?= top_tb FSDB_FILE ?= wave.fsdb TIMESCALE ?= 1ns/1ps # 工具命令 VCS = vcs -full64 -debug_acc+all -sverilog VERDI = verdi compile: $(VCS) -timescale=$(TIMESCALE) \ -f filelist.f -l compile.log sim: ./simv -l sim.log \ +fsdb+dumpfile+$(FSDB_FILE) \ +fsdb+dumpvars+0+$(DESIGN_TOP)

使用时可通过命令行覆盖默认值:

make sim DESIGN_TOP=my_tb FSDB_FILE=debug.fsdb

4. 团队协作最佳实践

4.1 标准化文件结构

推荐的项目目录结构:

project/ ├── rtl/ # RTL设计代码 ├── tb/ # 测试平台代码 ├── sim/ # 仿真相关文件 │ ├── filelist.f # 文件列表 │ ├── run.tcl # 仿真控制脚本 │ └── Makefile # 自动化脚本 ├── wave/ # 波形文件 └── doc/ # 文档

4.2 版本控制集成

在Makefile中添加版本信息记录功能:

sim: @echo "Simulation started at $$(date)" > sim_info.log @echo "Git commit: $$(git rev-parse HEAD)" >> sim_info.log ./simv -l sim.log +fsdb+dumpfile+dump.fsdb

4.3 性能优化技巧

  1. 增量编译

    incremental: vcs -incremental -f filelist.f
  2. 并行仿真

    parallel_sim: ./simv +ntb_random_seed=auto +ntb_solver_mode=parallel
  3. 波形采样优化

    // 只采样特定时间段 initial begin #1000; $fsdbDumpvars(0, top); #10000; $fsdbDumpoff; end

5. 常见问题解决方案

5.1 波形无法生成

现象:仿真运行完成但未生成fsdb文件
排查步骤

  1. 检查是否添加了+fsdb+dumpfile参数
  2. 确认测试平台中未使用$fsdbDumpoff
  3. 查看仿真日志是否有相关错误

5.2 Verdi无法启动

典型错误

Verdi: Failed to open file 'dump.fsdb'

解决方案

  1. 确认波形文件路径正确
  2. 检查文件权限
  3. 验证波形文件是否完整

5.3 参数冲突处理

当同时使用-gui-ucli参数时,可能导致仿真卡住。推荐替代方案:

debug: ./simv -gui -i debug.tcl

其中debug.tcl包含必要的仿真控制命令。

6. 扩展应用场景

6.1 回归测试集成

将Makefile与回归测试框架结合:

regression: for test in $$(ls tests/*.sv); do \ make clean; \ make sim TEST=$$test; \ make check RESULT=$$test.result; \ done

6.2 覆盖率收集

添加覆盖率收集功能:

coverage: vcs -cm line+cond+fsm -f filelist.f ./simv -cm line+cond+fsm urg -dir simv.vdb -report coverage

6.3 多仿真器支持

通过条件判断支持不同仿真器:

ifeq ($(SIMULATOR),vcs) COMPILE_CMD = vcs -full64 -debug_acc+all else ifeq ($(SIMULATOR),xcelium) COMPILE_CMD = xrun -64bit -access +rwc endif compile: $(COMPILE_CMD) -f filelist.f

在实际项目中,我们团队通过这套自动化流程将仿真准备时间从平均15分钟缩短到30秒,且彻底消除了因手动操作导致的仿真失败。特别是在大型SoC验证中,这种自动化方法的价值更加凸显。