news 2026/9/28 1:57:39

用反相器吃透PEX:Calibre xRC寄生网表逐行拆解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
用反相器吃透PEX:Calibre xRC寄生网表逐行拆解

先说说我为什么拿反相器来讲PEX。做模拟版图或者数字后端的人,被Calibre xRC吐出来的一大堆寄生网表逼疯过太多次了。电路越复杂,网表越难看懂,但越是不懂寄生网表的结构,后面后仿出问题就越难定位。反相器结构简单,PMOS和NMOS各一个,逻辑关系一目了然,把它吃透了,你就能建立一套解读SPICE PEX文件的通用方法论,不管是分析标准单元、运放还是IO,思路全是一样的。这篇文章会把Calibre xRC提取出来的SPICE网表逐段拆开看,每一行寄生元件是怎么来的、对应版图上哪块结构、数值合不合理、怎么检查和后仿,全流程讲清楚。适合刚接触PEX的版图工程师、做后仿的电路工程师,也适合准备流片项目的学生。

1. 为什么反相器是学习PEX最好的入口

1.1 从版图到寄生网表的完整链路

PEX的全称是Parasitic Extraction,翻译过来叫寄生参数提取。整个流程的输入是已经通过LVS的版图,加上工艺厂提供的xRC规则文件,Calibre xRC会从版图里识别出每个器件、每根连线,然后根据工艺层的物理尺寸、间距、叠层厚度,计算出一堆电阻电容,最后把这些寄生元件和原始器件一起输出成一个新的网表。这个网表就叫PEX网表,专业一点的称呼是post-layout netlist或者parasitic netlist。

为什么必须做这一步?因为前仿用的理想网表里,器件之间是纯导线连接,没有电阻,也没有电容。可真实芯片上,多晶硅栅有电阻,金属线有电阻,两根靠得很近的金属线之间会形成耦合电容,MOS管的源漏扩散区对衬底也有结电容。这些寄生参数在高速电路、低功耗电路、高精度模拟电路里,直接决定性能达标不达标。一个反相器的级联延时,本地互连的RC就能吃掉不少裕量,更不用说输出端那个米勒电容会把输入输出耦合在一起,严重的话会产生信号过冲。

很多人把PEX当成LVS的一个附带功能,其实不对。LVS只关心连接关系对不对、器件参数是不是一致,PEX关心的是真实物理效应。所以PEX对版图的完整度、器件识别的准确率要求更高。我的习惯是跑PEX之前先确认LVS clean,如果LVS都有问题,PEX结果大概率也是不可信的。

1.2 Calibre xRC输出文件都有哪些

跑完Calibre xRC,会在输出目录下生成一整套文件,不是只有那个最大的网表文件。常见的有下面这些:

文件类型文件名示例作用
寄生网表INV.pex.netlist含器件和寄生元件的完整后仿网表
源网表INV.source.netlist由版图抽取出的原始器件连接网表
提取报告INV.pex.report统计提取了多少电阻、电容,有无警告
规则日志INV.xrc.log规则文件执行过程记录
格式转换文件INV.pex.spf / .spef给数字STA或者第三方工具用的格式

这里要特别说一下source.netlist和pex.netlist的区别。source.netlist是Calibre把版图里的器件按LVS识别出来的连接关系整理出来的理想网表,里面没有寄生,和一些EDA工具的“extracted view”类似。pex.netlist是在source的基础上加上了各种R、C、CC元件。两个文件放一起对比,你就能很清楚哪些是原始器件,哪些是寄生元件。

另外如果设置了抽象的端口信息,还会生成一个pin文件。这个pin文件在后仿测试平台里非常重要,因为它定义了端口的顺序和名字。很多人在LTspice或者HSPICE里做后仿发现节点对不上,十有八九是没核对pin文件,直接拿理想网表的端口顺序去套寄生网表,结果乱套。

2. 反相器PEX SPICE文件逐段拆解

2.1 基本反相器网表长什么样

先写一个最简化的反相器SPICE网表作为参照。假设是0.18um工艺,NMOS宽长比0.5u/0.18u,PMOS宽长比1u/0.18u,输入节点A,输出节点Y,电源VDD,地VSS。

.SUBCKT INV A Y VDD VSS MP Y A VDD VDD P_18 W=1u L=0.18u MN Y A VSS VSS N_18 W=0.5u L=0.18u .ENDS INV

