第一次用 Virtuoso 里的 ADE Explorer 时,我心里其实挺不以为然的。那时候已经在 ADE L 上摸爬滚打好几年,几乎所有跑仿真的肌肉记忆都建立在 ADE L 那套“单测试台、单状态”的操作逻辑上。真正让我下决心切换的,是一次极其痛苦的 multi-corner 仿真:在 ADE L 里为了跑 TT、FF、SS 三个工艺角,我不得不手动改三遍 model library 配置,改完还要小心翼翼地把输出波形一个个重新加上,生怕哪个表达式丢了对不上。后来换到 ADE Explorer,同一套测试台、同一组输出,点几下就把三个 corner 的结果并排摆出来,那一刻我才意识到,之前不是我不愿意学新工具,是压根没找对工具。
这篇内容不是官方教程的复述,而是我从实际项目里趟出来的经验总结。我会把 ADE Explorer 从基础环境配置、仿真分析设置、多测试台管理,一直讲到参数扫描、Corner 和 Monte Carlo 这类高级玩法,最后再把仿真发散、器件未定义这类高频报错单独拎出来聊一遍。无论你是刚开始接触 Virtuoso 的学生,还是被 ADE L 折磨多年的老工程师,只要还在用 Spectre 跑仿真,这篇文章应该能帮你省下不少时间。
1. 不得不从 ADE L 切到 ADE Explorer 的几个真实理由
很多老工程师对 ADE L 有感情,这我完全理解。但如果你手里项目越来越大、测试台越来越多,ADE L 的“单线程”模式会让你越来越难受。我先说几个最直接的痛点,你就明白我为什么舍得花一周时间重新适应 Explorer。
1.1 ADE L 的痛点说到底只有一个:状态管理太脆弱
在 ADE L 里,一个 Design 对应一个测试台原理图,所有变量、分析设置、输出列表都绑在同一个 session 里。你想同时看同一电路在开环和闭环两种测试台下的性能?对不起,请先仿真完再打开另一个 testbench,重新配一遍变量和输出。更难受的是,一旦你在两个 cellview 之间切换,ADE L 偶尔会把之前的输出列表弄丢,或者让你重新选择 model library。这种重复劳动在 Tapeout 前的冲刺阶段真的会让人崩溃。
我当年在 ADE L 里跑 Monte Carlo 还有个阴影:一个 200 样本的 mismatch 仿真跑了快一晚上,第二天来发现某次中途保存的波形因为磁盘路径写错没存上,整个结果作废。这在 ADE L 里太常见了,因为你所有状态都绑在 session 上,session 一丢,配置就全部蒸发。
1.2 Explorer 的定位:介于 ADE L 和 Assembler 之间的“探索型”工具
Cadence 的 Virtuoso ADE Suite 现在分成几个层次:ADE L 是最传统的单测试台工具;ADE Explorer 定位在“探索”阶段,强调多测试台、多仿真状态的并行管理;ADE Assembler 则更偏重“验证”阶段,用于跑大批量的 corner 组合和统计仿真。
Explorer 最核心的变化是:它不再把“测试台”和“仿真状态”绑定成一对一的关系。你可以在同一个 Explorer session 里同时挂载多个测试台,每个测试台都有自己的变量、分析和输出列表,然后一键全部跑完。结果以树状结构组织在 Results 面板里,想对比哪几个状态的波形直接拖过去就行。这在实际项目中太重要了——我经常同时开着“正常上电”和“电源斜坡”两个测试台,一边看 DC,一边看 Tran,完全不用来回切换。
1.3 和 ADE Assembler 的分工:探索归探索,验证归验证
还有一个容易忽略的点:Explorer 并不是用来替代 Assembler 的,两者解决的是不同阶段的问题。Explorer 适合你还在“摸电路”——不知道哪些参数影响大、想快速看几个 corner 下的反应;Assembler 适合你已经明确了所有 corner 组合,准备跑正式验证。我现在的习惯是:Explorer 里做 90% 的前期仿真,收敛到确定的方案后再把测试台和状态导出到 Assembler 做完整跑批。这样流程干净,也不会给自己增加不必要的复杂配置。
2. 从零开始跑通一次仿真:环境检查和基础设置
这一节我按实际操作的优先级来讲,不按菜单顺序讲。很多人第一次用 Explorer 会蒙,是因为菜单项比 ADE L 多不少,其实你只需要抓住几个关键入口。
2.1 仿真前的三个检查:model library、design variable、analysis
不管工具怎么变,Spectre 仿真的底层依赖永远是三件事:模型库加载对不对、变量有没有定义、分析类型有没有配全。我自己不管多急,跑之前都会按下面这张清单过一遍:
| 检查项 | 位置 | 典型错误 |
|---|---|---|
| Model Library | Setup → Model Libraries | 路径写错或 section 选错,导致器件未定义 |
| Design Variable | Variables → Edit Variables | 变量名和原理图中参数名不一致 |
| Analysis 类型 | Analyses → Choose Analysis | 忘记选 tran,直接跑出来的只有 DC 工作点 |
| Output 表达式 | Outputs → Select On Schematic | 没设置输出,Results 面板里完全没数据 |
其中 Model Library 是最容易踩坑的。Cadence 里加载 model 不仅要把.lib文件路径加进来,还要确认每个 model 对应的 section 名正确。很多工艺厂会给一个包含 TT、FF、SS、SF、FS 多个 section 的 model 文件,如果你只在 Library 里挂了路径,却忘了在 Setup → Model Libraries 的 Section 栏里写tt,仿真器很可能直接报 “device undefined” 或者更隐晦的 “spectre: fatal error”。我第一次用新工艺时就卡在这上面半小时,最后发现自己把 section 大小写写错了。
2.2 三种常用分析的参数设置心得
Tran 分析:从收敛性角度配置
Transient 分析里最重要的几个字段是 Stop Time、Maxstep 和 Integration Method。Stop Time 好理解,Maxstep 我建议不要完全依赖默认的automatic。如果你电路里有一个极小的寄生电容和一个极大的负载电容,时间常数跨越好几个数量级,Spectre 的步进控制器有时会因为事件侦测的复杂度增加而把步长压得很小,仿真速度直线下降,甚至出现仿真发散。
我个人的习惯是:默认先跑一遍,看 Spectre 的日志里报告的 time step 最小值。如果看到类似timestep=1e-18这种数字,基本说明模型里某个结电容过小或者存在非物理的突变。这时候要么调整模型参数,要么在 Tran 设置里手动给一个合理的 Maxstep,比如比 Stop Time 小三个数量级左右的值,先把仿真跑起来,再逐步收紧。
Integration Method 的选项一般是method=traponly、method=gear2only和method=eu。很多教程会告诉你 gear2 更稳定,traponly 更精确。实际做高频模拟电路设计时,我更喜欢用 traponly 加 conservative 的 errpreset,因为 trap 对振荡电路的瞬态响应保留更好,gear2 虽然稳定性强,但会在某些开关电容电路里引入过于明显的数值阻尼。
DC 分析:注意扫描变量的类型
DC 分析里经常出问题的是扫描变量类型。有些人直接在原理图里用VDD作为变量名,然后在 DC 扫描里填VDD 0 1.8 0.1,结果发现仿真结果完全没变化。问题在于 DC 扫描的变量必须和 Design Variable 列表里的变量严格一致,而且如果该变量在原理图里是通过vdc源的dc参数来引用的,你要确认变量名没有写到别的地方去,比如写成了VVDD。
AC 分析:别忘了交流激励源
检查 AC 仿真设置时有个小白很容易忽略的点:AC 分析必须有一个 AC 激励源。你说自己在做 LDO 的电源抑制比,结果输入端只画了一个vdc源,没有设置ac magnitude=1,那么 AC 响应跑出来是一条平坦的 0dB 直线,因为根本没人激励系统。解决办法是在 AC 源的属性里把AC magnitude设为 1,或者用port器件替代。这个“电路原理全对,仿真结果全是坑”的案例,在论坛上真的被问过无数遍。
2.3 输出设定的最佳实践:别把整个 testbench 的数据都存下来
ADE Explorer 的 Outputs 面板支持在原理图上直接选节点。我推荐都用Select On Schematic方式添加输出,因为它会同时把节点名、器件端子和表达式整理好。但这里有个容易被忽视的坑:如果你在 Outputs 面板里添加的是“整条信号线”而非“具体某个分析下的输出”,Spectre 可能会默认把该节点的 DC 和 Tran 数据都存下来,导致.psf文件巨大,加载波形时卡到怀疑人生。
我的做法是:在 Outputs → Setup 里用表达式明确限制分析类型,比如只对 tran 输出VT("/OUT") - VT("/OUTN"),或者只保存特定层的电流。你不需要把每个节点的数据都备份下来,够用就好。
3. 多测试台与并行任务:真正把 Explorer 的时间省下来
这一节可能是 Explorer 相对 ADE L 最大的优势,也是我最想推荐给你花时间研究的功能。
3.1 同一个 Explorer 会话挂多个测试台
在 ADE Explorer 里,你可以通过Launch → ADE Explorer启动一个仿真会话,然后在这个会话里添加多个测试台,每个测试台都是独立的 cellview。我自己的典型场景是:差分放大器项目里,测试台TB_OP_AC专门跑 AC 和噪声,TB_OP_TD跑瞬态和压摆率,TB_OP_MC专门跑 Monte Carlo。这三个测试台在 ADE L 里需要分别开三个 session 手动维护,在 Explorer 里就是同一个窗口的三个 Tab。
这种组织的另一个好处是:不同测试台之间可以共享输出表达式。比如我在 AC 测试台里写好了gain=value(VF("/OUT") 1),切到瞬态测试台时可以直接复用这个表达式模板,只要把信号名改成对应的节点就行。省下的重复劳动虽然看不见,但积累下来非常可观。
3.2 Corner 和参数扫描的“并行”逻辑
有人可能会说,多测试台这事在 ADE L 里用手动多点仿真也能凑合。但 Explorer 真正拉开差距的地方在于,它允许你在一个测试台内部定义多组分析条件和多组变量值,然后把它们组合成多个“状态”一次性跑完。比如我在同一个测试台里定义了VDD=1.8、VDD=1.62和VDD=1.98三组变量,再给 tran 和 ac 各建一个分析,Explorer 会自动生成 6 个仿真任务,而且跑完以后所有结果都能在 Results 面板里按条件分类,不需要像 ADE L 那样手动改参数一遍一遍重新提交。
3.3 状态保存和结果对比
在这个环节,我建议每个测试台都保留一份“initial state”的 snapshot。Explorer 支持.state文件的保存和加载,相当于把你当前所有变量、分析、输出配置打包存档。实际操作中我发现这对多人合作特别有用:A 工程师把他的状态文件发给 B,B 加载后理论上看到的变量输出设置完全一致,不会出现“我这能跑你那报错”的玄学问题。
结果对比方面,Explore 的 Results 面板允许把不同状态拖到同一个波形窗口里叠在一起看。我自己最常做的是把 Corner 仿真后的所有瞬态波形同时拖到 ViVA 窗口,一眼看出 process 变化对压摆率的影响程度。这种对比在探索电路特性时效率特别高。
4. 参数扫描、Corner 与 Monte Carlo:把“高级仿真”落到实操
很多资料会把参数扫描、Corner 和 Monte Carlo 分开讲,但在 Explorer 里它们的底层逻辑是统一的:都是对变量集合做多组取值的仿真,只是组合方式和统计方法不同。理解了这一点,你就能在这个工具里自由发挥。
4.1 参数扫描:从“手动改参数”到“一张表跑完”
参数扫描最简单,也最实用。在 ADE Explorer 的 Variables 窗口里,你可以给某个设计变量指定一个范围,比如:
CLOAD 1p 5p 0.5p这样 Spectre 会在1p、1.5p、2p……直到5p之间对 CLOAD 做 9 次仿真。原理上相当于你手动改了 9 次变量值再提交了 9 次仿真,但 Explorer 把这一堆任务封装成了一个“扫描组”。跑完以后 Results 里会出现 9 个结果树,你可以直接选中全部,在波形窗口里用不同颜色区分显示负载电容对带宽的影响趋势。
这里有个实操细节:扫描参数如果是电容、电阻这类连续值,建议用相对粗的 step 先跑一遍快速看趋势,确认没有明显的非线性跳变后,再在重点区域加密步长重跑。不要一上来就扫几百个点,时间成本太高了。
4.2 Corner 仿真:工艺角配置的正确玩法
Corner 仿真看起来复杂,其实本质就是“把 model library 的 section 和温度、电压组合起来跑多组仿真”。在 Explorer 里,我先在 Setup → Model Libraries 里把工艺厂提供的tt、ff、ss三个 section 都加载好,然后在 Analyses 窗口里分别添加 tran 和 ac 两组分析,并且给每一组指定不同的温度和电源电压条件。
一张常用的 3 个工艺角 × 3 个温度 × 3 个电压的完整矩阵,在 Explorer 里跑完以后,Results 面板会自动形成一个带层级的状态树。比如你可以先展开corner=ff,再展开temp=125,再展开vdd=1.98,找到对应的输出表达式。状态树试了几次你就会发现,它比 ADE L 里手动给模型文件改名再重新加载的做法可靠太多了,起码不会误改到别的项目。
4.3 Monte Carlo:样本数、随机种子和 mismatch 类型的选择
Monte Carlo 是验证阶段的重头戏。在 Explorer 里对应的是 Analyses 里的Monte Carlo选项,或者你也可以在 ADE Assembler 里专门配置。我在这里只讲最容易影响结果的三个参数:
- Sample Count 到底该取多少?我的经验是,工艺角的 process-only 仿真,100 到 200 组样本基本能看出 3 个西格玛内的分布趋势;mismatch 相关的 Monte Carlo,建议至少 200 组,如果目标良率要求在三个西格玛以上,那就老老实实跑 1000 组。样本数太少,直方图的尾巴会非常随机,你根本分不清是电路本身的问题还是统计噪声。
- Random Seed 一定要设为固定值。如果不固定 seed,每次跑出来的分布都不一样,这对后续对比和 debug 是灾难。我通常把 seed 固定成项目的某个数字,比如 20240728,这样同一套电路在不同时间跑出来的分布结果完全可复现。
- Process 和 Mismatch 要分开跑。Process-only 表示所有管子一起变化,体现的是片间差异;Mismatch 则是同一片芯片内相邻管子的失配,对差分对、电流镜这类结构影响特别大。Explorer 里可以同时勾选 process 和 mismatch,但我建议前期探索时先分开跑,否则你无法判断是哪个因素把 σ 拖大的。
Monte Carlo 跑完后,除了看波形,一定要用直方图功能。Explorer 的 Results 面板提供了一个Histogram按钮,选中某个输出表达式(比如带宽或者相位裕度),它会自动把所有样本的计算结果统计出来,显示平均值、标准差、最小值、最大值,甚至可以直接按你的 spec 下限自动计算良率。我每次跑完 Monte Carlo 的第一件事就是打开这个直方图,看 σ 是否满足 4 个 9 良率要求,心里先有个数,再回去有针对性地优化电路。
5. 波形检查与分析表达式:让仿真结果及时说话
仿真跑完只是第一步,真正花时间的是波形检查。如果你只停留在“看一眼输出节点有没有信号”,那你对自己电路的反馈速度会慢得可怕。Explorer 和 ViVA 波形窗口的配合其实非常强大,我挑几个实际项目里用得最多的点。
5.1 波形窗口的高效操作:放大、光标、刻度
ViVA 窗口在 Explorer 里的呼出方式是直接双击 Results 面板里的信号名。大多数人会用放大缩小,但很多时候效率不够。我在看瞬态波形时,一定会用a键自动缩放到当前光标位置附近,按x键做横向放大,按y键做纵向缩放。这几个快捷键在比较两个波形的局部特征时能省下大量鼠标拖拽。
光标测量也是老生常谈但很多人不会细用的功能。在 ViVA 里点工具栏的Cursor,可以同时放两个光标,自动显示 Δx、Δy,以及两点之间的斜率。我测压摆率时,直接拿两个光标卡在 10% 和 90% 的摆率点上,窗口下方直接读出时间和电压差,比用一个一个读再手动算快得多。
5.2 用 Calculator 表达式做自动化指标提取
指标提取是所有仿真工具里最能提升效率、也最容易被忽略的一环。在 ADE Explorer 的 Outputs 面板里,你可以用 Calculator 直接定义一系列表达式作为输出。很多电路性能指标我根本不用看完整波形,只关心数值结果就行:
| 指标 | 典型表达式 | 输出类型 |
|---|---|---|
| 增益 | dB20(value(VF("/OUT") 1)) | 单值 |
| 相位裕度 | phaseMargin(VF("/OUT")) | 单值 |
| 压摆率 | slewRate(VT("/OUT") 10 90) | 单值 |
| 上升时间 | riseTime(VT("/OUT") 10 90) | 单值 |
| 稳定时间 | settleTime(VT("/OUT") 1 5) | 单值 |
把这些表达式加进 Outputs 后,每次仿真完成,Results 面板里的“值”列就会自动显示这些计算结果。我跑完 Corner 后根本不逐个拉波形看,先看表格里这些指标有没有违规范,有异常了再回去翻波形。这种“用表格驱动调试”的习惯,能让你在项目后期不迷失在海量波形里。
5.3 表达式里的变量引用:让指标跟着 Corner 走
另一个很妙的点是,表达式里可以直接引用设计变量。比如我用VDD作为电源电压变量,那么相位裕度的表达式可以直接写成phaseMargin(VF("/OUT")),但如果你想同时观察不同VDD下的裕度,你可以把输出表达式写成phaseMargin(VF("/OUT") )而不用单独绑定具体值。配合 Corner 状态,你会在 Results 表格里看到同一个输出在不同 corner 下的 27 行结果,一目了然。
6. 收敛失败、器件未定义等问题:我的完整排查链路
这一节是重点,因为搜索热度最高的几个问题——仿真发散、瞬态仿真不收敛、器件未定义——几乎每个做过模拟设计的人都会遇到。我专门梳理一套自己常用的排查方法,按从“最基础”到“最复杂”的顺序讲。
6.1 瞬态仿真不收敛,第一步永远不是调算法,而是看日志
Spectre 的 log 文件比很多人的直觉更有用。一旦看到ngspice风格的长篇 error 或者spectre: Fatal error found by spectre during transient analysis,第一反应别是去改什么integration method,先打开仿真日志,翻到最早出现 error 的位置。
一般报错都会给出具体是哪个节点、哪个器件导致的收敛失败。比如日志里常出现类似:
Error found by spectre in `I0.M0', during transient analysis `tran1'.这行信息告诉你 M0 这个管子周围的某些值在时间步进时出现了牛顿迭代不收敛。你该做的不是立刻去动模型参数,而是先在原理图里看这个管子的连接关系,确认它周围的电路结构是否合理。我曾经遇到过一个非常隐蔽的问题:某个电容的一端悬空,虽然没有 DRC 错误,但在瞬态仿真里它会形成浮空节点,导致 Spectre 在该处反复迭代不收敛。
6.2 发散问题的完整排查链路
我总结了一下,Spectre 瞬态仿真的发散基本逃不出以下几个原因,按出现概率从高到低排列:
- 初始条件不合理:电路里某个储能元件(电容、电感)初始电荷/电流状态和稳态相差过大。处理方式是给关键节点加
ic=初始条件,或者在 DC 分析中先打开Save DC Operating Point,然后在 Tran 里勾选Skip DC operating point,让 Spectre 用 DC 工作点来做初值。 - 时间步长跨度过大:如果电路中同时存在非常小和非常大的时间常数,Spectre 自动步进可能在某一段产生过大的 leapfrog,导致数值振荡。处理手段是设置
maxstep=限制最大步长,比如你的仿真时长为 1ms,可以先试maxstep=1u。 - 模型不连续:某些行为级模型或非物理模型在特定工作区会突然跳变,比如 MOS 管的
level=1老模型在vds过零时造成的导数不连续。这个最麻烦,因为你没法直接看到模型内部。我能给的建议是:先换成工艺厂最新版本模型包,或者在不同温度角下多做几组试验,判断报错是否随温度切换规律性出现。 - 收敛参数过严:
errpreset=conservative在某些电路里会把迭代容差压得特别紧,反而更难收敛。我通常会在系统架构探索阶段用moderate,只有在最终验证时才切到conservative。
排查时我建议按下面的表格一步步来:
| 步骤 | 操作 | 目的 |
|---|---|---|
| 1 | 查看 log 中最早 error 出现的器件和节点 | 锁定问题区域 |
| 2 | 给可疑节点添加初始条件ic=... | 排除初值问题 |
| 3 | 关闭 DC 工作点预计算,直接指定初值 | 排除 DC 收敛失败 |
| 4 | 设置合理的maxstep | 排除时间步长过大 |
| 5 | 将errpreset改为moderate或liberal | 放宽收敛容差 |
| 6 | 尝试homotopy或gmin stepping方法 | 辅助大型非线性电路收敛 |
6.3 “仿真器件未定义”的根因分析
再来说“器件未定义”这个让人抓狂的问题。在 Cadence 环境里,它通常表现为:
Error: The model `nm_25' is not defined in the cellview.或者是:
spectre: M0 (I0.M0): The instance has no model card associated.这种错误十有八九是下面三个原因之一:
- Model Library 没加载或加载路径错误:检查 Setup → Model Libraries 里的路径,是否指到了正确的
.lib文件。 - Section 名选错:同一个
.lib文件里可能定义了多个 corner 的 section,比如tt、ff、ss,如果你在 setup 里选择的是某个不存在的 section,仿真器就会说所有器件都没 model。 - 原理图里的 model name 和 model library 里的名字对不上:有次我从老库里复制了一个 cell,结果它的 CDF 参数里 model name 还是老工艺的
nch,而新工艺库里叫N_25,Spectre 自然找不到对应模型。
这里分享一个排错技巧:在 ADE Explorer 菜单里选Simulation → Netlisting → Generate Netlist,然后手打开生成的网表文件,看看其中实例的 model name 到底是什么。有些时候问题出在 netlist 生成阶段,比如符号引脚顺序配错了,光看图形界面完全看不出来,但网表里一目了然。
6.4 “仿真发散”和“瞬态不收敛”在高级场景里的特殊表现
除了普通单点仿真,发散问题在 Corner 和 Monte Carlo 里会出现一种很讨厌的现象:同一个测试台,TT corner 跑得好好的,FF corner 一上去就发散。这往往不是电路设计出了问题,而是工艺角的模型参数在某个极端温度下属性和默认假设冲突。
我遇到过一次具体案例:一个带隙基准在 SS corner、-40°C 下仿真发散,log 指向一个双极晶体管的基极电流出现了非物理的正反馈增长。排查后发现是模型库的bjt参数里对低温区 saturating current 的拟合不完美,导致某个温度点附近电导突变。最终我没有改模型,而是在电路里给这个偏置支路加了一个小的限流保护结构,既解决了收敛问题,也改善了真实芯片的低温启动特性。这提醒我:发散问题并不全是仿真工具的错,有时它是在用数值方式暴露你电路设计里的鲁棒性短板。
7. 几个让我效率明显提升的日常习惯
工具用得好的工匠,往往赢在习惯上而不是快捷键上。最后分享几条我个人在 ADE Explorer 环境下沉淀了许久的小习惯,虽然不是那种让人眼睛一亮的黑科技,但长期坚持下来,项目周期会顺很多。
7.1 建测试台时把“输出表达式”当成和电路图一样重要的资产
每当我新建一个测试台,都会先想清楚这个测试台要考核哪些指标,然后在 ADE Explorer 里一次性把 Outputs 表达式配好,而不是跑一次加一个。比如一个 LDO 测试台,我上来就把line regulation、load regulation、PSRR@1kHz、phase margin、settling time等表达式全部加到 Outputs 面板里。这样后面每次跑 Corner、参数扫描或 Monte Carlo,所有数值指标都自动跟着更新,完全不用手动逐项拉波形。
7.2 用保存 State 的方式代替频繁截图
以前用 ADE L 时,我喜欢用截图记录仿真结果,时间长了截图散落各处根本没法追溯。现在我会在关键节点给 explorer 的 state 文件手动存档,比如project_v1.0_preTemp.state。这样即便我后来的修改完全推翻现有状态,也能随时回到之前的版本把所有仿真结果重新调出来看。配合 Explorer 的结果树,每次仿真历史都有清晰的痕迹。
7.3 搭配 OCEAN 脚本做回归测试
有人在 Explorer 里配置好了所有仿真后,想问能不能批量跑。答案是肯定的,Explorer 支持通过菜单生成 OCEAN 脚本。我通常在 finished 一轮探索后,把自己常用的仿真设置导出成一个.ocn脚本,放到版本控制里。后续代码或模型库一更新,就可以用命令行回归跑一遍,把结果导成 CSV 对比。这不是必须的步骤,但对长期项目的可追溯性帮助很大。
7.4 别轻视低版本和不同版本的菜单差异
公司里有时候会同时存在 IC 6.1.8、IC 23.1 等多个版本。不同版本里 Explorer 的菜单分布、默认仿真器选项都有细微差异。遇到别人给的 state 文件加载后仿真行为不一致时,先检查版本和 Cadence 环境变量,不要急着怀疑模型库。我也吃过几次亏,最后都发现是版本默认参数变了。
写到最后的一些体会
我从 ADE L 切到 ADE Explorer 大概花了两周时间,前三天确实不习惯,老是想在菜单里找 ADE L 的影子。但适应以后,我发现自己的仿真流程从“手工维护状态”变成了“编辑状态”,本质上是一种思维方式的升级——你不再把一个测试台和一次仿真当成孤立的操作,而是把它们当成一个可以随时组合、复用、对比的工程资产。
回头看那些在网上被反复搜的“仿真发散”“瞬态仿真不收敛”“器件未定义”,很多问题归根结底不是工具不行,而是我们对仿真前配置的敬畏不够。我现在的习惯是,无论手里的项目多急,都会先花五分钟把 model library、变量定义、分析类型、输出表达式这几件事确认一遍。这五分钟在项目周期里九牛一毛,却能帮你避开好几次通宵排查的噩梦。
最后再分享一个小技巧:如果你身边有同事还在用 ADE L 做频繁的多 corner 迭代,别急着强行安利 Explorer,先用一个小例子帮他跑通一次多测试台流程,让他自己感受到“一次配置、全状态对比”的爽感。工具这事从来都是自己用顺了才最有说服力,而 ADE Explorer 值得你在下一个项目里给它一次机会。