拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Calibre PERC p2p电阻提取实战:从坐标换算到结果验证

做版图验证的都知道Calibre 除了 DRC、LVS 这一套还有一项叫 PERCProgrammable Electrical Rule Check的流程。很多人接触 PERC是从检查“栅极下拉电阻”“上拉电阻”这类单管器件规则开始的但 PERC 还有一个非常实用的能力经常被忽略——直接在版图上指定两个物理坐标点把这两点所在网络走线上的点到点电阻抽出来也就是大家常说的 p2p 电阻。我最早接触这个需求是帮一个模拟团队评估某条电源走线中间“细脖子”的压降当时手算算到怀疑人生后来才发现 Calibre 自带的xvref工具几下就能搞定而且结果还能自动按层、按通孔拆分。这篇文章就把我从环境准备、坐标换算、命令执行到结果验证的完整流程都写出来给负责版图验证、可靠性检查、IO ESD 路径评估的工程师做个参考。1. 为什么非要用 PERC 抽 p2p 电阻1.1 哪些场景真的会用到点到点电阻先说说我实际工作中遇到过的几类需求。最典型的是电源网络 IR Drop 的快速评估。比如模块里的 VDD 供电从顶层 PAD 进来之后要走一段 M3中间为了绕开别的模块绕了一个大弯又窄又长那你非常想知道从 PAD 到模块供电端这一整段走线到底贡献了多少欧姆。传统做法是拿画图工具量长度、数方块再套方阻公式算但一旦遇到多层跳线、通孔阵列、多段并联手算就非常痛苦而且容易错。第二种是 IO ESD 路径检查。ESD 要求从 PAD 到地之间的泄放路径尽量短、尽量宽、电阻尽量小可版图上往往要经过反偏二极管、大块金属、若干通孔甚至要绕过 Seal Ring 附近的一堆 dummy肉眼根本看不出是哪一段贡献了主要电阻。用 p2p 电阻抽出来路径上哪一截金属、哪些 vias 占了多大比例一目了然方便你反推是继续加宽金属有用还是多打孔有用。第三种是栅极偏置路径。很多项目会在 MOSFET 栅极上串一个下拉电阻或者上拉电阻但这个电阻在版图里可能画得又细又长还叠了好几层金属想确认“从栅极 poly 端到电阻端”的实际版图电阻和原理图预期是否一致就需要一把“尺子”直接量。p2p 电阻提取正好干这个。1.2 为什么不用 PEX 寄生提取的结果可能有人会想我做一次完整的 PEX寄生提取拿到 SPF 或者 DSPF 网表里面不是也有电阻吗在网表里找两个节点的等效电阻不就行了理论上可以但实际操作很麻烦。PEX 提取出来的是 RC 网络尤其电源网络节点多、电阻分散你想看的“A 点到 B 点的总等效电阻”并不会直接写在网表里得自己重建简化网络或者拿 SPICE 仿真器算静态工作点再拿电压差除电流。这一套下来光准备提取环境就要折腾半天而且 PEX 的提取规则往往比你想要的 PERC 规则复杂得多动不动就提取出一堆耦合电容处理起来又慢又重。而 PERC 里的电阻提取思路很直接我不管你整张网表有什么我只看你指定的这两个点把连接这两点的所有导电路径求个并联等效输出一个总的电阻值再给你把每条路径按金属层、通孔拆开。它不需要你额外建一套复杂的 RC 提取环境很多 PDK 本身就会提供 PERC 相关的 rule 文件直接用就行。精度上虽然不能替代完整的 3D 寄生提取但用于前期设计评估、可靠性筛选、DRC 前后对比完全够用。2. 开始之前的准备文件、环境和坐标2.1 输入文件清单xvref 听起来像一个独立功能其实它在 Calibre 安装目录下就是一个可执行程序一般在$MGC_HOME/bin/xvref。你不需要专门打开某个图形界面直接命令行就能跑。准备的东西也不多我列一个清单输入项说明备注版图文件GDSII 或 OASIS比如 top.gds规则文件定义了参与计算的金属层、通孔、方阻值PDK 提供的 PERC 规则或自己精简的规则网络名两个点所在网络的名字如果版图上没有 text label也可以不指定点坐标两个物理位置的坐标必须用数据库单位这是最容易踩坑的地方输出文件结果要写到哪个路径指定一个文本文件即可网络名这一步值得多说一句。xvref 在找点时会根据版图上这一层的 text label 来判断点属于哪个网络。如果你的版图 GDS 里没有打 text label或者 text 层被压掉了那么即使坐标是对的它也可能报“找不到点所在网络”。我建议在需要抽电阻的网络关键节点上提前放好 metal label这不仅对 xvref 友好后面做 LVS 或者 debug 版图时也有用。2.2 database unit 换算是一个大坑坐标换算是新手最容易翻车的地方。版图工具界面里显示坐标通常是微米um比如你在 Virtuoso 里用 ruler 一量看到某个点的位置是 (123.456, 78.910)单位是 um。但 xvref 的-point1和-point2参数要求的是数据库单位database unit。数据库单位是多少呢取决于你版图库的精度设置。绝大多数工艺库 database unit 是 0.001 um也就是 1 nm所以界面显示的坐标乘以 1000才是能直接喂给 xvref 的数值。比如上面那个点就应该写成123456 78910。如果 database unit 是 0.0005 um也就是 0.5 nm那就要乘以 2000。怎么确认方法很简单用 Calibre RVE 打开版图在信息栏能看到 database units 的设置或者直接问一下后端同事“咱们这个库 database unit 是多少”多数人张口就能告诉你。千万别想当然我曾经遇到过一次整个 DRC 流程都正常结果 xvref 报坐标不在网络上排查了半天才发现坐标少乘了 5 倍点都偏到十万八千里外去了。2.3 规则文件里的方阻定义xvref 要算出电阻必须知道每一层金属、poly、扩散区的方块电阻以及通孔的电阻。PDK 提供的 PERC 规则里通常已经写好了这些定义。如果没有现成规则自己写一个精简版本也是可行的里面核心就是 SVRF 语法里的 LAYER 定义和 RESISTANCE 声明。下面是一个示意性的规则片段注意具体语法要参照你用的 PDK这里只是说明思路// 层定义 LAYER M1 M1 LAYER M2 M2 LAYER V12 V12 LAYER POLY PC // 方块电阻单位 ohm/sq RESISTANCE M1 0.078 RESISTANCE M2 0.039 RESISTANCE POLY 8.0 // 通孔电阻单位 ohm/个 RESISTANCE V12 2.5实际项目里金属的方阻还和宽度、温度有关所以严谨的规则会写成查表形式。但对于前期快速评估固定一个典型值完全够用。我建议把常用金属层、poly、diffusion 的方阻值都维护进一份公共规则文件里以后谁要抽电阻都能直接复用省得每次去找 PDK 文档翻电阻率表。3. 命令行实战一步步抽出两点电阻3.1 xvref 命令的基本用法xvref 最核心的参数就那几项我用一个实际命令来说明xvref -p2p \ -design top.gds \ -rules perc_res.rules \ -net VDD_M3 \ -point1 123456 78910 \ -point2 150000 80000 \ -out p2p_res.txt \ -mark逐个解释一下-p2p进入 point-to-point 模式这是计算两点电阻的开关。-design指定版图文件GDS 或 OASIS 都行。-rules指定规则文件就是上一节说的那个。-net指定网络名。如果版图上 text 层明确通常可以不加但我建议加上能避免误判。-point1和-point2两个点的坐标按数据库单位填x 和 y 之间用空格隔开。-out输出文件路径。-mark有这一步结果会自动生成一个可以在 Calibre RVE 里打开的标记文件你在图形界面里能直接看到它算出的最短路径非常直观。不同 Calibre 版本对参数名称细节会有一点点差异所以拿到一个新环境后最好先敲一句xvref -help扫一眼确认。3.2 从版图工具里取坐标的正确姿势取坐标看起来简单但姿势不对会浪费很多时间。我最常用的是 Virtuoso直接在版图窗口里打开 Query 工具点击目标位置就能看到坐标单位是 um。如果你习惯用 ruler更是直接量两点坐标差但要注意别把相对距离当成绝对坐标。还有一个我比较推荐的办法用 text label 定位。你可以在版图上需要抽电阻的位置放一个特定层的小 label然后告诉 xvref 用这个 text 层来定位就不用手动去抄坐标了。具体做法是在规则文件里指定-text参数并配合-inversetext来开关 text 层的正反逻辑。这样做的好处是版图发生位移或者旋转时只要 label 跟着走坐标就不会错适合在自动化脚本里批量跑。如果你用的是 Calibre RVE它可以从 DRC/PEX 结果里 cross probe 到版图坐标那个坐标系统通常会和数据库单位一致用起来更省心。KLayout 用户的话界面上也能显示坐标但一定要先确认它显示的单位。3.3 一个完整实例跑通全流程我拿一个简化的案例带你走一遍。假设一条 M3 走线宽度 1.5 um长度 20 um从点 A 到点 B中间经过两个 vias点 A 坐标是 (123.456, 78.910) um点 B 坐标是 (150.000, 80.000) um数据库单位是 0.001 um。第一步换算坐标point1 123456 78910point2 150000 80000第二步规则文件里 M3 方阻设为 0.039 ohm/sq单个 via 设为 2.5 ohm。这里 via 数量假设是 2 个实际版图可能是多个 via 并联电阻会相应变小xvref 会自动计算并联效果。第三步跑命令xvref -p2p \ -design top.gds \ -rules perc_res.rules \ -net VDD_M3 \ -point1 123456 78910 \ -point2 150000 80000 \ -out p2p_res.txt第四步看输出。正常结果类似于Net: VDD_M3 Point1: (123456,78910) Point2: (150000,80000) Total Resistance 0.623 ohm Segment breakdown: Layer M3 : 0.520 ohm Layer V12 : 0.103 ohm我们来做个手算校验。如果这段走线是完整均匀的 M3长度 20 um宽度 1.5 um那么方块数为 20 / 1.5 ≈ 13.33电阻就是 13.33 × 0.039 ≈ 0.52 ohm正好和输出里的 M3 贡献对上了。通孔部分假设两个 via 并联单孔 2.5 ohm那并联后是 1.25 ohm但实际抽取结果 0.103 ohm 说明版图里 vias 数量更多或者通孔周围金属扩展形成了额外并联路径这就是版图抽取比手算值准确的地方——它连通孔阵列的并联效应都给你算得明明白白。看到这个结果你是不是觉得比自己拿计算器敲半天踏实多了4. 结果怎么读怎么验证才靠谱4.1 读懂输出文件里的关键字段xvref 输出的文本文件除了总电阻之外最重要的一段是 Segment breakdown也就是分段统计。这段信息对定位问题是黄金级别的帮助因为你可以直接看出是哪一层金属贡献了主要电阻。举个例子如果输出里显示 Poly 层贡献了 1.2 ohm而金属 M1 只贡献了 0.01 ohm那说明问题很可能出在 poly 走线太长或者是到电阻两端的 poly 头没处理好。这种信息在手算时很难直观获得但 xvref 直接给你拆开了。还有一些版本会输出路径上的坐标点列表你把它们导入版图就能看到抽出的路径实际走了哪条线。路径合理结果才可信。如果路径绕了远路往往是 text 层带错了网络或者规则文件里层的连接关系没定义清楚。4.2 用什么方法交叉验证结果工具给出的数字再漂亮也得经过验证才敢写进报告里。我通常做两层验证。第一层是“看量级”就是用方阻公式手算一个大概范围。比如一段 10 um 长、1 um 宽的 M1方阻 0.078 ohm/sq那这段贡献就是 0.78 ohm加上通孔总电阻应该在 1 ohm 上下。如果 xvref 输出个 0.001 ohm那一定有问题要么坐标没落在同一网络上要么规则文件里有层没参与计算。第二层是“看路径”用-mark生成的结果在 RVE 里打开人工检查路径是否走的是你预期的那条线。如果 A 到 B 之间明明有一根 20 um 的细走线但结果路径却是绕着 dummy 走了 200 um那就说明网络连接关系有意外可能 dummy 金属把两个不该连的区域连起来了。这种问题纯粹靠手算是绝对发现不了的所以路径可视化的意义就在这。4.3 复杂路径和多路径并联的处理真实版图里A 点到 B 点往往不止一条通路。比如电源网络既有 M4 主干又有 M3 的辅助走线中间还打了一堆 vias 并联那么点到点电阻实际是这多条路径的并联等效。xvref 的输出会把总电阻算成多条路径的并联值而且每条路径的电阻也会分别列出来。这种场景下我建议先看总电阻是否满足约束再逐条看各路径占比。通常你会发现占主导的永远是又窄又长的那一层金属这正好给你优化方向加宽它或者多加 vias效果立竿见影。有一次我处理一条 ESD 路径原来的总电阻有 5 ohm用 xvref 一看90% 的电阻都来自一段 3 um 宽的 M2后来把那段改成双层层叠走线总电阻直接降到 1.2 ohm整个过程不到半天放以前得花两三天反复算。5. 常见问题排查与避坑技巧5.1 典型问题速查表我在最初几次用 xvref 时几乎把所有能踩的坑都踩了一遍。这里整理一张速查表遇到问题可以直接对照现象常见原因处理方法报错 Point is not on net坐标单位没换算或坐标点落在异形图形空洞里确认 database unit重新取点总电阻为 0两点距离太近直接通过同一大块金属短路或者网络名错误用 -net 明确指定网络检查两点是否分开结果比手算小好几个量级电阻计算时把某层设成了 0 电阻或层之间被金属大面积桥接检查规则文件里 RESISTANCE 定义结果比手算大很多路径绕了远路可能网络被 dummy 意外连接用 -mark 打开路径可视化检查走向找不到网络版图缺少 text label或 text 所在层被排除补 label或指定 text 层跑了大半天没出结果版图太大且没有限定计算层加 -layer 限制参与计算的层范围5.2 坐标点了却报“不在网络上”这个报错我碰到过很多次。第一次是单位没换算坐标差了 1000 倍点直接漂到空白区域自然不在网络上。第二次是坐标落在了一条极窄的走线边缘因为精度问题没有和图形完全重合也会报错。解决办法是取点时尽量取走线中间的位置同时保证坐标值已经正确换算成数据库单位。如果你用的是 text label 定位还要检查 text 层是否和金属层有足够的交叠面积xvref 通常认为 text 必须落在同一层图形上才能识别。5.3 电阻为 0 或者小得离谱电阻为 0 的情况通常不是真的零电阻而是两点通过一个大面积金属平板连接了起来。大面积金属的方块电阻虽然不为零但宽度太宽导致总电阻趋近于 0。比如一个 100 um × 100 um 的 M1 平板如果两点都点在这个平板上实际电阻可能只有 0.0001 ohm 量级显示出来就接近 0。这种情况不一定是 bug但你要思考自己到底想量什么。如果真想量一条窄走线的电阻就一定要让两个点落在窄走线的两端而不是某一大块金属区里。取点之前先看一眼版图确认你给的两点之间确实隔着一段“可分辨”的导体路径。5.4 想批量抽几十对点怎么办单个点对点抽很容易但实际项目里可能一下要评估几十条路径比如检查所有 IO 到地的 ESD 电阻。这时候一条条手动敲命令太慢了我一般写一个简单的脚本循环。你只需要准备一张文本表每行列出版图名、网络名、point1 坐标、point2 坐标然后脚本逐行调用 xvref并把每个输出文件归档。脚本用 bash、Python 都可以核心就是拼命令行。另外xvref 也可以直接嵌入到 PERC 规则流程里通过 PERC 的脚本语言在工具内部调用。这样做的好处是你在一个环境里同时跑 DRC 和点对点电阻检查结果统一输出到一份 PERC 报告里。不过这种方式对 rule 文件写法有一点门槛我建议先把命令行版本跑通再考虑做流程集成不然 debug 起来会比较痛苦。5.5 我的几个独家心得最后分享几点经验。第一规则文件里的方阻值一定要和 PDK 版本对应不同金属层、不同厚度的方阻差别很大我见过有人拿上个项目的规则文件套新工艺结果抽出来的电阻普遍偏小一半排查了很久才发现是金属层定义没更新。第二不要忽视温度对电阻的影响。芯片工作温度高时金属电阻率会上升铝比铜更明显。如果你评估的是大电流路径最好用高温下的方阻值否则抽出来的电阻会比实际工作条件乐观。第三通孔电阻不要想当然。单个 via 的电阻和它的尺寸、材料、上下金属堆叠都有关PDK 文档里一般会给典型值。如果版图里是通孔阵列并联效应非常明显我建议不要手算直接交给 xvref它在处理通孔阵列并联方面很靠谱。第四也是最重要的一点不管工具算出来多漂亮最终一定要回到版图里看一眼路径。工具再聪明也不如你的眼睛判断“这段走线是不是真如预期”。尤其是那些被自动填充的 dummy 金属意外连接的路径只有亲眼看到路线图你才敢把这个电阻值写进报告里。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门