1. 仿真调试基础

各位好,我是老李。做芯片验证十几年了,今天咱们聊聊仿真调试。说实话,这可能是整个验证流程里最「接地气」的环节——你写的代码对不对,设计跑没跑通,全靠它来验证。

我记得刚入行那会儿,带我的师傅就说:「仿真调试是验证的基石,你连波形都不会看,还谈什么覆盖率?」嗯,这话糙理不糙。咱们今天就把它掰开揉碎了讲清楚。

1.1 仿真调试的概念

仿真调试,说白了就是让设计在软件环境里跑起来,然后盯着它的行为看有没有问题。你想想看,芯片流片一次几百万,谁敢直接投片?肯定得先在电脑上模拟一遍。

我个人习惯把仿真调试分成两个层面:

  • 仿真:给设计施加激励,让它运行,产生波形和日志
  • 调试:分析仿真结果,定位问题根源,修复bug

这两个动作是交替进行的。我在项目中遇到过很多次,仿真跑完了,一看波形全错,然后开始追根溯源,改完代码再跑一遍。循环往复,直到所有功能都正确。

核心要点:仿真调试不是一次性的工作,它是验证流程中的「日常操作」。你每天上班第一件事,可能就是看看昨晚的回归测试有没有挂。

1.2 仿真调试在验证流程中的位置

咱们先看看整个验证流程长什么样。我画了张图,帮你理清思路:

验证流程中的仿真调试位置 验证规划 测试点分解 环境搭建 TB/BFM/Monitor ★ 仿真调试 ★ 跑仿真 → 看波形 → 修bug (本章核心) 覆盖收敛 Code/Coverage 迭代循环 仿真调试是验证流程的「发动机」,驱动着整个验证向前推进 项目启动 项目交付 仿真调试贯穿整个验证周期

从这张图你能看出来,仿真调试不是孤立存在的。它前面连着验证环境搭建,后面接着覆盖收敛。我经常跟团队说:「仿真调试做得好,覆盖收敛就轻松一半。」

具体来说,仿真调试在流程中承担这些角色:

  • 功能验证:检查设计是否实现了预期的功能
  • 问题定位:当测试失败时,找到根本原因
  • 回归测试:确保修改没有引入新问题
  • 覆盖率驱动:为后续的覆盖收敛提供数据基础

我的经验:别小看回归测试。我曾经在一个项目里,改了一行代码,结果把三个模块都带崩了。要不是回归测试跑得快,那后果...嗯,你懂的。

1.3 常见仿真器介绍

市面上主流的仿真器就那么几个,我挑三个最常用的给你讲讲。每个我都用过,踩过坑,也总结了一些心得。

1.3.1 Synopsys VCS

VCS 是 Synopsys 家的旗舰产品,也是目前行业里用得最多的仿真器。我个人习惯用 VCS 做大型 SoC 的仿真,因为它编译快、支持的语言全。

特性 说明
编译速度 快,支持增量编译
支持语言 Verilog、VHDL、SystemVerilog、UVM
调试能力 强,配合 DVE/Verdi 使用
性能优化 支持多核并行仿真

VCS 的基本用法很简单:

# 编译
vcs -full64 -sverilog -debug_access+all \
    -f filelist.f -top top_tb

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

# 查看波形
verdi -ssf waves.fsdb &

这里要注意 -debug_access+all 这个选项。我刚开始用 VCS 时,经常忘记加这个,结果波形里啥也看不到,白跑一趟。后来我把它写进了 Makefile 里,再也没忘过。

避坑指南:我曾经在一个项目里,为了省编译时间,用了 -debug_access+nomem,结果内存里的数据全看不到,调试了三天才发现是这个问题。所以,调试阶段建议用 +all,回归测试再优化。

1.3.2 Cadence Xcelium (原IUS)

Xcelium 是 Cadence 的产品,以前叫 IUS,后来改名叫 Xcelium。说实话,我更喜欢叫它 IUS,叫了十几年改不过来。

Xcelium 的特点是内存管理做得好,跑大规模仿真时比 VCS 稳定一些。我在一个 200 万门的 SoC 项目里对比过,Xcelium 的内存占用比 VCS 低了大概 15%。

特性 说明
内存管理 优秀,适合大规模设计
支持语言 Verilog、VHDL、SystemVerilog、UVM
调试能力 配合 SimVision 使用
特色功能 支持动态仿真和形式化验证混合

Xcelium 的基本用法:

# 编译
xrun -64bit -sv -access +rwc \
     -f filelist.f -top top_tb

# 运行
xrun -R +UVM_TESTNAME=my_test \
     -input "run 1ms; exit" \
     -l run.log

# 查看波形
simvision waves.shm &

你注意到没有?Xcelium 用 xrun 一个命令就搞定了编译和运行,不像 VCS 要分两步。我个人觉得这样更省事,尤其是做快速迭代的时候。

小技巧:Xcelium 的 -access +rwc 相当于 VCS 的 -debug_access+all。我习惯写成 +rwc,因为少敲几个字母,哈哈。

1.3.3 Siemens Questa (原ModelSim)

Questa 是 Siemens EDA(原 Mentor Graphics)的产品。它的前身是 ModelSim,很多学校都用 ModelSim 教学。但工业界用的是 Questa,功能更强大。

我记得刚毕业那会儿,在学校用的就是 ModelSim。后来进了公司,发现大家都在用 Questa,心里还嘀咕:「这不就是 ModelSim 换个皮吗?」后来才发现,Questa 比 ModelSim 强太多了,尤其是在 UVM 支持和性能优化方面。

特性 说明
易用性 好,GUI 界面友好
支持语言 Verilog、VHDL、SystemVerilog、UVM
调试能力 配合 Questa Visualizer 使用
特色功能 代码覆盖率、断言覆盖率原生支持

Questa 的基本用法:

# 编译
vlog -64bit -sv -work work \
     -f filelist.f

# 优化
vopt top_tb -o top_opt

# 运行
vsim -64bit top_opt \
     +UVM_TESTNAME=my_test \
     -logfile run.log \
     -do "run -all; quit"

# 查看波形
vsim -view waves.wlf &

Questa 有个特点,它把编译和优化分成了两步。我刚开始用的时候觉得多此一举,后来发现 vopt 这一步能大幅提升仿真速度,尤其是对于大型设计。

三种仿真器对比总结:

对比项 VCS Xcelium Questa
编译速度 ★★★★★ ★★★★☆ ★★★★☆
仿真性能 ★★★★☆ ★★★★★ ★★★★☆
调试体验 ★★★★★ ★★★★☆ ★★★★★
内存管理 ★★★★☆ ★★★★★ ★★★★☆
易用性 ★★★★☆ ★★★★☆ ★★★★★

选哪个仿真器?说实话,这得看你们公司的 EDA 环境。大公司一般三种都有,小公司可能只有一种。我的建议是:精通一种,了解其他两种。因为不同项目、不同客户,要求可能不一样。

好了,仿真调试的基础就讲到这里。记住一句话:仿真调试是验证的基石,打好基础才能走得更远。

最后分享一个心得:不管你用哪个仿真器,学会看波形才是真本事。工具只是手段,分析问题的能力才是核心。我见过太多人,仿真器用得贼溜,但波形摆在那儿就是看不出问题。所以,多练、多思考,比什么都强。

可可精品资料库