这个网表里,PMOS和NMOS就四个端子,栅极接A,漏极接Y,源极接电源或地,衬底也接电源或地。理想情况下,输入A到输出Y之间只有晶体管的栅氧电容和交叠电容,数值非常小。但实际流片的版图不是这样,输出Y要经过金属线连出去,输入A的多晶硅栅塔跨整个有源区,栅极本身有电阻,多晶硅和衬底之间有电容,金属线之间有耦合,全部叠加起来,PEX网表就会变成下面这种大家更熟悉的样子:

.SUBCKT INV A Y VDD VSS * DEVICE M1 M_M1 Y A VSS VSS N_18 W=5e-07 L=1.8e-07 AD=2.5e-13 AS=2.5e-13 PD=1.5e-06 PS=1.5e-06 * DEVICE M2 M_M2 Y A VDD VDD P_18 W=1e-06 L=1.8e-07 AD=5e-13 AS=5e-13 PD=2.1e-06 PS=2.1e-06 * RESISTOR R_RN1 A A_1 8.3 R_RP1 A_1 A_2 12.6 R_RY1 Y Y_1 15.2 * CAPACITOR C_CGS1 A_1 0 1.02e-15 C_CGD1 A_2 Y_1 4.35e-16 C_CDB1 Y 0 6.18e-16 C_CDB2 Y 0 1.04e-15 * COUPLING CAP CC_1 A_1 Y_1 2.21e-16 .ENDS INV

注意这里节点名后面带了数字后缀,比如A_1、A_2、Y_1,这是Calibre在内部把同一个电气节点按物理连接拆成了多个子节点,寄生元件就挂在这些子节点之间。这样做的好处是能精确模拟导线上的电阻压降和分布式电容效应,代价是节点数量爆炸。你把这个网表拿去仿真,内部节点的电压才是物理上真实存在的节点电压,而端口A和Y只是一个逻辑上的边界节点。

2.2 寄生电阻电容如何映射到版图结构

要把网表和版图对应起来,关键就是看懂每个寄生元件的来源。我用反相器的典型版图来逐个说明。

先说电阻。版图里VSS和VDD一般在两侧,中间是有源区,输入A由多晶硅连接,输出Y由金属1连接。多晶硅的方块电阻比较大,一般每方块几十欧姆,所以从多晶硅栅的一端到另一端,电阻是真实存在而且不能忽略的。上面网表里的R_RN1和R_RP1就是输入多晶硅栅分出来的电阻,NMOS和PMOS各一段。R_RY1是输出金属线的电阻,金属的方块电阻小,但如果线很长、转了很多弯,电阻也是可观的。

再看电容。C_CGS1是NMOS的栅源电容,由栅氧电容和交叠电容组成,值与W、L直接相关。C_CGD1是漏端和栅极的交叠电容加上米勒效应的来源,在反相器里尤其关键,因为它跨接在输入输出之间。C_CDB1是NMOS漏区对衬底的结电容,C_CDB2是PMOS漏区对N阱的结电容,这两个值跟漏区面积、周界长度、以及衬底偏置电压都有关。

耦合电容CC_1则是完全由版图布局决定的,比如输入多晶硅和输出金属在某个区域平行走了一段,或者上下层金属重叠了一部分,它们之间就形成了寄生耦合。这类电容在PEX网表里会单独列出来,因为它在物理上连接的是两个完全不同逻辑信号的节点,对串扰分析特别重要。

2.3 结合source netlist核验器件

拿到一个不太干净的PEX网表,我建议先打开source.netlist清点器件。反相器就应该看到一PMOS一NMOS,如果source里冒出来两个NMOS,说明版图画得有问题,或者标准单元库的层次认错了。如果source网表的W和L与前仿原理图不一致,那后仿结果有偏差也别慌,先回去核实器件参数。

还有一种常见情况:版图里有dummy器件。为了满足密度规则加的dummy管,在LVS阶段经常已经被识别成无效器件,PEX里就不会出现,但有些dummy标记不干净会导致寄生网表里凭空多出来一堆栅电容。遇到这种情况,优先查dummy layer有没有避让标记。

我自己踩过的坑是,source.netlist里的节点名和pex.netlist里的节点名不完全一致。Calibre有时会在节点名里增加层次后缀比如A:1和A:0,如果测试平台直接调用A这个名字会报节点悬空,但如果你用.include的方式把寄生网表嵌进测试平台,端口名通常还是A,冲突只在网表内部处理。所以看文件的时候,一定要先搜索SUBCKT一行,确认端口列表,再往下看器件连接。

3. 寄生参数分析的三个实用技巧

3.1 按节点归类寄生:分清主次

反相器才两个管子,寄生网表就已经有二三十行。到了稍大的电路,直接读网表会读吐。我的做法是先把寄生元件按节点分组,再重点分析敏感节点。

