Cadence Virtuoso里做后仿真,最绕不开的一个环节就是PEX寄生参数提取。我在用这套流程做CMOS反相器、运放再到带隙基准这些电路的后仿时,踩过不少坑,也慢慢摸清了一套从XRC加载到后仿真出结果的完整路径。这篇文章就是把这些步骤和问题一次性讲清楚,适合刚学会画版图、正准备往后仿真走的同学,也适合已经跑通流程但总被各种报错卡住的人。
先简单说明一下这几个词的关系。PEX指的是寄生参数提取,XRC是工艺厂提供的提取规则文件,后仿真则是把提取出来的寄生参数带回到原理图里重新仿真。三者串起来就是:版图画完 → 用XRC规则提取寄生 → 生成带寄生的新视图 → 用这个视图做仿真。整条链路里每一步都有坑,而且很多坑是工具不报错、但结果悄悄变错的那种,最容易被忽视。
1. 为什么做PEX:前仿和后仿之间隔着一整套寄生
1.1 前仿结果和流片回来的芯片,差在哪
很多刚接触后端仿真的人会有个疑问:我的前仿真明明已经过了,为什么还要费劲做PEX?我举个最简单的例子你就明白了。你画一个CMOS反相器,前仿真里NMOS和PMOS之间就是一根理想连线,没有电阻、没有电容。但在实际版图里,这条连线是一块有电阻的多晶硅或金属,它和衬底之间会有寄生电容,和旁边走过的信号线之间还会有耦合电容。
信号频率低的时候这些寄生可能影响不大,一旦频率上去,或者电路本身对精度要求高,寄生电阻会压摆率,寄生电容会改变极点位置,耦合电容还会带来串扰。我见过一个运放,前仿的单位增益带宽有80MHz,后仿直接掉到55MHz,最初还以为是提取设错了,后来仔细查发现就是输出级到后级负载之间的一条长走线引入了将近200fF的寄生电容,把主极点往里推了。所以PEX不是流程要求,而是让仿真结果贴近真实芯片的必要步骤。
1.2 XRC文件是什么,为什么它是PEX的地基
XRC文件本质上就是工艺厂随PDK一起发下来的提取规则文件。它的核心任务是告诉Calibre:版图里每一层是什么材料、厚度多少、介电常数多少、层间关系怎么算,以及寄生电阻和电容应该用哪些模型来计算。你可以把它理解成一本“工艺词典”,PEX做的所有计算都基于这本词典的规则。
这个文件一般存放在PDK目录下的Calibre文件夹里,文件名通常是类似xxx_xrc或者xxx.calibre.xrc的形式。需要注意,XRC必须和当前使用的PDK版本严格对应。我遇到过有人用同工艺但不同金属层选项的XRC文件去提取,结果PEX跑完也不报错,但后仿出的增益明显不对,查了半天才发现是金属厚度参数和目标工艺不一致。所以拿到PDK的第一件事,先确认XRC文件的版本、文件路径、以及它对应的金属层选项。
1.3 哪些电路必须做PEX,哪些可以偷懒
理论上所有准备送交的版图都应该做PEX,但实际上可以根据电路类型决定投入多少精力。像反相器、与非门这类数字逻辑,我一般会做带全部寄生的完整提取,因为数字电路的时序、毛刺、动态功耗都和寄生密切相关。模拟电路里,运放、比较器这种对精度和带宽敏感的模块也必须做,尤其要注意输入对管附近走线的寄生失配。
但也有可以简化的场景。比如只是验证一下版图里某一根关键信号线的延迟,可以只提取RC,不看耦合电容。或者做一个内部模块的快速迭代,可以先只提C(电容),等版图基本冻结了再跑完整的RC提取。这样做不是为了偷懒,而是因为完整RC提取在大型版图上可能跑几个小时,迭代期间时间成本太高。我会在后面的章节详细讲怎么选提取类型。
2. 环境准备与XRC加载的实操步骤
2.1 工具版本与PDK版本对齐,先对齐再动手
开始PEX之前,我建议你先花五分钟确认一遍工具链的三个版本细节,否则后面报错会非常被动。一个是PDK版本,每个版本的XRC规则细节都有可能有差异;第二个是Calibre工具版本,PDK发布说明里通常会写支持的最低Calibre版本,低于这个版本时,XRC里一些较新的命令可能无法解析;第三个是Virtuoso版本,主要是影响Calibre菜单和CALIBRE_VIEW的兼容性。
我自己的习惯是先在终端里跑一次calibre -version确认Calibre版本,再打开PDK的ReleaseNotes,看看它对Calibre、Virtuoso、甚至Spectre版本的要求。如果PDK里刚好有自带的验证脚本,直接跑一遍最好,比如跑一次已经做好的LVS或PEX例子,这能最快确认环境和工具链是否干净。
2.2 在Virtuoso里调出Calibre菜单并加载XRC文件
在Virtuoso版图界面里,正常情况下会有一个Calibre下拉菜单,里面有Run PEX、Run LVS、Setup等选项。如果菜单没出现,通常是在该PDK的加载脚本里已经调用了Calibre的skill接口,你也可以手动加入。我用的比较多的写法是在.cdsinit或者PDK加载脚本里加一句:
load(strcat(getShellEnvVar("CALIBRE_HOME") "/lib/calibre.skl"))加完之后重启Virtuoso,Calibre菜单就会出现在版图编辑器的菜单栏里。不同PDK集成方式不一样,有的PDK会自己装好,这一步只需要确认即可。
接着把要提取的版图打开,在Calibre菜单里选Run PEX,第一次运行时系统会让你选择规则文件。这时找到PDK目录下的XRC文件并加载。我建议在加载后先看一眼PEX Setup对话框里显示的规则文件路径,确认它指向的是你目标工艺的XRC,而不是默认路径下的旧文件。这里一个非常容易踩的坑:项目目录下可能残留一份旧的XRC副本,PDK更新后大家忘了同步,导致所有提取都在用旧规则。
2.3 设置PEX Options:几个必填项一次设好
加载完XRC后,进入PEX Options界面要设置几个关键项。首先是Inputs里的Layout和Netlist,Layout自然选当前打开的版图,Netlist通常是提取后的网表输出名。其次在Outputs里选好输出格式,如果要在Virtuoso里直接做后仿,推荐选择CalibreView,这样提取完会自动生成一个带寄生参数的视图。
另外在Extraction Type里选RC、R+C+CC或者你需要的类型,这个我下一章详细展开。还有几个容易被忽略但很关键的开关,比如Power/Ground net的识别方式,XRC默认通过文本匹配或端口属性来识别电源地,如果你的版图里电源地命名比较特殊,要在Net Priority或P/G Net列表里手动列出来,否则提取出的网表里电源地对地电容可能没有正确计算。
3. PEX提取实操:从版图到寄生网表
3.1 PEX的第一步永远是LVS,这一步别跳
说句实在话,PEX本身并不复杂,复杂的是你带着一个不干净的LVS结果硬跑PEX。Calibre的PEX是在LVS的基础上做的,它假设版图和原理图是匹配的,并且已经从LVS结果里获取了器件对应关系。如果LVS都不过,PEX可能也能跑完,但提取出的寄生网表里器件连接关系可能是错的,甚至直接把某些器件漏掉。
我自己的节奏是:版图DRC干净之后,先跑一次完整LVS,确认ERC、器件属性、节点匹配全部通过,再切换成PEX。LVS阶段如果报了一些看起来无关紧要的Warning,比如某个电阻的宽度超出了规则范围,也要回头改掉,因为这类Warning到PEX阶段可能会直接影响寄生电阻的提取精度。反相器这种小电路可能感觉不明显,一旦去提取一个SAR ADC的电容阵列,LVS阶段的一个浮空节点警告,到后仿里就是莫名其妙的电压漂移。
3.2 提取类型怎么选:R、C、RC、还是R+C+CC
很多新手在Extraction Type这里直接选RC,这在实际项目中往往是不够的。我先解释一下这些选项的区别,你就知道怎么选了。
| 提取类型 | 提取内容 | 适用场景 |
|---|---|---|
| C | 只提取寄生电容,不提取电阻 | 快速评估负载效应,前仿阶段粗略估算 |
| CC | 只提取耦合电容 | 分析串扰,一般单独用于信号完整性评估 |
| R | 只提取寄生电阻 | 评估IR Drop、长走线压降 |
| RC | 提取寄生电阻和对地电容 | 一般性后仿,适合对串扰不敏感的模块 |
| R+C+CC | 提取电阻、对地电容、耦合电容 | 完整后仿,模拟/混合信号推荐选项 |
这里面的区别在于有没有CC,也就是耦合电容。一条走线和它旁边另一条走线之间的互容会影响信号的串扰,尤其是高速数字总线或者敏感的模拟信号线旁边有翻转的数字信号时,耦合电容造成的噪声可能非常大。我做过一个比较器,版图里输入对管的一根走线和时钟信号线并行了很长一段,只提RC时Vos是2mV,提了R+C+CC之后变成了7mV,就是因为耦合电容把时钟跳变的电荷注入了输入端。所以模拟电路我基本都选R+C+CC,数字模块如果面积很大,R+C+CC跑起来太慢,可以退一步用RC。
3.3 生成calibre view并送回原理图做后仿
设置好提取类型后,Run PEX跑完,Calibre会在Library Manager里生成一个和原理图同名的视图,类型可能是calibre,里面包含了所有器件和寄生参数。如果你的Outputs里选择了CalibreView,这个结果是自动生成的。如果你选择输出DSPF或者SPEF网表,那就需要手动做一些转换才能在Virtuoso里用,操作上更麻烦一些,所以我个人更推荐直接生成calibre view。
生成之后,并不是直接拿这个calibre view点开仿真就行。我通常的做法是:切换到原理图所在的Library,新建一个config视图,然后把原理图视图替换成calibre视图,这样在进行后仿时,顶层原理图不变,但底层器件和连接关系全部换成带寄生的版本。这里有一个细节,calibre view里的器件名字可能带有XI0这类前缀,这是Calibre给寄生网表加的层次化名称,不影响仿真,但你在定位问题时要学会从后仿网表里把这些名字对应回原理图的名字,否则排查很痛苦。
4. 后仿真:用寄生参数网表做一次“真实”的仿真
4.1 后仿配置流程:从ADE到config view
生成calibre view之后,接下来的后仿流程和你平时用ADE做前仿差不多,区别只在原理图的选择上。我在实际操作中是这么做的:在Virtuoso的Library Manager里,File → New → Cellview,创建一个类型为config的新视图。打开config窗口后,在Hierarchy Editor里把当前Cell对应的原理图视图替换成calibre视图,保存配置。
然后打开ADE L或者ADE XL,在Setup里把Simulator选为Spectre,把Database选为刚才那个config视图,就可以开始跑仿真了。跑之前建议先做一个DC工作点仿真,确认所有晶体管都工作在正常状态。这一步很值得,我遇到过几次后仿差别特别大的case,基本都是因为某个管子被寄生拉到线性区工作,先看op就能快速发现问题。
用config视图跑后仿的好处是你不必为了后仿单独再建一套原理图或者测试平台,也方便在前后仿真之间反复切换。需要做前仿对比时,只要把view从calibre换回schematic,重启仿真就行。
4.2 怎么读后仿结果:数据变差时要能定位是哪一类寄生
后仿真结果和前仿有差异是完全正常的,没有差异反而要怀疑是不是提取没生效。但怎么从差异里看出具体是哪类寄生在拖后腿,需要一点经验。我习惯先分三个层次看。
第一层看工作点。如果后仿DC工作点和前仿对不上,多半是寄生电阻引起的压降,尤其是电源和地走线的寄生电阻。第二层看AC响应。带宽下降、相位裕度变化,通常是寄生电容主导,这时候去版图里查一下关键节点上的走线长度和面积,就能估算出大概的电容值。第三层看瞬态波形。如果输出波形上有明显的高频毛刺或振铃,那就要怀疑耦合电容和寄生电感。寄生电感在PEX里一般默认不提取,但个别高频工艺中会提供,这种情况需要打开对应的提取选项。
我强烈建议你在后仿时不要只跑一个corner,至少把tt、ff、ss三个工艺角都跑一下。因为寄生参数在不同工艺角下本身也会变化,XRC里已经包含了这些统计模型,后仿跑出来的差异往往比前仿要明显得多,这对评估设计的稳健性非常关键。
5. 避坑指南:后仿真常见问题与真实排查记录
5.1 文件层面:XRC加载失败与LVS报错的排查
PEX最常见的问题集中在加载XRC文件阶段。一个典型的报错是无法识别XRC文件里的某些语句,这通常说明Calibre版本太老,XRC里用了新语法。解决方式就是升级Calibre版本,或者和PDK厂商确认支持范围。
LVS阶段最常踩的坑也值得单独说一下。我见过很多新手PEX跑一半报错,回去查LVS结果明明通过了,但此时Calibre用的可能是上一次的LVS结果缓存。Calibre在PEX时默认会重新跑一次LVS,但它使用的未必是你刚跑过的那份数据。我的习惯是每次PEX前都把上一次的LVS、PEX结果文件清理干净,然后在PEX对话框里把Netlist和Output的路径都改成全新的名字,避免和旧结果混淆。
还有一个很隐蔽的问题:版图里如果有重复命名的节点,比如两条无关的线都叫VDD,LVS有可能通过,但PEX提取寄生时会把这两段都当成电源节点,导致某些应该分别计算的对地电容被合并,后仿结果自然就对不上。这个靠肉眼很难发现,只能靠细心检查版图的分层结构和命名习惯。
5.2 仿真层面:后仿真不收敛和异常振荡的处理
后仿中我最常被问到的两个问题,一个是瞬态不收敛,一个是波形有高频振荡。这两个问题在热词里也频繁出现,说明大家普遍困扰。
瞬态不收敛很多时候和寄生参数带来的RC延时有关。前仿网络少,很容易收敛,后仿网络里多了上千个寄生节点,某些节点的时间常数和其他部分相差好几个数量级,Spectre在求解时就会出问题。我的处理手段通常是:先在ADE的Simulation Options里把cmin设一个非零值,比如cmin=1e-18或者更大一点,这相当于给所有浮空或高阻节点加上最小电容,能帮求解器稳定。然后把gmin适当调大一些,比如默认的1e-12改到1e-10,这能避免部分纯电容节点在直流工作点计算时矩阵奇异。
如果还是不收敛,再检查一下积分方法,默认的trapon在某些刚硬系统上容易振荡,换成gear2或者设置maxstep为输入信号周期的1/50左右,往往能稳定下来。这一步没有什么固定的标准参数,我一般都是先改cmin和gmin,再调maxstep,一次只动一个变量,逐个试。
波形上出现高频振荡,则要分两种情况。如果振荡频率非常接近某个走线的自谐振频率,那是寄生电感和电容相互作用的结果,需要在版图里想办法减小走线长度或增加阻尼。如果振荡频率很低,更像是有源环路的问题,那先看是不是上下级之间因为寄生产生了额外的极点,导致相位裕度不够。
5.3 结果层面:calibre view不更新、器件值异常
calibre view生成后,有时候你更新了版图并重新提取,但后仿里用的还是旧的寄生参数。问题多半出在config视图没有刷新。每次重新PEX完,我建议在config视图里把calibre view的版本号确认一下,或者直接把config视图重新打开一次。Virtuoso偶尔也会有视图缓存问题,最彻底的办法是把旧的calibre view删掉,重新生成一遍。
另外,有时候提取完成后,某个器件的尺寸值看起来明显不对,比如电阻阻值突然翻倍。这种情况先别急着怀疑提取错误,先到版图里确认一下这个电阻是不是被识别成了另外一个模型。Calibre在PEX时会按XRC规则对版图里的几何图形重新识别器件,如果同一块图形上同时存在两个不同的器件定义,可能会导致模型参数覆盖。解决办法通常是在版图里把器件的识别层和互连层区分得更清楚,必要时添加dummy层次或者修改XRC里的exclude设置。
5.4 关于电源地寄生和衬底耦合,再补两句
最后补一个容易被忽视的点:电源和地的寄生。很多人做PEX时会把注意力放在信号线上,其实电源网络上的寄生电阻同样要命。电源走线过长时,IR Drop会导致局部电压偏低,反映到后仿里就是某些模块的增益变小或者阈值出现偏移。我在做后仿时一定会单独看一下电源网络的寄生电阻总量,如果压降超过设计预估,就回去加宽电源走线。
衬底耦合则是另一个更深层的问题。XRC里通常有衬底网络的提取选项,默认可能不开,因为会让网表膨胀得很厉害。但在一些混合信号设计里,数字开关噪声通过衬底耦合到模拟区域,是需要认真评估的。如果你做的电路对噪声极其敏感,建议打开衬底相关提取选项,哪怕只是后期在地隔离方案验证时用一次,也值得跑一遍。
结尾
跑完几次PEX到后仿的完整流程后,我个人的体会是:PEX本身不难,难的是每一步背后的判断。提取类型选什么、XRC版本对不对、LVS干不干净、后仿不收敛时怎么调整,这些经验不会写在任何一本工具的官方文档里,全是在一个个跑不完的仿真和一张张对不上的波形中磨出来的。
最后再分享一个我一直在用的小技巧:每次拿到一个PDK,先拿一个最简单的反相器版图,跑通从XRC加载到后仿的完整链路,并记录下每个环节的菜单路径、选项设置和报错解决方法,做成一个自己专属的checklist。换成新工艺新PDK时,这份checklist就是最省时间的调试指南。PEX后仿这条路,第一次走会慌,多走几次就会变成一种肌肉记忆。希望这篇文章能帮你在第一次走这条路时少撞几个墙。