第二章:仿真工具链详解——主流仿真器对比与基础命令
各位同学,今天我们来聊聊仿真工具链。说实话,我刚入行那会儿,面对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 仿真器选择决策流程
为了让你更直观地理解怎么选,我画了一张流程图。
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 ...
我个人习惯是:先跑功能仿真,确认功能正确后再开覆盖率。否则覆盖率数据里全是无效信息,分析起来很痛苦。
小技巧:覆盖率数据合并时,不同仿真器的格式不兼容。所以团队最好统一用一个仿真器,否则合并覆盖率时你会想哭的。
好了,关于仿真工具链的内容就讲到这里。记住,工具只是手段,验证思路才是核心。下一章我们会深入讨论覆盖率驱动的验证方法,到时候见。