敏感节点的定义很直白:信号纯度要求高、驱动能力弱、或者是高速翻转的节点。反相器里输出Y就是敏感节点,因为下一级电路的输入电容全部挂在它上面,Y节点上汇聚的寄生电容越大,反相器翻转速度越慢。输入A同样敏感,因为输入端的寄生会直接影响前一级的驱动负载。

怎么快速统计?现代Calibre xRC可以输出一份网表统计报告,里面会按节点列出总电容值,也可以用文本工具自己写脚本统计,关键词是C_和CC_开头的行,把连接到同一节点的电容累加,就能估算该节点的负载电容。不要嫌脚本Low,我处理超大网表时,用awk嫌慢的话写个Python脚本十分钟就出来了,比自己肉眼数靠谱得多。

3.2 手算与PEX结果对照:判断合理性

寄生参数算出来多少是正常的?这个问题必须靠手算建立感觉。以0.18um工艺为例,单位面积栅氧电容大概在8fF/um²,一个0.5u宽、0.18u长的栅,面积0.09um²,栅电容大约0.72fF。把源漏交叠算进去,实际提取的CGS或CGD会比理论值大一些,但不会偏离到数量级都变了。

再算结电容。NMOS的漏区结电容典型面密度大约0.5fF/um²到1fF/um²,如果漏区面积0.5um²,那结电容大约0.3到0.5fF。如果PEX网表里CDB算出来是几个fF以上,你得检查一下漏区面积是不是被画得特别大,或者是不是把多晶硅栅的电容也混进去了。

线电阻也一样。铝或铜金属的方块电阻通常在几十毫欧姆到几百毫欧姆每方块,一截几微米长的输出线,电阻应该在几欧姆到几十欧姆。如果你看到一条金属线电阻被提取到上千欧姆,多半是过孔阵列没正确识别,通孔个数太少导致等效电阻偏大。

不过要注意,PEX的模型里是包含工艺偏差参数的,不同corner下寄生值会有百分之十几的波动,所以手算结果和PEX结果只要在同一个数量级、误差不超过50%,一般都算合理。差一个数量级以上的,基本可以断定哪一步出了问题,直接去查版图。

3.3 把PEX网表导入LTspice做后仿

LTspice虽然是个通用SPICE仿真工具,但很多人不知道它完全可以用来做后仿验证。反正PEX输出的网表是标准SPICE格式,LTspice能直接吃进去。关键步骤就两步。

第一步,把PEX网表文件里的器件模型名和LTspice里已有的模型对应上。PEX网表里写的是N_18、P_18这种由工艺厂定义的名字,你要么在LTspice里写对应的.MODEL语句,要么用.include把厂商提供的模型库包含进来。网上经常有人找74hc14的spice模型、hcnr201光耦的spice文件,原理是一样的,spice模型本质上就是一堆.MODEL和.SUBCKT定义,只要路径引用正确,LTspice就能解析。

第二步,写一个测试平台,把PEX网表当子电路调用。以反相器为例,测试平台可以这样写:

.include INV.pex.netlist VDD VDD 0 1.8 VSS VSS 0 0 VIN A 0 PULSE(0 1.8 0 100p 100p 1n 2n) CL Y 0 20f X_INV A Y VDD VSS INV .tran 0.02n 4n .print v(A) v(Y) .end

注意电压源名字、节点名必须和PEX网表里的端口严格一致,X_INV这一行引用的子电路名INV也要和网表里.SUBCKT后的名字对应。如果仿真报“unknown subcircuit”,基本就是子电路名拼写问题。如果报节点不足,检查端口数是否对应。

仿真出来以后,看输出Y的波形边沿,对比前仿波形。如果后仿上升沿比前仿明显变慢,多半就是负载电容和输出节点电容太大;如果波形出现振铃,则八九不离十是引线电阻和负载电容形成RC谐振,在低频下也可能只是过冲振荡。

4. PEX过程常见报错与排查实录

4.1 LVS通过但xRC报错的几种情况

最气人的就是LVS全绿,PEX一跑就红色报错。这不是工具抽风,而是xRC对层次识别的要求更细。最常见的报错是识别不了电阻模型,因为有些工艺把poly电阻、metal电阻、well电阻分别建模型,但xRC规则里的电阻层定义和LVS规则不完全一致,导致Calibre不知道这块poly到底算器件还是算互连。

另一个高频问题是dummy层冲突。Foundry的DRC规则要求加dummy金属和dummy poly,但dummy层如果没有放进xRC的识别范围内,工具会把这些金属当成真实信号线提取。结果就是电容暴增,比合理值大好几倍。解决方法是在xRC规则文件里把dummy层的排除层次加进去。

