☰
Calibre PEX寄生参数提取与HSPICE网表生成全流程指南
2026/10/7 10:54:53 网站建设 项目流程

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 points,PEX很可能把某些器件当成了不存在,或者把本来应该连在一起的节点当成断开处理,提取结果自然不可信。

我之前遇到过一个情况: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-Level

Calibre PEX提供多种抽取模式,最常用的是Transistor-Level(晶体管级)和Gate-Level(门级)。

Transistor-Level是字面意思,把版图里的每一个晶体管、电阻、电容都保留,同时在每个器件端口和节点之间加上寄生R和C。这种模式精度最高,但网表极大——如果芯片是几百万门的数字模块,晶体管级提取出来的网表动辄上GB,HSPICE根本跑不动。

Gate-Level则是把标准单元看作一个整体,网表只保留单元实例和单元之间的连线寄生,单元内部的寄生不提取,或者用Foundry提供的库级寄生参数代替。网表小得多,仿真速度快,但精度会打折扣。

数模混合设计里的平衡点我一般是这么把握的:模拟模块、IO部分、电源网络、敏感的信号链路——全部用Transistor-Level提取;数字逻辑核心——用Gate-Level或者干脆用数字流程里更常用的SPEF提取,不丢给HSPICE。这两种模式在同一个PEX run里是可以混合设置的,只要hcell文件定义得当。合理选择抽取范围和模式,能让仿真精度和速度都处于可用区间。

3.3 输出格式配置:为什么选HSPICE而不是SPECTRE

PEX输出网表格式在GUI里就是一个下拉菜单,但这里值得多说几句。HSPICE和SPECTRE格式的主要区别在于器件模型的写法、参数单位、以及一些语法的严格程度。

HSPICE格式更"老派",比如电阻的写法是R1 n1 n2 1.2k,电容是C1 n1 n2 5fF,单位后缀可选可不选,但默认单位是法、欧、亨。SPECTRE格式则更接近Cadence的语法,比如电容会写成c1 (n1 n2) c=5f。两者在数学上等价,但如果你拿到网表之后要手动修改、或者要和已有的HSPICE testbench合并,那么直接用HSPICE格式会省去一层转换。

还有个细节是:PEX输出HSPICE网表时,可以选是否把寄生元件归并到器件子电路内部,还是单独以子电路顶层元素输出。我的建议是选后者,也就是netlist floating方式,让寄生R、C单独列在子电路里,不要合并进器件模型。这样后仿真时如果你想单独看某个节点上的寄生电容贡献,直接在网表里搜索对应节点名就能找到,排查问题很方便。如果合并进模型,虽然网表小一点,但调试起来非常痛苦。

3.4 端口顺序与全局节点:最容易埋雷的地方

PEX提取出来的网表在仿真时出现奇怪的错误,十有八九是端口顺序和全局节点的问题。

先讲端口顺序。顶层电路的输入输出端口,PEX默认是按照它在源网表里的顺序排列的。但版图提取出来的"顶层端口"会有多种类型:PAD(IO口)、电源、地、以及内部连接外部模块的端口。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(只提取寄生电阻)、R+C(都提取),高级的还有CC(耦合电容)和L(电感)提取。

对于数模混合电路,我的经验是:模拟模块一定要提取R+C+CC,因为模拟信号的延迟和增益误差主要由电阻和电容造成,而高速数字信号和模拟信号之间的串扰则通过耦合电容(CC)体现——不提取CC,你就看不到数字总线翻转时对邻近敏感模拟线的干扰。

电感提取倒是要慎用。电感提取只在射频电路或者高速SerDes这种场景下才有意义,而且提取出来的寄生电感通常会带来严重的仿真收敛问题。普通模拟信号,工作频率几百兆以下,寄生电感的影响基本可以忽略。我曾经在某个项目里为了"完整"开了电感提取,结果HSPICE跑后仿真时,每跑几步就报non-convergence,折腾了两天,最后关掉电感提取才恢复正常。从那以后,我对电感提取的态度就是:除非设计里明确需要,否则默认关掉。

4. 生成HSPICE网表后怎么验证与使用

4.1 网表结构解读:读懂PEX输出的HSPICE

PEX生成的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_25,PEX网表里写的也是nch_25,那直接把工艺库.lib包含进来就行。但有些时候Foundry在PEX rule里写了模型名映射,可能把nch_25映射成了nch_25_3v3,这种情况就要手动在HSPICE里修正或者定义alias。

第二处是顶层测试平台的调用方式。PEX输出的网表是一个子电路,你需要写一个testbench去调用它,就像调用任何其他子电路一样。注意端口顺序要和.subckt声明的一致。

第三处是.option设置。PEX网表规模大、节点多,HSPICE默认的仿真收敛参数可能不够用。我一般会加这几条:.option post=2(输出二进制波形文件,省磁盘)、.option accurate=1(提高收敛精度)、.option measdgt=4(更多有效位数)。如果是大型网表,还会加上::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行的端口顺序,修改testbench
node 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,从来没有改过这些参数。但实际上,对于模拟模块,把网格密度从默认的resolution=0.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里做前仿真,确认功能正确之后再转到Virtuoso+PDK环境做版图和PEX,整个过程还算顺。

5.5 HSPICE环境的搭建与仿真效率优化

最后聊一下HSPICE安装和仿真环境,因为热词里也有"hspice安装"这个搜索。很多人在这一步就卡住了,实际上HSPICE的安装和配置相当简单,核心就是三件事:装好许可服务、设置好环境变量、准备好模型库路径。

装完之后,建议把仿真脚本做成模板化,我的基本结构是:

.option post=2 accurate=1.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 dc=3.3VSS vss 0 dc=0VINP inp 0 dc=0.9 ac=0.5VINN inn 0 dc=0.9.tran 1n 10u.end

注意.global那行,PEX网表里的VDD和VSS如果以局部端口形式存在,而测试平台把VDD作为全局变量,就需要这行来做桥接,否则很容易出现电源压降找不到的问题。

我自己在实际操作中的体会是,PEX网表在HSPICE里的仿真速度很大程度上取决于网表本身的组织方式。晶体管级提取的网表动辄几百MB,建议用hspice64这种64位版本,同时用-mt参数开启多线程,实测能在不改变结果的前提下把仿真时间缩短一半以上。

最后再分享一个小技巧:PEX跑完输出网表之后,不要急着整个网表拿去仿真,先用grep看一下关键节点的寄生电容值是否在合理范围内。比如一个敏感信号节点的寄生电容,如果提取出来是几十fF,但你版图里这条线明明只有几十微米长,那就说明提取设置可能有误,早发现早调整,别等后仿真跑出离谱结果再返工。这个习惯帮我省下的调试时间,比任何工具使用技巧都值。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询