第二章:仿真工具链详解——主流仿真器对比与基础命令

各位同学,今天我们来聊聊仿真工具链。说实话,我刚入行那会儿,面对VCS、IUS、Questa这三座大山,也是一脸懵。每个工具都说自己快、自己准,但到底选哪个?怎么用?今天我就把这几年的实战经验掰开揉碎讲给你听。

2.1 三大主流仿真器:谁是你的菜?

先说说这三家的背景。VCS是Synopsys家的,IUS(现在叫Xcelium)是Cadence的,Questa是Mentor(现属Siemens)的。嗯,三足鼎立,各有千秋。

特性 VCS IUS/Xcelium Questa
编译速度 快(优化好) 中等 中等偏慢
仿真性能 优秀(尤其大设计) 良好 良好
调试能力 强(DVE/Verdi) 强(SimVision) 强(Questa GUI)
覆盖率支持 原生支持 原生支持 原生支持
SystemVerilog 全面支持 全面支持 全面支持
UVM支持 原生UVM库 原生UVM库 原生UVM库
价格 贵 贵 相对便宜

我个人习惯是:大项目、高性能要求选VCS;中小项目、预算有限选Questa;如果公司已经买了Cadence全家桶,那IUS自然是最佳选择。

核心观点:没有最好的工具,只有最适合你项目的工具。选型时考虑三个因素:团队熟悉度、公司已有工具链、项目规模。

2.2 编译与运行:基础命令实战

好了,理论说完了,咱们直接上命令。我保证,这些命令你以后天天用。

2.2.1 VCS 编译与运行

VCS的编译分两步:分析(analysis)和编译(elaboration)。

// 单步编译+运行
vcs -full64 -sverilog -debug_all -l compile.log \
    -f filelist.f -top top_tb \
    -timescale=1ns/1ps

// 运行仿真
./simv -l run.log +UVM_TESTNAME=my_test

// 带波形
./simv -l run.log -gui &
// 或者生成vpd波形
./simv -l run.log -vpd_trace test.vpd

我在项目中遇到过一个问题:不加-debug_all的话,后面想用DVE看波形都看不了。嗯,这个坑我踩过,所以现在写脚本时都会加上。

小技巧:VCS的-full64是64位模式,现在基本都用这个。32位模式在大型设计中容易爆内存。

2.2.2 IUS/Xcelium 编译与运行

IUS的命令风格和VCS不太一样,它用irun或xrun(新版本)。

// 编译+运行一步到位
irun -sv -f filelist.f -top top_tb \
     -timescale 1ns/1ps \
     -access +rwc -l irun.log \
     +UVM_TESTNAME=my_test

// 或者分步走
// 第一步:分析
ncvlog -sv -f filelist.f -l ncvlog.log
// 第二步:编译
ncelab -access +rwc top_tb -l ncelab.log
// 第三步:运行
ncsim -l ncsim.log +UVM_TESTNAME=my_test

说实话,我刚开始用IUS时觉得它分步命令太繁琐了。后来发现,分步走有个好处——哪一步出错了,定位特别快。你想想看,编译报错和运行报错,处理方式完全不一样。

注意:-access +rwc这个选项很重要。不加的话,你连波形都dump不出来。我曾经因为这个浪费了半天时间排查。

2.2.3 Questa 编译与运行

Questa的命令和Modelsim一脉相承,用过Modelsim的同学应该很熟悉。

// 编译
vlog -sv -f filelist.f -l vlog.log

// 编译(优化模式)
vopt top_tb -o top_opt -debugdb

// 运行
vsim -c top_opt -l vsim.log \
     -do "run -all; quit" \
     +UVM_TESTNAME=my_test

// 带GUI模式
vsim -gui top_opt -debugdb &

我个人觉得Questa的vopt优化做得不错。大设计用优化模式,仿真速度能提升30%以上。不过要注意,优化模式会改变信号层次结构,调试时最好用非优化模式。

2.3 仿真器选择决策流程

为了让你更直观地理解怎么选,我画了一张流程图。

仿真器选择决策流程 开始选型 项目规模? 大 推荐 VCS 高性能、大容量 小 推荐 Questa 性价比高、易上手 中等 公司工具链? Synopsys 推荐 VCS 与DC/ICC集成好 Cadence 推荐 IUS/Xcelium 与Inc/Genus集成好 其他/不确定 按团队熟悉度选 VCS 或 Questa

2.4 实用技巧与避坑指南

最后,分享几个我这些年总结的实用技巧。

2.4.1 编译选项的坑

我曾经在VCS中忘记加-sverilog选项,结果SystemVerilog的语法全报错。排查了半天才发现是这个问题。所以,写Makefile时一定要把常用选项固化下来。

推荐做法:创建一个模板Makefile,把三个仿真器的常用命令都写好。每次新项目直接复制修改,省时省力。

2.4.2 波形dump的注意事项

不同仿真器dump波形的命令不一样:

  • VCS:使用$vcdpluson或$vpdpluson
  • IUS:使用$shm_open和$shm_probe
  • Questa:使用$wlfdumpvars

嗯,这里要注意:波形文件会占用大量磁盘空间。我建议只dump关键模块的信号,别全dump。否则跑一次仿真,磁盘就满了。

2.4.3 覆盖率收集

覆盖率是验证的核心指标。三个仿真器都支持覆盖率收集:

// VCS
vcs -full64 -sverilog -cm line+cond+tgl+fsm ...
./simv -cm line+cond+tgl+fsm

// IUS
irun -coverage all ...

// Questa
vsim -c -coverage ...

我个人习惯是:先跑功能仿真,确认功能正确后再开覆盖率。否则覆盖率数据里全是无效信息,分析起来很痛苦。

小技巧:覆盖率数据合并时,不同仿真器的格式不兼容。所以团队最好统一用一个仿真器,否则合并覆盖率时你会想哭的。

好了,关于仿真工具链的内容就讲到这里。记住,工具只是手段,验证思路才是核心。下一章我们会深入讨论覆盖率驱动的验证方法,到时候见。