还有一个很容易踩的坑是端口位置不一致。PEX需要pin layer来定义哪些位置是输入输出端口,比如用M1_TXT标记VDD、VSS。如果pin没有放在正确的层次或者文本没有对齐,xRC会把端口丢失,生成网表时端口就少了。我遇到过一次反相器提取后只有A、Y两个端口,VDD和VSS全被当成内部节点,仿真时电源根本没法给上。

4.2 提取精度与格式设置对结果的影响

Calibre xRC的提取模式一般有C+CC、R+C+CC、R+C+CC+SUB等几种。C+CC只提电容和耦合电容,速度快,结果偏乐观;R+C+CC会多提取出电阻,更接近真实情况;再加上衬底电阻网络就是最完整但最慢的模式。反相器这种简单电路直接上R+C+CC模式就够了,模拟IP或敏感电路才需要用带上衬底网络的模式。

格式设置上要特别留意reduce_same_node_caps这一类的选项。有些选项会把同一个节点上的多个并联电容合并成一个,网表更精简,仿真更快,但如果你想细看某一根线的分佈电容效应,合并以后信息就丢了。我的建议是,初期分析用不合并的详细网表,做最终流片签核时再考虑精简选项,保证后仿精度。

如果给数字流程提供寄生参数,那就不是用SPICE网表了,而是输出DSPF或者SPEF给PT做STA。DSPF和SPEF格式里没有晶体管模型,只有RC网络,实际物理意义和SPICE版相差不大,但工具链完全不同。这个选择要在runset里做好配置,要不然数据格式不匹配,后仿工具根本不认。

4.3 外部SPICE模型文件的兼容处理

做PEX后仿经常遇到工艺模型缺失的问题。很多Foundry给的是HSPICE格式模型,LTspice或者ngspice打开会报语法不支持。处理方式有两种,一种是改语法,另一种更推荐:直接换用支持对应SPICE方言的仿真器。

举个例子,HSPICE的MOS模型可能用LEVEL=49或BSIM3,LTspice是支持大部分柏克莱SPICE语法的,但如果你用了HSPICE特有的测量语句或者某种模型选项,LTspice可能解析不了。这个时候别硬啃,换用HSPICE本身或者Spectre来做后仿,模型兼容性问题最少。

再强调一个文件格式的细节。SPICE网表里的分号是注释符,星号在行首也是注释符,但Calibre生成的网表有时会在注释行用星号加空格,某些解析器对这种情况处理不一样。如果你在导入LTspice或者ngspice时遇到奇怪的“syntax error”报错,先打开网表文件看看是不是注释格式兼容问题,手动批量替换通常一秒就解决了。

遇到74hc14这种逻辑芯片的spice模型,它往往是几百行的子电路嵌套结构,调用前先确认顶层.SUBCKT名字以及电源地引脚顺序。很多厂商模型的引脚顺序是IN+、IN-、VCC、GND、OUT,但个别芯片会把OUT放在前面,不核对就直接调用必然仿真失败。这也算是一个通用经验,不管你是接PEX网表还是光耦模型,先看子电路的引脚定义再看里面内容,能省掉很多调试时间。

写在最后的一点体会

做PEX分析这几年,我最大的感受是:网表本身不恐怖,恐怖的是你不知道每一行寄生元件对应版图上的哪一块。所以每拿到一个新工艺或者不熟悉的单元,我都坚持先用反相器这种最基础的结构跑一遍整个PEX流程,把电阻电容一个个和版图对起来,建立手感。这个习惯帮我挡掉了至少三次后仿异常的大坑,每一次都是因为某个电容来源没搞清楚,导致误判。做版图验证这一行的耐心就是这么一点点磨出来的。你手里的Calibre xRC规则文件能不能提取准,多半不是工具的问题,而是你对自己的版图结构有没有足够清晰的认识。与其等后仿挂了再抓瞎,不如先把反相器的这份PEX网表读明白,后面很多问题都会迎刃而解。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/28 1:57:35

Keil自定义FLM下载算法:STM32外挂SPI Flash烧录与调试实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/28 1:57:15

DMA原理深度解析:从考研真题到嵌入式实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/28 1:56:04

ASP.NET在线预览Office与PDF:服务端转PDF方案与避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/28 1:55:47

芯片9435应用电路图详解:从数据手册到质量判级与电路设计实操

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/28 1:55:17

Jetson Orin NX无头远程桌面实战:HDMI欺骗器与RealVNC配置指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/28 1:54:35

TSC TTP244Pro不走纸三步物理复位法:电源-机械-通信全链路清零

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华