
第一次用 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 LibrarySetup → Model Libraries路径写错或 section 选错导致器件未定义Design VariableVariables → 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 最小值。如果看到类似timestep1e-18这种数字基本说明模型里某个结电容过小或者存在非物理的突变。这时候要么调整模型参数要么在 Tran 设置里手动给一个合理的 Maxstep比如比 Stop Time 小三个数量级左右的值先把仿真跑起来再逐步收紧。Integration Method 的选项一般是methodtraponly、methodgear2only和methodeu。很多教程会告诉你 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 magnitude1那么 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 测试台里写好了gainvalue(VF(/OUT) 1)切到瞬态测试台时可以直接复用这个表达式模板只要把信号名改成对应的节点就行。省下的重复劳动虽然看不见但积累下来非常可观。3.2 Corner 和参数扫描的“并行”逻辑有人可能会说多测试台这事在 ADE L 里用手动多点仿真也能凑合。但 Explorer 真正拉开差距的地方在于它允许你在一个测试台内部定义多组分析条件和多组变量值然后把它们组合成多个“状态”一次性跑完。比如我在同一个测试台里定义了VDD1.8、VDD1.62和VDD1.98三组变量再给 tran 和 ac 各建一个分析Explorer 会自动生成 6 个仿真任务而且跑完以后所有结果都能在 Results 面板里按条件分类不需要像 ADE L 那样手动改参数一遍一遍重新提交。3.3 状态保存和结果对比在这个环节我建议每个测试台都保留一份“initial state”的 snapshot。Explorer 支持.state文件的保存和加载相当于把你当前所有变量、分析、输出配置打包存档。实际操作中我发现这对多人合作特别有用A 工程师把他的状态文件发给 BB 加载后理论上看到的变量输出设置完全一致不会出现“我这能跑你那报错”的玄学问题。结果对比方面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 面板会自动形成一个带层级的状态树。比如你可以先展开cornerff再展开temp125再展开vdd1.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可以先试maxstep1u。模型不连续某些行为级模型或非物理模型在特定工作区会突然跳变比如 MOS 管的level1老模型在vds过零时造成的导数不连续。这个最麻烦因为你没法直接看到模型内部。我能给的建议是先换成工艺厂最新版本模型包或者在不同温度角下多做几组试验判断报错是否随温度切换规律性出现。收敛参数过严errpresetconservative在某些电路里会把迭代容差压得特别紧反而更难收敛。我通常会在系统架构探索阶段用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_25Spectre 自然找不到对应模型。这里分享一个排错技巧在 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、PSRR1kHz、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 值得你在下一个项目里给它一次机会。