
跑完LVS、DRC通过版图干干净净心里那块石头还没落地——模拟/混合信号项目里还有一关叫PEX和后仿真。说实话我在很多项目里见过这样的场景版图从设计到收敛花了两三周结果一到Calibre PEX和Virtuoso ADE联调各种报错、结果对不上、仿真慢到怀疑人生前后折腾掉的时间比画版图还多。更麻烦的是很多问题看起来是工具问题实际上是我们对PEX的配置、输出文件机制、ADE调用方式理解不够透。这篇文章就是围绕Calibre与Virtuoso ADE联调来写的适合正在做模拟版图、或者从设计角度需要自己跑后仿的工程师。我会把PEX后仿真的完整链路拆开讲包括Calibre PEX的规则配置、calibreView生成与调用、ADE仿真设置、常见报错排查以及一些常规文档里不会写清楚的操作细节和避坑经验。内容偏实操尽量做到你拿着就能照着操作。1. PEX与后仿真到底在做一件什么事1.1 一个接近真实的网表是怎么来的先聊一个最基础但很多人没真正想清楚的问题PEX到底做了什么。版图完成并通过LVS只能说明一件事——你画出来版图里的晶体管、电阻、电容和你设计原理图里的器件是一一对应、连接一致的。但版图里还有一样东西是原理图里不存在的那就是寄生参数。金属走线本身有电阻走线和走线之间、走线和衬底之间会形成电容通孔过孔也有接触电阻。这些寄生参数在高频、高精度、低功耗电路里会直接改变电路的增益、带宽、相位裕度、噪声和时序。PEX做的事情就是基于版图几何和工艺文件里的寄生模型参数把这些不应该出现但又客观存在的额外元件提取出来生成一份包含原电路器件寄生器件的网表。这份网表再回到仿真器里跑出的结果才是版的真实行为。我用一个比较生活化的类比。版图形同城市道路规划图LVS检查的是这条路确实连到了那个路口PEX则是拿着皮尺和传感器把每条路多宽、多长、拐弯处有什么干扰、十字路口有多少杂散电容都量出来然后建成一个带有各种路况信息的交通仿真模型。后仿真就是在这样一个带路况的模型上跑车和之前理想化的直线无阻碍模型肯定不一样。1.2 前后仿差异的核心来源在实际工程项目里前后仿差多少、差在哪里主要来自这几类寄生第一类是寄生电容这是绝大多数性能漂移的元凶。金属层间电容、同层金属的侧壁耦合电容、器件本身的边缘电容在中高频电路里会形成额外的极点把本来设计好的相位裕度吃掉甚至让放大器振荡。包括节点电容增大后电路的带宽会被压缩settling time变长。第二类是寄生电阻。长走线的电阻在低功耗设计里可能产生明显的IR drop多晶电阻、Metal-insulator-Metal电容的上下极板连线电阻都会影响匹配精度。对于电流镜、差分对这类对匹配要求极高的电路走线电阻会让两端工作点不一致导致系统性失调。第三类是衬底耦合和耦合噪声。对于混合信号芯片数字开关噪声通过衬底和电源网络耦合到敏感模拟节点的现象在后仿真里会体现得比较明显。很多时候前仿真的噪声仿真结果非常干净后仿真一跑就出现杂散——这就是寄生网络的功劳。所以我们可以这样理解PEX不是可做可不做的验证流程而是判断版图质量能不能满足设计指标的最后一关。如果你的设计在PEX后还能达到前仿真90%以上的性能说明版图画得比较干净如果掉得很厉害就要回头修改版图或者调整电路结构。2. Calibre PEX配置一上来就翻车的高发区2.1 前提LVS必须过先说一个硬性前提很多人会忽略。PEX跑之前LVS必须干净通过。不是基本通过、也不是剩下几个别的问题先跑PEX看看而是必须clean。因为PEX工具本质上是复用LVS那套器件识别和节点提取引擎在版图里找器件、识别端口、网表对应关系都是靠LVS的rule来完成的。如果LVS还挂着ERC错误或者unmatched instance之类的告警PEX提取出来的网表很可能少器件、多节点、端口对不上你后仿真再努力都是白搭。实际操作中我一般建议在跑PEX前先把LVS的report打开确认一下Incorrect Nets为0Unmatched Instances为0点开CDL网表对比日志确认所有器件类型都正确映射到工艺库。只有在这个基础上PEX的结果才可信。另外注意PEX rule文件通常包含了LVS规则。很多工艺厂给的PEX目录下会提供不同版本的rule文件比如xxx_35_pex_rc、xxx_35_pex_rcc、xxx_35_pex_c这类命名分别对应不同的提取类型。你需要区分清楚。2.2 关键配置项逐条拆解一次标准的Calibre PEX运行很多人直接在GUI里点来点去但真正影响结果的其实是几个关键的配置项。我按实际使用频率排一下优先级。第一个是PEX rule file的选择和确认。这个文件在Calibre界面里被称为PEX Rules File一般以.cal或.lvs后缀的形式提供但打开文件头注释你会看到它对提取类型、提取精度、栅极漏电模型等做了定义。我这里强烈建议拿到一个新工艺节点先用fab提供的PEX demo跑一遍确认生成的网表和参考脚本里的一致再大规模开展。因为有些fab的rule文件会有隐藏的版本要求比如必须使用特定版本的Calibre才能运行。第二个是提取类型Extraction Type。选项通常是C、R、CCC、RCCC不同版本名称略有差异。C代表只提耦合到地/衬底的电容CC代表包含耦合电容即线与线之间的互容R代表电阻。做后仿真的时候默认选RCCC也就是最完整模式。但如果发现仿真太慢或者想快速定位问题可以分别跑只提C和提RC做对比分析。这个技巧非常有用后面在调试部分我专门讲。第三个是输出格式Format。常见的有SPF、DSPF、SBPF、SPEF、CalibreView等。如果你需要在Virtuoso里做后仿真最推荐的是CalibreView它生成的是一个包含网表和符号视图的抽象可以被ADE的config直接调用省去手动写include文件、又对不上pin的麻烦。DSPF/SPF则适合用其他仿真流程比如标准数字流程里需要反标寄生到PT或者PrimeTime才用SPEF。第四个是网络和器件配置。这里重点看Ground net name、Power net name、Merge选项、POWER/GROUND声明。版图里不同的人命名的电源地五花八门比如VSS!、VSSA、GND、AVSS如果你不在PEX里把这些网络归一化提取出来的寄生电容在Ground定义上一定会乱出现的现象就是后仿真的节点电压整体漂移、偏置点异常。我的习惯是在PEX界面里手动把ground和supply网络全部加上包括模拟地、数字地、模拟电源、数字电源等于是告诉工具这些管子都参考哪些固定电位。第五个是输出路径与命名。这个很多人吃了大亏。Calibre PEX的输出文件会默认写到当前工作目录而且如果同名文件已经存在有时会直接覆盖而不给提示。我见过同事因为PEX输出文件被覆盖后仿真调用了旧网表却没发现浪费了大半天。后面专门讲这个坑。2.3 CalibreView是什么、为什么联调首选CalibreView本质上是Calibre PEX生成的一组供Cadence Virtuoso仿真的视图文件。它包含了一张寄生网表以spectre或hspice格式、device map、pin map以及一个可以显示在Library Manager里的cell view。这样你不需要手动去include一个spice网表再手工维护端口对应关系而是直接在Config View里把某个cell的view从schematic切换成calibreADE就能自动load对应的寄生网表。CalibreView的生成位置和库的路径有关。通常来说在CIW或者Terminal里跑PEX选择calibreView格式并指定输出库名称后文件会被写到当前library的calibre目录下。不同版本的Cadence和Calibre处理略有差异但核心机制是一致的它会在Library Manager中创建一个以calibre命名的view同时生成对应的.calibre.db、.pex等辅助文件。如果这些辅助文件被破坏或被移走Library Manager里可以显示view但ADE调用时会报错。所以我的习惯是PEX完成后先检查指定library路径下是否有完整的.calibre目录和.dbc文件然后再往下一步走。还有一点CalibreView和底层PDK的版本、仿真器模型要匹配。如果PDK升级了而CalibreView还是旧版提取出来的后仿真时器件参数可能对不上出现model not found或者parameter mismatch这类奇怪的报错。3. Virtuoso ADE联调把寄生网络真正装进仿真器3.1 config设置从schematic到calibre的视图切换Virtuoso ADE跑后仿真最标准的做法是通过Config View来切换。进入方式是在Library Manager里选中你的测试bench顶层cell右键打开Open在Cell View选择config或者通过ADE里的Setup-Design选择config文件。Config文件里会列出你的设计里所有instance以及它们对应的view。前仿真时所有模块的view都是schematic要做后仿真时需要把你关心的模块的view从schematic改成calibre也就是PEX生成的CalibreView。这里注意不需要把所有模块都切换只切换你真正想后仿的模块即可。比如你只想验证核心运放的后仿那就在config里只改这个运放的view其他模块维持schematic仿真速度和资源占用会小很多。改完之后回到ADE界面选择Setup-Environment确认Simulator是spectre或者你用的其他仿真器然后在Model Libraries里加入PDK提供的模型文件。这里有个容易忽略的细节有些工艺库的spectre模型和hspice模型是分开的如果你在PEX的时候选择输出的是hspice格式网表而ADE里用的是spectre仿真器会出现语法不兼容、器件读不进去的报错。最省事的做法是PEX输出格式直接选spectre或calibreView通常calibreView能适配spectre保持全流程一致。3.2 仿真设置corner、仿真器与include后仿真和前仿真的仿真设置整体上是一致的无非是corner、温度、模型库这些参数。但有几个和PEX相关的设置需要留意。第一个是仿真类型的选择。后仿真由于网表变庞大如果还跑全corner、全工艺角的蒙特卡洛时间会非常夸张。我的建议是初期快速验证时只跑typcorner而且先跑ac或tran里最关键的指标。等确认后仿行为符合预期再扩充到ss/ff corner。第二个是include PEX网表的方式。如果你走的是CalibreView流程ADE会自动识别并include不需要手动添加。但如果你拿到的是DSPF/SPF文件需要手动在仿真设置里加入类似这样的行// 手动include寄生网表示例 simulator langspectre include /path/to/your/output/design.pex.netlist注意DSPF文件里通常会有自己的子电路定义和你top cell的名字如果include时顶层名字和你的testbench对不上也会报instance not found或unable to read。第三个是地网络的正确性。PEX提取出来的寄生电容很多都是对地/对衬底的。如果你的测试bench里没有把地网络名称和PEX里的ground网络对应起来电容等于悬空或者接错结果完全失真。所以我每次换新设计做后仿都会先加一个简单的DC仿真看关键节点电压是否正常再跑AC/TRAN相当于做一次自检。3.3 后仿真慢到怀疑人生时怎么办这是后仿真联调里最让人头疼的问题同样的仿真前仿几分钟跑完后仿跑了两小时还在跑。有时候并不是工具坏了而是你的PEX网表太大了。面对这种情况我有几个比较成熟的处理思路。第一只提关键模块。整颗芯片后仿真在模拟设计里不现实一般都是挑核心模块来做PEX。比如ADC设计里重点看比较器、参考驱动、采样开关这些运放设计里重点看第一级、第二级和输出级。把要做PEX的模块单独提出来跑其他部分用行为模型或理想源代替时间能下降一个数量级。第二降低提取的层次化深度。在PEX选项里有一个hierarchy preserve或flatten相关的设置。如果选择完全flatten底层所有器件都打平网表会变得非常庞大如果按层次保留则可以把重复单元例化成同一个subckt网表大小会显著下降。一般PEX工具默认会做层次保留但如果你之前手动改成flatten了建议改回来。第三简化仿真参数。后仿真验证阶段不需要一开始就用最高精度。可以适当放宽abstol、reltol把tran的最大步长放宽一点仿真时间能减少不少。但注意精度放宽不要影响到你关心的指标判断比如相位裕度如果只差一两度那还是建议用默认精度再确认一遍。第四善用仿真器的检查点和波形保存策略。Spectre可以设置只保存指定节点的波形而不是默认保存所有节点。后仿真网表节点成千上万全部保存波形文件会巨大无比、拖慢仿真。用ADE里的Outputs-To Be Plotted选择你要看的节点然后设置保存类型为selected你会立刻感觉到差别。4. 后仿真翻车实录常见报错与排查速查4.1 Calibre转换完的输出存在哪输出文件和路径的坑在社区里经常看到有人问Calibre转换完的书存在哪——这里的书大概率是语音输入实际问的是输出存在哪。这个问题其实很实在。PEX跑完后可以在运行目录下找到一系列输出文件。用CalibreView模式生成的视图会写到你指定的library路径用DSPF/SPF模式会生成类似mychip.pex.netlist、mychip.pex这样的文本网表文件。我建议你在跑PEX之前就建立一套自己的输出目录管理规范。比如# 目录结构示例 /work/project/xxx_pex/ ├── run_20240520_rcc/ │ ├── mychip.pex.netlist │ ├── mychip.pex │ └── mychip.calibre.db └── run_20240520_c/ ├── mychip.pex.netlist └── mychip.pex每次跑PEX都新建一个带时间戳或工艺标签的目录避免同名覆盖。这个习惯帮我在项目后期省下了大量咦这个网表是哪一版的时间。还需要注意一个细节CalibreView输出到Cadence library之后如果你用的是分布式计算或者远程存储路径里有中文/空格可能会导致ADE读取失败。解决方法很简单全部用英文路径不要有空格或特殊字符。4.2 典型报错速查表我把自己多年来遇到的高频报错整理成了下面这个速查表方便大家直接对照报错现象常见原因解决方法找不到PEX rule文件或版本不匹配路径写错或Calibre版本过旧检查rule文件路径更新Calibre版本或改用fab指定的版本PEX输出网表里没有寄生参数提取类型选成了LVS而不是PEX确认在Calibre界面选择了PEX/Parasitic Extraction模式不是只跑LVS后仿真报instance not foundconfig里view切换错误或网表顶层名和bench不匹配打开config确认模块的view是calibre检查PEX网表顶部subckt名称节点电压完全不对、VSS悬空PEX里ground net未设定或testbench地网络名称不一致在PEX配置里明确所有ground/supply net名称并检查testbench命名仿真卡住或内存耗尽PEX网表太大、保存了全部节点波形层次保持提取、只输出关键节点波形、增加机器内存读DSPF文件报语法错误DSPF格式与仿真器不兼容优先用calibreView或使用spectre兼容的DSPF选项前仿和后仿差异大到无法接受实际是提取范围或提取类型设错分别跑只提C、只提R、RCCC定位主导因素模拟库版本更新后calibreView报错CalibreView由旧版PDK提取与新模型不兼容确保PEX使用的rule和模型来自同一个PDK版本排查的时候我的习惯是先看PEX日志里报告的提取结果概览比如Extracted nets: xxx, Devices: xxx, Parasitic caps: xxx, Parasitic resistors: xxx。如果寄生电容数量只有几个那基本可以断定PEX配置有问题不是仿真问题。4.3 让结果可靠的前提反标检查与前后仿对比很多工程师后仿真跑完看到波形觉得和前仿长得差不多就交差了。但后仿真的核心目的是判断差异在不在容忍范围内所以我建议至少要完成下面几个检查再下结论。第一个是检查PEX的报告。提取完成后Calibre会生成一个report文件里面包含了寄生电容总值、电阻总值、网络数量、器件数量等统计信息。你要关注的是寄生参数的数量级是否符合工艺和版图的预期。比如一个几十微米长的敏感走线提取出来的电阻应该是在几十到几百欧姆级别如果提取出来是兆欧级说明可能在poly层还是contact层上出了问题。第二个是前后仿真对比要有方向性的判断。后仿真由于寄生电阻电容的存在带宽一般会比前仿低主极点会向低频移动功耗可能略有增加相位裕度可能变小。如果你的后仿真结果显示带宽反而比前仿还高那一定要怀疑是PEX流程出了问题可以是提取范围不全、漏了某些网络或者是testbench在调用网表时用错了corner。第三个是定位差异来源的Debug方法。当后仿真结果异常不要一头扎进去调电路先用变量控制法确认寄生类型。具体做法是跑一版纯C提取只提寄生电容不提电阻再跑一版纯R提取对比这两版和后仿最终结果。这样你就能知道性能下降是电容主导还是电阻主导。比如传输延迟变差如果是电容主导说明走线太长、层间电容太大需要缩短关键路径或拉开间距如果是电阻主导说明走线太细、通孔不够需要加宽金属、多加via。看清楚了方向再回版图去改会高效得多。另外还有一个容易被忽略的点后仿真结束后记得检查一下ADE的仿真日志里是否有warning: floating node之类的告警。很多时候PEX网表里某些节点在提取后被标记为floating如果不处理它可能以未定义的状态参与仿真导致结果完全不可信。5. 联调实战中的几条野路子经验5.1 版本兼容性管理是最大的隐藏坑在联调过程中我吃过很多次版本不匹配的亏。Calibre和Virtuoso ADE之间的接口是通过Cadence的cds_pex接口或PEX API来实现的。如果Calibre的版本升级了而Virtuoso版本还是两年前的往往会出现PEX跑完但ADE集成菜单消失、GUI点Run PEX没反应这类诡异问题。我的建议是项目立项时就把PDK、Calibre、Virtuoso这三者的版本固定下来写进项目环境配置文档不要频繁升级。如果确实需要升级先拿一个已经流片验证过的设计跑一遍全流程确认PEX和后仿真结果与旧版本一致再全面切换。5.2 善用快速PEX做版图迭代模拟版图最痛苦的阶段是DRC/LVS反复修改期间。这时候如果每改一版版图就从零跑一次完整RCCC提取时间成本太高。我的经验是在版图没收敛之前先跑一版只提C的PEX用calibreView快速联调目的是看性能趋势是否改善而不是追求绝对精度。等版图基本稳定LVS完全干净之后再跑完整的RCCC提取做最终验证。这个策略能让你在同样的时间里多迭代好几轮版图。5.3 把后仿真变成流程化操作联调做到后期很多时候已经不是技术问题而是流程问题。我自己的习惯是建立一份checklist每次PEX后仿真都按这个清单走LVS是否cleanreport审查过PEX输出格式是calibreView库路径正确PEX配置文件里ground/supply网络都声明了config中目标模块的view已切换为calibre仿真模型库已更新为与PEX一致先跑DC自检再跑AC/TRAN对比PEX report中的寄生总量确认数量级合理记录前后仿关键指标差异输出文件和日志归档到带时间戳的目录这个清单看起来简单但它能保证你不在明明配置错了还在分析电路的状态里浪费几天时间。很多后仿真的翻车其实都是流程疏忽导致的。6. 写在最后的一点体会做了这么多年模拟版图与设计的协同我的体会是PEX和后仿真这件事真正难的不是某一个工具怎么用而是整个流程里环环相扣的细节。一个pin没对上、一个ground网络没声明、一个输出路径覆盖了都会让你在后仿真阶段花费数倍的时间去排查。与其到时候盲人摸象不如一开始就把PEX配置、输出管理、ADE联调这些基础环节标准化。你对流程越敬畏后仿真阶段就越省心。希望这篇基于大量实战经验整理的笔记能帮你少踩几个我当年踩过的坑。