
先说说我为什么拿反相器来讲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.18uPMOS宽长比1u/0.18u输入节点A输出节点Y电源VDD地VSS。.SUBCKT INV A Y VDD VSS MP Y A VDD VDD P_18 W1u L0.18u MN Y A VSS VSS N_18 W0.5u L0.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 W5e-07 L1.8e-07 AD2.5e-13 AS2.5e-13 PD1.5e-06 PS1.5e-06 * DEVICE M2 M_M2 Y A VDD VDD P_18 W1e-06 L1.8e-07 AD5e-13 AS5e-13 PD2.1e-06 PS2.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的提取模式一般有CCC、RCCC、RCCCSUB等几种。CCC只提电容和耦合电容速度快结果偏乐观RCCC会多提取出电阻更接近真实情况再加上衬底电阻网络就是最完整但最慢的模式。反相器这种简单电路直接上RCCC模式就够了模拟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模型可能用LEVEL49或BSIM3LTspice是支持大部分柏克莱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网表读明白后面很多问题都会迎刃而解。