ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

数模混合芯片PEX寄生提取:从规则配置到HSPICE网表生成全流程

数模混合芯片PEX寄生提取:从规则配置到HSPICE网表生成全流程 1. 为什么数模混合芯片离不开PEX网表做数模混合芯片设计的工程师多少都经历过这样的场景模拟模块前仿真波形漂亮得能拿去当教材结果版图交付前跑完寄生提取后仿真直接给你上一课——带宽掉了、相位裕度不够、偏置点漂移严重的甚至整个环路振荡起来。这种时候如果你手上没有一套靠谱的PEXParasitic Extraction寄生参数提取流程排查起来就是灾难级的体验。Calibre PEX作为业界主流的物理验证工具它的核心作用是从版图物理信息中提取出导线电阻、寄生电容以及耦合电容然后生成一个带寄生参数的SPICE网表供HSPICE或其它仿真器做后仿真验证。对于数模混合芯片来说模拟部分对寄生极其敏感——一个节点的RC延迟差个皮秒ADC的建立时间可能就不够了一对差分信号线之间的耦合电容差个飞法SFDR无杂散动态范围可能直接掉十几个dB。这就是为什么后仿真环节必须由PEX产出的网表来兜底用前仿真那种理想连线方式根本看不出问题。这篇文章我主要面向已经跑通LVS、准备搭建PEX流程的工程师也会照顾到刚开始接触数模混合后仿真的同学。内容包括PEX提取HSPICE网表前需要准备什么、Calibre PEX的规则文件如何配置、实际提取流程怎么跑、输出网表如何检查以及我在项目里遇到过的一堆常见问题。整篇都是实操向的东西希望能帮你少踩几个坑。提示这篇文章的配置命令和规则片段均基于Calibre 2020以后版本不同版本界面和某些参数名可能有差异但整体流程和思路是通用的。2. 准备工作搞清楚你要提取什么类型的寄生2.1 提取类型的选择逻辑在动手配PEX之前必须先想清楚一个问题你到底是只要电容还是要电容加电阻或者连衬底耦合都要一起提这个决定直接影响后续仿真精度和仿真时间。Calibre PEX支持多种提取模式常见的三种提取模式包含内容典型应用场景网表规模C-only仅接地电容和节点间耦合电容早期预估、速度快的迭代较小RC导线电阻 接地电容不含耦合电容数字模块、低速模拟中等RCCC电阻 接地电容 耦合电容模拟、射频、高速接口较大数模混合芯片里的模拟模块我强烈建议直接用RCCC。原因很简单模拟电路的性能往往取决于对称性和匹配性而这两者都会受到耦合电容的显著影响。比如一个差分放大器正负输入端的信号线如果有一侧离电源线更近提取出来的耦合电容就不对称后仿真就会看到额外的失调电压。这个影响C-only模式完全看不出来。当然全提取的代价就是网表变大、仿真变慢。可以先跑一次C-only快速评估前端风险和顶层连接问题再用RCCC模式做最终签核验证。这也是我在多个项目里验证过的节奏。2.2 输入文件清单缺一不可PEX不是凭空提取它需要三个核心输入缺一个都跑不起来版图文件GDSII/OASIS最终要验证的版图数据通常由版图工程师从布局工具中导出的GDS或者OASIS文件。这里有个细节GDS的层次命名和PEX规则文件里定义的层次必须一致否则工具会报层次映射错误。每次拿到新版图第一件事先做一次LVS确认层次没问题再进PEX。规则文件Rule File这个是PEX的核心配置它定义了工艺层到寄生参数的映射关系、提取模式、网表输出格式等。不同工艺节点、不同代工厂Foundry都会提供自己的PEX规则文件通常是在PDKProcess Design Kit工艺设计套件文件夹下面叫xxx_pex_rules之类的名字。工程师要做的是根据自己项目的提取需求在这个基础上做少量定制化修改而不是从零写规则。LVS结果PEX实际上可以看作是LVS的扩展它需要先识别器件和连接关系然后提取这些连接之间的寄生参数。因此PEX跑通的前提是你的版图LVS必须是干净的没有短路、断路、器件识别错误。这块是很多新手容易忽略的总觉得LVS差不多能过就行结果PEX阶段各种莫名其妙报错回溯到最后全是因为LVS没完全clean。2.3 环境变量与工具链配置环境配置这块虽然基础但容易被忽视。跑Calibre PEX前至少需要确认# 设置Calibre安装路径 export CALIBRE_HOME/path/to/calibre/installation export PATH$CALIBRE_HOME/bin:$PATH # 设置license export LM_LICENSE_FILEportlicense_server # 设置工作目录 export PEX_WORK_DIR/project/design/pex_run mkdir -p $PEX_WORK_DIRHSPICE网表生成后的仿真则需要确保HSPICE可执行文件在PATH中。有些团队会用Virtuoso的ADEL或ADE-XL做后仿真那环境变量里还需要把HSPICE的路径配置好让仿真器能正常调用。注意工作目录的路径不要带空格也不要用中文更不要放在NFS挂载有权限限制的位置。从实际经验看PEX工具在写临时文件时对路径权限非常敏感路径不对或者写不进去报错信息往往还不直白特别浪费时间。3. 深入配置让PEX按你的需求输出HSPICE网表3.1 规则文件关键参数详解PEX规则文件是从PDK里带出来的但是大部分工程师拿到的规则文件是一个通用模板你们具体项目要用什么提取模式、输出什么格式还是需要自己配置。以下这几个是我每次都要检查的关键点LAYOUT SYSTEM版图单位设定通常是LAYOUT SYSTEM MICRON或者LAYOUT SYSTEM DBU。这个必须和你的GDS实际单位一致很多提取结果差一个数量级的问题根源就在这里。PEX RDCReduction, 缩减/简化模式RDC决定了对寄生网络做多大程度的简化。RDC MAX会尽可能合并节点、简化网络输出网表很小仿真速度快但精度低RDC NO不简化网表巨无霸仿真直接卡死RDC YES采用标准简化策略是我通常的选择。对于关键模拟模块我甚至会让关键路径上的节点做特殊标识避免被过度简化。EXTRACTION这个参数直接指定要提取什么。典型配置如下EXTRACTION RC EXTRACTION COUPLING CAPS YES EXTRACTION DIODE MODEL NO如果只需要电容就把EXTRACTION设为C需要完整寄生就设为RC。我自己的习惯是数字模块做C-only快速看功耗和时序模拟模块做RC全提取。NETLIST输出网表格式。PEX支持SPICE、HSPICE、SPECTRE等多种格式标题既然是HSPICE网表那配置就是:NETLIST SPICE NETLIST FORMAT HSPICE这里有个细节SPICE格式和HSPICE格式在网表语法上有细微差别。HSPICE对器件模型的调用、参数的单位声明、分析语句的写法都有自己的一套规范。选错格式会让仿真器报一大堆语法错误排查起来很痛苦。3.2 器件层次与寄生开关控制数模混合芯片里有些器件是不需要提取寄生的。比如数字标准单元库里那些已经做过预布局优化的单元你如果给它们加寄生反而会过度悲观导致时序收敛困难。这就需要在PEX规则里对特定cell做处理。常见做法是使用PEX NETLIST里的LAYOUT语句配合EXCLUDE把指定单元排除在提取范围之外LAYOUT ... EXCLUDE CELL standard_digital_cell_* END还有一种情况是电容阵列或者匹配电阻阵列这些器件的匹配性是通过版图结构来保证的提取寄生时并不希望工具对每个finger产生额外的内部节点否则网表爆炸式增长。此时可以用MERGE相关语句把阵列合并成单一器件。3.3 顶层提取与底层提取的选择PEX支持两种提取层级顶层提取Top-level和底层提取Cell-level。顶层提取就是把整个芯片当成一个整体所有连线、所有器件的寄生一次性提出来生成一个大网表。好处是全局视角能查出跨模块的耦合问题坏处是网表大、仿真极慢而且一旦某个模块出问题定位困难。底层提取则是先对每个子模块单独做PEX生成子网表然后在顶层把这些子网表实例化拼接成一个完整的顶层网表。这种做法在数模混合设计中更实用因为模拟模块和数字模块可以分开处理数字部分用C-only快速提取模拟部分用RCCC精细提取然后在顶层拼接。实际项目中我通常这么做# 先对analog_core模块做详细提取 calibre -pex -spice -rule analog_pex.rules -input analog_core.gds -output analog_core_pex # 再对digital_top模块做快速提取 calibre -pex -spice -rule digital_pex.rules -input digital_top.gds -output digital_top_pex最后在顶层网表里用子电路的形式把两个模块连起来。这样做还有个额外好处如果模拟模块后续有改版只需要重新提取模拟那部分网表不用动数字模块整个验证周期快很多。4. 实操过程从GDS到HSPICE网表的完整闭环4.1 命令行运行PEX的完整步骤假设你的项目目录结构如下project/ ├── gds/ │ └── chip_top.gds ├── lvs/ │ └── chip_top.lvs.clean LVS干净的结果 ├── pex/ │ ├── rules/ │ │ └── pex_rules.pec │ └── output/ └── simulation/ └── testbench.sp进入pex工作目录运行以下命令cd /project/design/pex_run # 执行PEX规则文件检查确认配置无误 calibre -rule pex_rules.pec -turbo 4 -hyper # 正式提取生成HSPICE网表 calibre -pex -spice \ -rule pex_rules.pec \ -input /project/design/gds/chip_top.gds \ -output /project/design/simulation/chip_top_pex.sp \ -turbo 4 \ -hyper \ -lvs简单解释一下各参数-pex启动PEX模式-spice输出SPICE格式网表-rule指定规则文件-input输入版图文件-output输出网表路径-turbo 4使用4核并行计算多核加速效果还是很明显的-hyper开启HYPER格式加快大版图的处理速度-lvs可选跑PEX前先自动执行一次LVS检查提醒-hyper选项不是所有版本默认开启的如果命令报错确认一下你的Calibre版本是否支持。另外-turbo的核数设置要根据服务器实际资源来别一把梭到32把服务器跑死其他人也要用。4.2 提取流程中到底发生了什么PEX跑起来后并不是简单地翻版图找寄生它内部有一套严谨的流程第一步版图预处理与层次映射。工具读取GDS后根据规则文件中的LAYOUT映射表把版图层映射到工艺层的逻辑层次上。这一步相当于把图形数据翻译成工具能理解的工艺视图。第二步器件识别与连接关系提取。和LVS类似PEX会识别版图里的有源区、多边形栅、电阻条等结构形成器件清单并提取它们之间的连接网络。这一步是后续寄生提取的基础。第三步寄生参数计算。根据工艺层之间的电容模型、导线电阻模型逐条连线计算RC值。这里有大量的三维电场求解、几何计算也是整个PEX过程中最耗时的一步。HYPER模式的核心就是在这个环节用更高效的算法加速计算。第四步网表生成。把器件信息和寄生参数组合成SPICE网表写入输出文件。如果规则里配置了RDC这里还会做网络简化在保证精度的前提下缩小网表规模。理解这个流程对排查问题是很有用的——比如器件识别错误导致的网表缺器件问题一定出在第二步电阻值大得离谱多半是第一步的层次映射出了问题。这样定位问题至少能帮你少走一半的弯路。4.3 生成网表的格式与关键内容PEX跑完输出目录下会生成几个文件其中最重要的是.sp后缀的网表文件。拿一个简单的例子看内部格式* File: chip_top_pex.sp * Generated by: Calibre PEX * Date: Thu Jan 1 00:00:00 2025 .SUBCKT chip_top VDD VSS INP INN OUT * 器件实例 M1 (net1 net2 VDD VDD) pch W5u L0.18u M1 M2 (net3 net4 VDD VDD) pch W5u L0.18u M1 M3 (net1 net5 VSS VSS) nch W2u L0.18u M1 * 寄生电阻 R_PLUS_1 INP net1 12.5 R_PLUS_2 net1 net2 3.8 R_MINUS_1 INN net3 12.2 * 寄生电容 C_GND_1 net2 VSS 5.4f C_GND_2 net3 VSS 4.9f C_COUPLE_1 net2 net3 2.1f .ENDS chip_top网表里主要有三部分内容器件M、寄生电阻R、寄生电容C。注意看电容值都是fF量级这些微小寄生在低频时无所谓到了GHz级别的电路就是生死攸关的大事。网表文件开头会有一段注释记录了提取版本和日期这个在生产流程里建议保留方便后面追溯。注意PEX网表的端口顺序是按照版图里的电源和接地定义来的。在高层仿真里实例化这个子电路时端口顺序必须和网表里一致不然后果就是电源接到地、信号接到电源上仿真结果面目全非还找不出原因。4.4 后仿真中调用PEX网表的正确姿势生成好的PEX网表要配合测试激励一起跑HSPICE仿真。测试平台(testbench)里调用子电路的语法如下* testbench for chip_top .option post .include chip_top_pex.sp VDD vdd 0 3.3 VSS vss 0 0 VINP inp 0 DC 1.65 AC 0.1 VINN inn 0 DC 1.65 AC -0.1 X1 vdd vss inp inn out chip_top * 瞬态分析 .tran 1n 10u * 交流分析 .ac dec 100 1k 10g .end这里X1就是把PEX网表生成的chip_top子电路实例化到测试平台中。注意.include语句要放在调用之前初学者常犯的错误就是把顺序搞反结果HSPICE报subcircuit not found。4.5 与OrCAD等前端工具配合的流程标题相关的热搜里提到OrCAD导出网表这个要分清楚场景。OrCAD Capture作为原理图输入工具导出的网表是前仿真用的理想网表不包含任何版图寄生参数。它和PEX网表的关系是前仿真网表用来验证逻辑正确性PEX网表用来验证物理实现后的性能退化。有些团队的流程是在Cadence Virtuoso环境里完成版图设计然后用Calibre做PEX提取的网表再拿回HSPICE做仿真。也有团队用OrCAD做整体系统级仿真这时候会把PEX网表里的模拟模块作为一个子电路嵌入到OrCAD的仿真平台上。这种混合流程的关键在于接口定义——PEX网表的端口命名必须和OrCAD原理图里的网络名对应上否则转换的时候一堆连线错误。5. 常见问题与排查技巧实录5.1 网表文件内容为空或器件缺失现象PEX跑完命令显示成功但打开网表文件发现里面只有.SUBCKT头器件一个都没有或者器件数量比预期少很多。排查步骤这个问题最常见的原因有三个。原因一LVS不干净。PEX在器件识别阶段依赖LVS结果如果LVS阶段就存在器件识别不全的问题比如某些器件被ERC挡住了PEX自然提取不到。解决办法是回到LVS先把lvs.report里所有报错的器件清干净。原因二层次映射错误。规则文件里的层次定义和GDS里的层次号不匹配工具识别不出有源区或栅极层。这个排查方式比较直接打开PEX生成的.log文件搜索warning或error关键字看有没有关于layer mapping的报错。原因三RDC过度简化。有些情况下RDC策略会把一些小尺寸的器件合并或丢弃以简化网表。如果网表里缺失的是某些并联的小器件大概率就是RDC干的。把PEX RDC YES改成PEX RDC NO再试一次对比两个网表的差异就能确认问题。5.2 寄生参数数值异常偏大或偏小现象提取出来的电阻值达到千欧级别或者电容值达到了皮法级别明显偏离工艺手册给出的典型值。原因分析这个问题的根子通常出在规则文件的单位配置上。GDS的文件单位是数据库单位DBU典型值是0.005μm或0.001μm而PEX规则里默认的单位可能是1μm。如果你的版图数据实际使用0.005μm DBU但规则文件里LAYOUT SYSTEM配的是1μm所有几何尺寸都会被放大200倍电阻电容值自然跟着爆炸。解决方案检查规则文件开头的LAYOUT SYSTEM DBU字段确认和版图导出的DBU一致。不确定的话可以在版图里量一根已知长度的线看它的物理长度和GDS坐标值之差反推DBU。5.3 HSPICE仿真时报Node missing或Floating node现象PEX网表在HSPICE仿真时报错提示某些节点不存在或者悬空。原因分析PEX网表里的节点是工具根据版图连接性自动生成的正常情况下不会出现悬空节点。出现这个报错最常见的原因是网表在传递过程中被修改过——比如有人手动编辑过网表把某个节点的名字改错了或者某条连线被误删了。排查建议不要手动修改PEX网表永远保留PEX生成的原始版本任何需要修改的地方通过PEX规则、网表处理脚本来做。如果非要改也要保存原始备份。另外还有种情况某些模拟模块的衬底接触(substrate contact)没有接到统一的电源地网络PEX会把这些节点识别为独立浮空节点。这种情况需要在版图里就把衬底接触处理好而不是事后在网表里补。5.4 数字模块网表太大仿真跑不动现象全芯片PEX网表动辄几十万行HSPICE仿真跑了好几天都结束不了。解决方案这就是前面提过的分层提取战略的用武之地。把数字模块和模拟模块分开提取数字模块做C-only且网表缩减模拟模块做RC全提取。这个操作可以让整个后仿真规模骤减跑仿真的人不再骂人。具体实现方式可以在顶层网表里用简化模型替代数字模块* 数字模块简化行为模型 .SUBCKT digital_top VDD VSS CLK DATA OUT * 数字部分的时序行为模型 E_CLK OUT 0 VALUE{IF(V(CLK)V(VDD)/2, V(DATA), 0)} .ENDS digital_top这种模拟全寄生数字行为模型的混合策略在数模混合芯片后仿真里非常实用仿真速度和精度的平衡能做到很好。5.5 常见问题速查表问题现象可能原因优先排查方向网表没有器件LVS不干净/层次映射错误LVS报告、PEX日志电阻电容异常偏大DBU单位配置错误LAYOUT SYSTEM仿真报节点缺失网表被手动改动重新生成原始网表耦合电容太多导致仿真慢CC提取太激进调整为RC模式端口顺序不对子电路端口与调用不匹配核对网表头注释器件参数缺失模型库未正确包含检查.include文件6. 几个值得长期坚持的实践习惯写到这里关于Calibre PEX提取HSPICE网表的完整流程基本梳理完了。最后分享几个我在实际项目中长期坚持的实践习惯都是踩坑踩出来的经验。第一坚持脚本化运行PEX不用GUI。GUI方便可视化调试但正式流程必须脚本化。代码里记录版本、输入文件、所有自定义配置既能保证结果可复现也为日后排查问题留下依据。我现在跑PEX都是直接在服务器上敲命令或者用Makefile管理简单高效。第二每次PEX结果做一次合理性抽检。我自己的习惯是拿一小段已知走线比如一组差分信号的末端手动估算它的RC值然后和PEX网表里的对应寄生值对比。这种方法虽然土但能最快发现配置错误——比到最后仿真失败再来查要高效得多。第三注意维护PEX网表的版本管理。PEX网表是版图某一版本的产物版图更新后一定要重新提取并且保证网表文件名里包含版图版本号或日期。我见过不止一次因为用了旧网表做仿真导致验证结论完全错误的惨案。第四把整个PEX流程沉淀成项目内的Checklist。每次流片前的后仿真照着清单逐项确认提取模式是否正确、RDC设置是否符合项目要求、输出网表是否带全所有模拟模块、端口顺序是否和测试台一致。清单看起来繁琐但能防止最不该发生的低级错误。数模混合设计复杂寄生参数就是那个看不见的敌人而PEX网表就是我们看清楚这个敌人的最重要工具。希望这篇文章里的配置方法和踩坑经验能帮你把这套流程顺畅地跑起来。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进