
1. 数模混合设计里PEX到底在解决什么问题1.1 寄生参数为什么在混合信号设计中更致命做数模混合芯片的朋友应该都有这种体会纯数字模块跑完LVS只要DRC clean、功能仿真过了基本八九不离十但一到模拟或者混合信号模块版图结束后才是真正头疼的开始。因为模拟电路对寄生参数极其敏感尤其是运放的失调电压、带隙基准的温度系数、锁相环的抖动这些指标金属走线多出来的几飞法电容、衬底耦合进来的几欧电阻都可能直接把设计指标拉偏。数字电路里寄生参数的影响通常可以通过时序余量来吸收设计规则给定足够的裕度就行。但模拟电路不一样一个几十微安的电流镜寄生电阻带来几毫伏的压降就能让镜像比例明显偏离设计值一个高速比较器的输入节点多出0.5fF的寄生电容可能就让建立时间差了那么一两个纳秒。在数模混合芯片里数字模块的开关噪声会通过衬底和电源网络耦合到模拟模块这个耦合通道恰恰是寄生参数体现得最明显的地方。所以数模混合设计里PEX这一步不是可选项而是必经之路。1.2 Calibre PEX在整个流程里的位置讲Calibre PEX之前先把它放在整个后端流程里看一遍。标准流程大概是版图设计完成后先跑DRC检查物理规则再跑LVS确认版图和原理图的一致性LVS通过之后就到了PEX这一步——从版图里提取出寄生电阻、寄生电容甚至寄生电感结合原始网表生成一个带寄生信息的新网表供后仿真使用。拿Calibre来说PEX全称是Parasitic Extraction它在流程中的位置非常明确是连接版图和后仿真的桥梁。前仿真用的是原理图网表理想化、无寄生后仿真用的是PEX输出的网表带上了版图的真实物理效应。这个网表可以输出成多种格式HSPICE是其中最常用的一种特别是在模拟/混合信号设计领域因为HSPICE的收敛性和模型精度在业界认可度很高。我见过不少团队用Assura或者StarRC做类似的事情但Calibre PEX在数模混合领域用得最广原因有三一是它跟Calibre LVS共用一套rule文件和hcell表流程统一不用额外维护一套规则二是它的抽取精度选项多从晶体管级到门级都能覆盖三是它和主流EDA工具Virtuoso、Liberty、HSPICE、FineSim等的接口做得比较成熟尤其是输出HSPICE网表这个方向几乎就是为模拟设计者量身定做的。2. 提取HSPICE网表前的准备工作2.1 输入文件清单版图、规则文件、源网表很多人一上来就打开Calibre PEX界面急着点Run结果跑出一堆错误。其实PEX的输入文件是固定的几样缺一不可提前准备好能省掉一半的排错时间。首先是版图文件——GDS或者OASIS格式这没什么好说的注意版图必须是完成DRC clean的版本否则寄生物的提取结果也没有意义。其次是规则文件也就是PEX rule file。这个文件通常由Foundry提供后缀可能是.calibre、.lvs和.pex混在一起或者直接就是一个单独的.pex文件。注意PEX rule文件里会引用LVS rule的路径和DRC rule的路径三者是配套关系版本不能乱否则提取结果会出错。我踩过一次坑Foundry更新了金属层规则之后LVS规则还是旧的PEX rule虽然能跑通但提取出来的电容值明显偏大后来才发现是金属厚度参数没同步。第三就是源网表——这里是关键。PEX提取寄生信息之后需要把寄生元件挂到原始器件网络上所以必须有一个干净的、LVS已经确认过的源网表作为基底。这个源网表可以来自于原理图导出通常是CDL格式或者SPICE格式也可以来自综合工具如果是数字模块。这里要展开说一下源网表怎么来。在模拟设计里最经典的做法是从原理图工具导出CDL网表。这里顺便说说热词里提到的OrCAD导出网表——OrCAD Capture导出的SPICE网表如果电路规模不大、模型符号匹配也可以作为参考网表但要注意OrCAD的器件映射库和Calibre PEX的标准单元映射库往往对不上除非是自己画的小规模模拟电路否则我更推荐用IC设计工具链自带的导出功能比如Virtuoso里用Export CDL出来的网表。2.2 源网表怎么来LVS clean是前提前后仿真对不上很多时候不是PEX的问题而是源网表本身就有问题。PEX的输入网表必须是LVS clean的这个clean不只是说LVS跑过没报错而是说版图与原理图在器件类型、尺寸参数、连接关系上完全一致。为什么要强调这个因为PEX是在LVS比对结果的基础上做寄生提取的。Calibre PEX内部会把版图里的几何图形和源网表里的器件做映射如果LVS有warnings或者incorrect pointsPEX很可能把某些器件当成了不存在或者把本来应该连在一起的节点当成断开处理提取结果自然不可信。我之前遇到过一个情况LVS跑出来只有几个warning说某个电阻的最小宽度不满足规则但我知道那个电阻是dummy所以没当回事。结果PEX跑完之后那个dummy电阻成了悬浮节点后面跑HSPICE的时候直接报floating node错误排查了大半天最后还是回到LVS把dummy电阻的接法改了才解决。所以我的建议是PEX之前LVS的results一定要是true而不是clean with warnings虽然慢一点但省心。如果你的源网表是OrCAD导出的这一点更要小心。OrCAD的Electrical Rule Check和Calibre LVS的规则角度完全不同很多时候OrCAD导出的网表里节点命名和Calibre提取的节点对不上PEX跑出来的网表里会出现一堆莫名其妙的开路。比较稳妥的办法是先让OrCAD导出的网表过一遍Calibre LVS确认和版图一致之后再把它作为PEX的输入。这一步听起来多此一举但实际上能省掉后仿真阶段大量的排查时间。2.3 工具与版本匹配Calibre、HSPICE、模型库接着说一下版本匹配的问题。Calibre PEX输出的HSPICE网表最终要给HSPICE去仿真但PEX输出端口的顺序、器件模型的映射、全局节点的写法都跟工具版本和模型库版本有关系。这里有个基本的兼容性原则Calibre的版本、PDK里的PEX rule版本、HSPICE的版本、还有工艺模型文件通常是.lib或者.scs的版本四者要能对得上。Foundry一般会在PDK release notes里写清楚每个版本的支持矩阵比如哪一版PEX rule对应哪一版HSPICE模型认真读一遍能避免很多低级错误。另外一个容易忽略的点Calibre PEX在生成HSPICE网表时会默认把衬底节点、电源地节点按照rule文件里的定义去处理。如果你的网表里用到了全局节点.global那么在HSPICE仿真时需要加相应的.option或者.global声明否则节点找不到报错会非常隐蔽。我有一次就是仿真结果看起来正常但电流值整体偏大查了半天发现是PEX网表里的VDD和VSS节点是局部节点和HSPICE测试平台里的全局节点没连上相当于电源根本没接对。3. Calibre PEX完整配置流程3.1 Rule File里几个必须看的关键语句先别急着点GUI打开你的PEX rule文件用文本编辑器搜几个关键词能省掉无数个深夜。第一个是DEVICE语句。PEX rule文件里的器件定义语句规定了版图上哪些图形组合被识别成电阻、电容、二极管、BJT这种器件。如果rule里少了某种器件的定义PEX提取时会把它当成普通图形处理不会生成对应的器件但又要保留连接关系结果就是网表里多出一堆奇怪的短路或者开路。第二个是PEX NETLIST语句。这个定义了输出网表时要包含哪些器件类型、用哪种格式。通常写的是PEX NETLIST SPICE或者PEX NETLIST HSPICE。如果你发现输出的网表在HSPICE里老是报不认识的关键字多半是这里写成了SPICE格式有些语句HSPICE不认。第三个是CAPACITOR ORDER和RESISTOR ORDER。这个很关键它决定了网表里器件节点连接的顺序。HSPICE对电容电阻的端口顺序没有强制要求但如果你要把提取结果拿去和原理图对照排序一致会方便很多。第四个是HCELL变量。如果你的设计里有数字标准单元PEX rule会引用hcell文件把标准单元作为黑盒子处理只提取单元之间的连线寄生不提取单元内部的器件级寄生。这个后面会专门讲。GUI里那些选项卡看着眼花但实际上你从命令行跑PEX也是读的同一个rule文件。我个人的习惯是先用GUI生成和调试命令等稳定之后直接写一个shell脚本来跑PEX因为一到项目后期每天可能要跑好几版脚本化效率高得多。3.2 抽取模式怎么选Transistor-Level还是Gate-LevelCalibre PEX提供多种抽取模式最常用的是Transistor-Level晶体管级和Gate-Level门级。Transistor-Level是字面意思把版图里的每一个晶体管、电阻、电容都保留同时在每个器件端口和节点之间加上寄生R和C。这种模式精度最高但网表极大——如果芯片是几百万门的数字模块晶体管级提取出来的网表动辄上GBHSPICE根本跑不动。Gate-Level则是把标准单元看作一个整体网表只保留单元实例和单元之间的连线寄生单元内部的寄生不提取或者用Foundry提供的库级寄生参数代替。网表小得多仿真速度快但精度会打折扣。数模混合设计里的平衡点我一般是这么把握的模拟模块、IO部分、电源网络、敏感的信号链路——全部用Transistor-Level提取数字逻辑核心——用Gate-Level或者干脆用数字流程里更常用的SPEF提取不丢给HSPICE。这两种模式在同一个PEX run里是可以混合设置的只要hcell文件定义得当。合理选择抽取范围和模式能让仿真精度和速度都处于可用区间。3.3 输出格式配置为什么选HSPICE而不是SPECTREPEX输出网表格式在GUI里就是一个下拉菜单但这里值得多说几句。HSPICE和SPECTRE格式的主要区别在于器件模型的写法、参数单位、以及一些语法的严格程度。HSPICE格式更老派比如电阻的写法是R1 n1 n2 1.2k电容是C1 n1 n2 5fF单位后缀可选可不选但默认单位是法、欧、亨。SPECTRE格式则更接近Cadence的语法比如电容会写成c1 (n1 n2) c5f。两者在数学上等价但如果你拿到网表之后要手动修改、或者要和已有的HSPICE testbench合并那么直接用HSPICE格式会省去一层转换。还有个细节是PEX输出HSPICE网表时可以选是否把寄生元件归并到器件子电路内部还是单独以子电路顶层元素输出。我的建议是选后者也就是netlist floating方式让寄生R、C单独列在子电路里不要合并进器件模型。这样后仿真时如果你想单独看某个节点上的寄生电容贡献直接在网表里搜索对应节点名就能找到排查问题很方便。如果合并进模型虽然网表小一点但调试起来非常痛苦。3.4 端口顺序与全局节点最容易埋雷的地方PEX提取出来的网表在仿真时出现奇怪的错误十有八九是端口顺序和全局节点的问题。先讲端口顺序。顶层电路的输入输出端口PEX默认是按照它在源网表里的顺序排列的。但版图提取出来的顶层端口会有多种类型PADIO口、电源、地、以及内部连接外部模块的端口。PEX会把这些端口分门别类列在子电路的定义里比如.subckt TOP VDD VSS INP INN OUT。如果这个顺序和你的HSPICE testbench里调用的顺序不一致就会导致信号接错——最坑的是一两个输入接反了仿真还能跑结果就是错的。所以我每次拿到PEX网表第一件事就是打开看.subckt行和测试平台里的器件端口顺序对一遍。再讲全局节点。数模混合芯片里数字地和模拟地往往是分开的但又在某个点短接。PEX提取时rule文件里一般会定义GROUND NODE和POWER NODE的识别方式。如果你的版图里数字地和模拟地命名不同但物理上又是同一层金属连通的PEX可能会把它们合并成一个节点也可能不合并取决于rule里的定义。这一步如果搞错后仿真里数字噪声会直接串进模拟地看到的波形噪声异常大但你又找不到原因——因为问题不在仿真而在提取时节点合并策略就没对。我的做法是在跑PEX之前先跑一个快速抽取检查输出网表里有没有独立的AVSS和DVSS节点确认它们保持分离再开始做正式的提取。3.5 寄生提取的内容选项C、R、CC以及要不要提取电感PEX提供多种寄生提取类型最基础的是C-only只提取寄生电容、R-only只提取寄生电阻、RC都提取高级的还有CC耦合电容和L电感提取。对于数模混合电路我的经验是模拟模块一定要提取RCCC因为模拟信号的延迟和增益误差主要由电阻和电容造成而高速数字信号和模拟信号之间的串扰则通过耦合电容CC体现——不提取CC你就看不到数字总线翻转时对邻近敏感模拟线的干扰。电感提取倒是要慎用。电感提取只在射频电路或者高速SerDes这种场景下才有意义而且提取出来的寄生电感通常会带来严重的仿真收敛问题。普通模拟信号工作频率几百兆以下寄生电感的影响基本可以忽略。我曾经在某个项目里为了完整开了电感提取结果HSPICE跑后仿真时每跑几步就报non-convergence折腾了两天最后关掉电感提取才恢复正常。从那以后我对电感提取的态度就是除非设计里明确需要否则默认关掉。4. 生成HSPICE网表后怎么验证与使用4.1 网表结构解读读懂PEX输出的HSPICEPEX生成的HSPICE网表虽然内容很吓人尤其晶体管级提取几百万行都很正常但结构其实就那么几个部分。明白了结构你就不怵它了。开头通常是.subckt TOP_LEVEL_PEX 端口列表表示顶层子电路。然后是一大堆器件定义——原始的晶体管M、电阻R、电容C、二极管D以及提取出来的寄生电阻RP、寄生电容CP、耦合电容CC。这些元素混在一起按节点连接。我在数模混合项目里最常用的排查技巧是找一个关键的敏感节点比如运放输入对管的栅极在网表里搜索这个节点的名字然后看挂了哪些寄生电容和寄生电阻。因为PEX会在节点名后面自动加后缀比如_c1、_r1这种你可以轻易识别出这是提取出来的寄生元件。这一步能直观地告诉你这个节点的RC延迟主要来源是哪段走线帮你定位后仿真性能下降的物理原因。4.2 在HSPICE中跑仿真前需要改什么PEX输出的网表不能直接扔给HSPICE就跑通常要做三处适配。第一处是模型库。PEX网表里的器件模型名需要和工艺模型文件里的模型名对应上。比如PDK里的NMOS模型叫nch_25PEX网表里写的也是nch_25那直接把工艺库.lib包含进来就行。但有些时候Foundry在PEX rule里写了模型名映射可能把nch_25映射成了nch_25_3v3这种情况就要手动在HSPICE里修正或者定义alias。第二处是顶层测试平台的调用方式。PEX输出的网表是一个子电路你需要写一个testbench去调用它就像调用任何其他子电路一样。注意端口顺序要和.subckt声明的一致。第三处是.option设置。PEX网表规模大、节点多HSPICE默认的仿真收敛参数可能不够用。我一般会加这几条.option post2输出二进制波形文件省磁盘、.option accurate1提高收敛精度、.option measdgt4更多有效位数。如果是大型网表还会加上::step相关的收敛辅助选项但这里不展开具体要看仿真收敛情况来调。4.3 常见报错与处理速查表把我在实际项目中遇到的PEX转HSPICE后仿真报错整理成一张表方便大家照着排查。报错信息可能原因处理方式floating nodePEX网表里有节点只接了电容没有接任何器件和驱动回到LVS检查dummy器件的接法或检查PEX提取选项看是否把不该断开的节点断开了unknown model type网表里的器件模型名在工艺库中找不到打开PEX网表头部查看模型名到工艺模型文件里搜索确认必要时加模型映射语句non-convergence网表规模太大、或者开启了电感提取、或者模型精度设置过高先关掉电感提取调整HSPICE收敛选项检查电源地节点是否正常连接resistance too small / capacitance too large版图里有大面积的金属填充或者过宽的走线检查DRC填充metal fill是否在PEX前已经被提取必要时用PEX的fill exclude命令排除填充区域port order mismatch测试平台里实例化子电路的端口顺序和PEX网表不一致打开PEX网表复制.subckt行的端口顺序修改testbenchnode name too longHSPICE版本对节点名长度有限制老版本是16字符升级HSPICE版本或者在PEX输出时设置缩短节点名前缀这些报错里我遇到的最高频的就是floating node和non-convergence。浮空节点多半是LVS阶段埋的雷不收敛则往往是网表太大、仿真参数设置不合理——遇到过的最极端的案例是一个几千万节点的提取网表在HSPICE里跑了整整一周还没出结果最后改成把数字模块单独简化、只用PEX网表跑模拟模块配合数字模块的VCD激励一周的问题变成了一天。5. 实操中踩过的坑与独家经验5.1 HCELL与Xcell别把模拟管也当黑盒子PEX的hcell机制是把某些子电路当成黑盒子处理不提取内部寄生。这个机制对数字标准单元很有效因为单元内部寄生可以提前在单元库里做好表征。但如果你不小心把模拟模块的某个子电路也加进了hcell文件那PEX就不会提取这个模拟模块内部的寄生——后仿真结果看起来和理想情况一样干净指标全部pass但芯片回来就翻车。我见过一个真实案例某团队把Bandgap电路的所有管子都放进了hcell为了省运行时间后仿真看到温度系数0.5ppm完美结果芯片实测8ppm。查到最后发现就是hcell把关键模拟模块的寄生全部忽略了。所以我的建议是hcell文件里只放数字标准单元和IP硬核模拟模块哪怕是简单的运放也一定要做晶体管级提取。5.2 关于提取精度别迷信默认值PEX的rule文件里有很多精度参数比如寄生电容的提取精度CAPACITOR EXTRACTION LEVEL、网格密度GRID、分辨率RESOLUTION这些参数的默认值往往是为了平衡速度和精度的保守值。我发现很多工程师用了多年PEX从来没有改过这些参数。但实际上对于模拟模块把网格密度从默认的resolution0.1um提高到0.01um提取出来的寄生电容值可能会有5%到10%的差异而这一点差异对运放的单位增益带宽、对PLL的环路带宽都有实打实的影响。当然更高精度意味着更长的运行时间和更大的网表。我的习惯是先跑一版默认精度的PEX得到一个大致的网表快速跑一下后仿真看趋势如果关键指标有偏差再提高精度重新提取专门针对有问题的模块做精细提取。这样既不牺牲项目进度又能在关键环节保证精度。5.3 与HSPICE版本兼容的小细节Calibre PEX输出的HSPICE网表在语法上一般没问题但有几个小细节需要注意。一是关于$符号的使用。HSPICE里$是注释符但PEX网表里如果节点名含有特殊字符可能被误解析。所以节点的命名最好只包含字母、数字、下划线。二是关于单位后缀。不同HSPICE版本对单位后缀的解析不完全一致老版本要求必须显式写f、p、n这些后缀新版本则允许省略。PEX输出时默认会带上合理后缀但如果你在网表里手动加了某些元件要注意后缀的正确性。三是hdl和macro模型的差异。部分PDK里的模拟IP是用行为级模型hdl宏实现的PEX提取时如果遇到这类模型输出的网表可能不能直接用于HSPICE仿真需要额外映射到SPICE网表。提前在PDK文档里确认这一点能避开不少坑。5.4 OrCAD导出网表到PEX流程的实操经验既然热词里提到了OrCAD导出网表这里专门补充一条实操经验。OrCAD本身是PCB和板级仿真工具链但在教学和早期验证阶段有些工程师会用它来画小规模原理图并导出SPICE网表再配合HSPICE做验证。如果门级仿真用OrCAD的Pspice模型库到了PEX阶段你会发现PEX网表里的器件类型和Pspice模型库的器件类型对不上——Pspice里很多模型是宏模型Calibre提取出来的是晶体管级模型参数完全不是一回事。所以我的建议是如果只是做原理图验证OrCAD导出网表给HSPICE跑前仿真没问题但一旦进入版图阶段必须用PDK配套的SPICE模型库生成源网表让PEX在同一个模型体系内工作否则后仿真就是空谈。实践上我用OrCAD导出过一个小型带隙基准的网表然后在HSPICE里做前仿真确认功能正确之后再转到VirtuosoPDK环境做版图和PEX整个过程还算顺。5.5 HSPICE环境的搭建与仿真效率优化最后聊一下HSPICE安装和仿真环境因为热词里也有hspice安装这个搜索。很多人在这一步就卡住了实际上HSPICE的安装和配置相当简单核心就是三件事装好许可服务、设置好环境变量、准备好模型库路径。装完之后建议把仿真脚本做成模板化我的基本结构是.option post2 accurate1.lib ~/pdks/xx_tech/xx.lib tt.temp 25.include ./pex_output.sp.global VDD VSSXTOP VDD VSS INP INN OUT TOP_LEVEL_PEXVDD vdd 0 dc3.3VSS vss 0 dc0VINP inp 0 dc0.9 ac0.5VINN inn 0 dc0.9.tran 1n 10u.end注意.global那行PEX网表里的VDD和VSS如果以局部端口形式存在而测试平台把VDD作为全局变量就需要这行来做桥接否则很容易出现电源压降找不到的问题。我自己在实际操作中的体会是PEX网表在HSPICE里的仿真速度很大程度上取决于网表本身的组织方式。晶体管级提取的网表动辄几百MB建议用hspice64这种64位版本同时用-mt参数开启多线程实测能在不改变结果的前提下把仿真时间缩短一半以上。最后再分享一个小技巧PEX跑完输出网表之后不要急着整个网表拿去仿真先用grep看一下关键节点的寄生电容值是否在合理范围内。比如一个敏感信号节点的寄生电容如果提取出来是几十fF但你版图里这条线明明只有几十微米长那就说明提取设置可能有误早发现早调整别等后仿真跑出离谱结果再返工。这个习惯帮我省下的调试时间比任何工具使用技巧都值。