1. 从一次真实的提参翻车说起
做版图后仿真的朋友,估计没有谁没被Calibre PEX折腾过。我印象特别深,早些年做一个电源管理芯片的后仿,全芯片提参跑完,仿真结果和预仿差距大得离谱,查了两天才发现是HCELL和XCELL没配对,导致关键模块被重复提取,寄生电容直接翻倍。那次之后我才真正意识到,Calibre提参这件事,跑通不难,跑对很难。
这篇内容就围绕Calibre部分提参这个主题展开,把PEX流程里最容易被忽视的细节、HCELL/XCELL的正确用法、常见报错的排查思路,以及我自己踩过的坑,系统地梳理一遍。所谓部分提参,指的是不对全芯片做完整的寄生提取,而是只针对特定模块或特定层次进行提取,其余部分用简化模型或理想连接代替。这样做的好处很直接:仿真时间大幅缩短,同时关键路径的精度还能保住。
适合读这篇的人,包括正在做后仿的版图工程师、需要自己跑PEX的电路设计者,以及刚接触Calibre提参流程的初学者。我会尽量把每个参数背后的逻辑讲清楚,让你不只是抄命令,而是真正理解为什么这么设。
2. 部分提参到底在解决什么问题
2.1 全芯片提参的痛点在哪里
先说说为什么需要部分提参。一个中等规模的SoC,全芯片PEX跑下来,寄生网络动辄几百万甚至上千万个节点。拿去做SPICE仿真,光是矩阵求解就能让服务器跑上几天几夜。更麻烦的是,很多模块对寄生并不敏感,比如纯数字逻辑、偏置电路、低速控制通路,你花大力气提取出来的寄生参数,对最终仿真结果的贡献微乎其微。
全芯片提参还有一个隐患:寄生网络太庞大,仿真器收敛困难,经常跑到一半报不收敛,调试起来极其痛苦。我见过一个案例,全芯片提参后仿真跑了72小时没出结果,后来改成只对时钟树和敏感模拟模块做部分提参,仿真时间降到4小时,结果精度反而更可控。
所以部分提参的核心逻辑就是:把有限的仿真资源花在真正影响性能的路径上,其余部分用合理的简化模型替代。这不是偷懒,而是工程上的资源优化。
2.2 部分提参的三种典型场景
实际项目中,部分提参主要有三种用法。
第一种是关键模块提参。比如一个锁相环,你只关心VCO和电荷泵的寄生,那就只对这两个子电路做PEX,其余部分保持原理图网表。这种场景下,HCELL的设置是核心。
第二种是层次化提参。芯片里有多个相同的模块实例,你只需要提取其中一个,其余实例复用同一份寄生网表。这就是XCELL发挥作用的地方,能大幅减少提取时间和网表体积。
第三种是增量提参。版图改了一小块,不想全芯片重跑,只对改动的模块重新提取,然后和之前的寄生网表合并。这种用法对HCELL和XCELL的配置要求最高,配错了就会出现寄生重复或丢失。
2.3 HCELL与XCELL的角色分工
很多人搞不清HCELL和XCELL的区别,我用一句话概括:HCELL是“我要提取这个单元内部的寄生”,XCELL是“我要把这个单元当成黑盒,不提取内部寄生”。
HCELL的全称是Hierarchical Cell,告诉Calibre这个单元需要被当作一个独立的提取层次,内部寄生要提取出来,但提取结果会以子电路的形式独立存在,方便复用。XCELL则是Exclude Cell,告诉Calibre这个单元不需要提取内部寄生,直接用理想连接或外部提供的网表替代。
两者的配合逻辑是这样的:你先用XCELL把不需要提参的模块排除掉,再用HCELL把需要单独提取的模块标记出来。如果同一个单元既在HCELL又在XCELL里,Calibre会报冲突,具体行为取决于版本和配置,这也是很多报错的根源。
注意:HCELL和XCELL的优先级在不同Calibre版本中行为不完全一致,建议在正式跑之前用一个小case验证一下你所用版本的实际行为。
3. HCELL与XCELL的配置细节与实操
3.1 HCELL的正确写法与常见误区
HCELL通常在PEX的规则文件或命令行中通过-hcell选项指定。写法上,你需要给出单元的完整层次路径,比如:
calibre -pex -hcell top_inst.pll_inst.vco -xcell top_inst.digital_core ...这里有个容易踩的坑:HCELL的路径必须和版图网表中的层次名完全一致,大小写敏感。我遇到过好几次,原理图里叫VCO,版图里叫vco,结果HCELL没生效,Calibre默默按全芯片提参跑了,白白浪费几个小时。
另一个误区是HCELL的粒度。有人把HCELL设得太细,比如把每个反相器都设成HCELL,结果提取出来的子电路数量爆炸,网表管理反而更麻烦。我的经验是,HCELL的粒度控制在功能模块级别比较合适,比如一个运放、一个比较器、一个电流镜阵列。
还有一点,HCELL指定的单元,其内部寄生会被提取,但这个单元对外仍然是一个层次化的子电路。如果你希望这个子电路的寄生网表能被多个实例复用,需要配合XCELL或其他复用机制。
3.2 XCELL的排除逻辑与嵌套处理
XCELL的写法类似:
calibre -pex -xcell top_inst.digital_core -xcell top_inst.bias_gen ...XCELL的核心作用是排除。被XCELL标记的单元,Calibre不会提取其内部寄生,而是把这个单元当作一个黑盒,端口之间的连接保持理想。
这里有个细节值得注意:XCELL是支持嵌套的。如果你把顶层的一个大模块设为XCELL,那么它内部的所有子模块都自动被排除,不需要再单独指定。但反过来,如果你只想排除大模块内部的某一个小模块,就需要精确指定那个小模块的路径。
我实际项目中常用的策略是:先用XCELL把整个数字域排除掉,再对模拟域里的关键模块用HCELL单独提取。这样既保证了数字域不被过度提取,又保证了模拟关键路径的精度。
3.3 HCELL与XCELL冲突时的排查方法
HCELL和XCELL冲突是提参过程中最常见的报错之一。典型现象是Calibre报出类似“cell specified in both hcell and xcell”的警告,然后提取结果不符合预期。
排查思路分三步。第一步,检查你的HCELL和XCELL列表,看是否有路径重叠。注意,路径重叠不一定是完全相同的字符串,比如HCELL指定了top.a.b,XCELL指定了top.a,这就构成了嵌套冲突。
第二步,确认Calibre版本对冲突的处理策略。有些版本是HCELL优先,有些是XCELL优先,还有些直接报错退出。你可以查Calibre的PEX手册,或者用一个最小case实测。
第三步,如果确实需要同一个单元既被排除又被提取,考虑用层次化的方式拆分。比如把需要提取的部分单独做成一个子单元,和需要排除的部分分开,避免在同一层次上冲突。
实操心得:我习惯在跑PEX之前,先用calibre -pex -hcell ... -xcell ... -report 生成一份报告,检查HCELL和XCELL的匹配情况,确认没有冲突再正式跑。这个习惯帮我省下了大量返工时间。
4. 部分提参的完整实操流程
4.1 环境准备与输入文件检查
正式跑PEX之前,需要确认几样东西到位。版图GDS、原理图网表、PEX规则文件、HCELL/XCELL列表,这四样缺一不可。
GDS文件要确保是最新版本,我吃过亏,用旧GDS跑提参,结果和原理图对不上,LVS都过不了。原理图网表要和GDS对应的版本一致,最好在跑PEX之前先跑一遍LVS,确认clean。
PEX规则文件通常由工艺厂提供,里面定义了寄生提取的模型、层映射、参数等。不同工艺节点的规则文件差异很大,不要混用。HCELL/XCELL列表可以写在规则文件里,也可以通过命令行传入,我倾向于用命令行,方便版本管理和快速切换。
4.2 规则文件中的关键参数设置
PEX规则文件里有几个参数直接影响部分提参的效果,值得单独说说。
第一个是PEX_EXTRACT_TYPE,控制提取的寄生类型,常见的有R、C、RC、RCC等。部分提参场景下,如果只关心电容耦合,可以只提C,速度会快很多。但如果做时序分析,通常需要RC。
第二个是PEX_NETLIST_TYPE,控制输出网表的格式,比如SPICE、SPECTRE、CALIBREVIEW等。这个要和你的仿真器匹配,选错了仿真器读不进去。
第三个是PEX_REDUCE_LEVEL,控制寄生网络的简化程度。部分提参时,可以适当提高简化级别,减少节点数量,加快仿真速度。但简化太多会损失精度,需要根据模块敏感度权衡。
第四个是PEX_HCELL_LIST和PEX_XCELL_LIST,这两个参数可以直接在规则文件里指定HCELL和XCELL,效果和命令行传入一样。我一般把稳定的配置写在规则文件里,临时调整用命令行覆盖。
4.3 运行PEX并检查输出结果
命令行跑PEX的基本形式:
calibre -pex -hcell hcell_list.txt -xcell xcell_list.txt \ -rules pex_rules.cal \ -layout design.gds \ -source design.spi \ design_pex跑完之后,重点检查几样东西。第一,日志里有没有HCELL/XCELL相关的警告或错误。第二,输出的寄生网表里,HCELL指定的模块是否以独立子电路形式存在。第三,XCELL指定的模块是否被正确排除,内部没有寄生节点。
我通常会用Calibre自带的PEX查看器或者第三方工具,把提取结果和版图对照看一遍,确认关键节点的寄生值在合理范围内。如果发现某个模块的寄生明显偏大或偏小,多半是HCELL/XCELL配置有问题。
4.4 寄生网表与原理图的合并验证
部分提参的输出网表,需要和原理图网表合并后才能做后仿。合并的方式取决于你的仿真流程。常见做法是,PEX输出一个包含寄生子电路的网表,原理图网表里对应的模块用include的方式引用这个寄生子电路。
合并之后,一定要做一次LVS或网表一致性检查,确认端口连接、器件数量、参数都对得上。我见过不少案例,PEX网表和原理图网表合并后,端口顺序不一致,导致仿真结果完全错误,查起来非常费劲。
提示:合并后的网表建议先跑一个简单的DC仿真,确认工作点正常,再跑瞬态或AC。这样能把网表层面的问题提前暴露出来,避免在复杂仿真里浪费时间。
5. 常见报错与排查技巧实录
5.1 HCELL未生效的典型表现
HCELL未生效的表现很隐蔽,Calibre不会直接报错,但提取结果里HCELL指定的模块没有独立子电路,或者寄生被平铺到了上层。这种情况多半是路径写错了,或者大小写不匹配。
排查方法:在PEX日志里搜索HCELL相关的信息,Calibre通常会打印匹配到的HCELL数量和名称。如果数量对不上,就逐个检查路径。另外,可以用Calibre的层次浏览功能,确认版图网表里的实际层次名。
5.2 XCELL排除不彻底的排查思路
XCELL排除不彻底,表现为被排除的模块内部仍然出现了寄生节点。原因可能是XCELL路径只匹配到了部分实例,或者模块内部有被HCELL单独指定的子模块,导致部分提取仍然发生。
排查时,先确认XCELL路径是否覆盖了所有实例。如果模块有多个实例,路径要用通配符或逐个指定。然后检查是否有HCELL和XCELL的嵌套冲突,必要时调整HCELL的粒度。
5.3 寄生重复提取的定位与修复
寄生重复提取是部分提参里最严重的问题之一,直接导致仿真结果偏大。典型原因是同一个模块既被HCELL提取,又被上层提参时重复提取了一遍。
定位方法是,在输出网表里搜索该模块的寄生子电路,看是否出现了多次。修复方法是,确保HCELL指定的模块在上层提参时被正确识别为子电路,不再重复提取。这通常需要配合PEX的层次化提取选项,比如PEX_HIER_DELIMITER等。
5.4 网表合并后仿真不收敛的处理
网表合并后仿真不收敛,原因可能有很多,但在部分提参场景下,常见的是寄生网络里出现了悬空节点或短路路径。这往往是XCELL排除后,端口连接没有正确处理导致的。
处理方法是,检查XCELL模块的端口连接,确认排除后端口之间的理想连接是否符合预期。另外,可以适当提高PEX的简化级别,减少寄生节点数量,改善收敛性。
| 常见问题 | 典型表现 | 排查方向 | 修复方法 |
|---|---|---|---|
| HCELL未生效 | 模块无独立子电路 | 检查路径和大小写 | 修正HCELL路径 |
| XCELL排除不彻底 | 内部仍有寄生节点 | 检查路径覆盖和嵌套 | 调整XCELL粒度 |
| 寄生重复提取 | 仿真结果偏大 | 搜索重复子电路 | 修正HCELL/XCELL冲突 |
| 仿真不收敛 | 跑一半报错 | 检查悬空节点和短路 | 修正端口连接或简化 |
6. 提升提参效率的实战经验
6.1 合理划分提参粒度的原则
提参粒度直接决定了提取时间和仿真精度。我的经验是,按敏感度划分:对寄生敏感的高速信号路径、模拟小信号路径,粒度细一些,HCELL到功能模块级别;对寄生不敏感的数字逻辑、低速控制,粒度粗一些,XCELL到子系统级别。
具体操作上,可以先做一次快速的全芯片提参,看看哪些节点的寄生贡献最大,然后针对这些节点所在的模块做精细提参。这样有的放矢,比盲目设置HCELL高效得多。
6.2 利用XCELL减少网表体积的技巧
XCELL用得好,网表体积能减少一个数量级。技巧在于,把重复实例多的模块设为XCELL,让Calibre只保留一份理想模型,而不是每个实例都展开。
另外,对于工艺厂提供的标准单元,通常已经有成熟的寄生模型,可以直接用XCELL引用,不需要自己提取。这样既保证了精度,又节省了时间。
6.3 版本差异带来的行为变化
Calibre不同版本对HCELL和XCELL的处理确实有差异。我遇到过同一个配置在旧版本上跑得好好的,升级后结果变了。所以,升级Calibre版本后,建议用之前的case回归验证一下,确认提参结果一致。
如果发现行为变化,先查版本release note,看是否有相关改动。然后调整配置,必要时联系工艺厂或EDA厂商确认推荐用法。
6.4 与LVS的协同检查策略
PEX和LVS是紧密相关的。LVS确认版图和原理图一致,PEX在此基础上提取寄生。所以,跑PEX之前一定要确保LVS clean。如果LVS有问题,PEX结果也不可信。
我习惯在PEX流程里嵌入LVS检查,每次提参前自动跑一遍LVS,确认无误再继续。这样能把版图层面的问题提前拦住,避免在提参阶段浪费时间。
实操心得:部分提参的配置建议做成脚本,参数化HCELL和XCELL列表,方便不同项目复用。我自己的脚本里,HCELL和XCELL列表是独立的配置文件,跑PEX时通过命令行传入,切换项目只需要改配置文件,不用动主脚本。
7. 一些个人体会
Calibre部分提参这件事,说到底是对工程判断力的考验。工具本身的功能很强大,但怎么用、用到什么程度,取决于你对电路的理解和对精度的要求。我见过太多人把PEX当成一个黑盒,跑通了就完事,结果仿真结果和实测对不上,回头查才发现是提参配置的问题。
HCELL和XCELL的配置,核心就一句话:想清楚哪些模块需要精细提取,哪些可以简化,然后用正确的路径告诉Calibre。路径写对了,冲突排除了,剩下的就是流程化的操作。
最后分享一个小技巧:每次跑完PEX,把HCELL/XCELL列表、规则文件版本、Calibre版本、提取时间这些信息记录到一个log里。下次项目复用或者出问题时,这份记录能帮你快速定位。我现在每个项目都有这么一份提参日志,回头看的时候省了不少事。