
DRC 这东西干过数字后端的人都有体会跑完 PR 和 sign-off 时序之后你以为万事大吉了结果 Calibre 一跑密密麻麻几百条 Violation 摔在你脸上。尤其是 TSMC 12nm 这种成熟但规则又细的工艺节点很多坑和 28nm、40nm 完全不是一个量级。我之前在一个高速接口 IP 的项目里前前后后在 DRC Clean 上耗了将近两周中间踩遍了金属密度、天线效应、通孔封装、阱边界相关的问题。这篇就当是踩坑复盘把这四大类最典型的场景一条一条拆开讲包括现象是什么样的、规则文件里对应的条款在哪、用什么方法修的、以及修完怎么验证希望对正在焦头烂额清 DRC 的朋友有点用。1. 项目背景12nm 工艺的 DRC 为何这么“多事”1.1 TSMC 12nm 工艺节点特点先说节点。TSMC 12nm 严格来说是 16nm FinFET 的改进版官方叫法是 12FFC核心目的就是在保持接近 16nm 性能的前提下把 cost 降下来让它更适合中高端 SoC、AP、基带、GPU 这类对功耗面积敏感的产品。但是工艺“降级”不代表 DRC 规则简化恰恰相反12FFC 的规则文件依然继承了 FinFET 工艺一大堆专属 check比如 Fin 层相关规则、OD有源区的连续性规则、特殊金属层间距、以及双曝光层的 DRC 分组处理。实际跑 Calibre 时你会明显感觉到很多 40nm 时代可以忽略的细节到了 12nm 全部变成硬性检查项。举个最直观的例子M1 的 min area 规则、M2 到 V1 的 enclosure 规则、还有 OD 到 Gate 的延伸规则每一条都卡得很死。更头疼的是 12nm 下有些规则是 conditional条件性的比如“如果面积大于多少则间距必须加大多少”这种组合型规则单独看一条 Violation 你会发现数值只超了零点几纳米但合起来就是过不去。1.2 Calibre 工具与规则文件版本的重要性另外一个容易被新手忽略的坑是 Calibre 版本和 SVRF rule deck 版本的匹配。我那个项目一开始用的是 Calibre 2019 的老版本rule deck 是 TSMC 官方发布的 12nm_12FFC 标准版跑出来一堆莫名其妙的 false violation后来换了 2022 版 Calibre 和配套 rule deck很多误报直接消失了。原因是 TSMC 在不同版本的 DRC rule 里会修正一些 check 的算法特别是对 Fin 层和特殊层的 edge-based check老版本工具对 12nm 的某些 edge 运算支持不完整。提示开工前务必确认 Calibre 版本和 rule deck 版本是同一个 release 配套来的。不要自己随意混搭否则你清 DRC 可能是在清一堆工具误报白费时间。2. 场景一金属密度违例把我卡在 Top Metal 上2.1 现象回放大片空白区域导致 DRC 报 metal density 不足这是我们项目最冤枉也最耗时的一次 Violation。当时做的是一个中规模模块的顶层的金属连线和电源规划因为这块电路主要是几路高速 SerDes 通道很多区域不允许走信号线所以分层之后 top metal 上有大片空白。结果 Calibre 报了一批 metal density 小于规定下限的 violation报错类型类似METAL_DENSITY_01 : metal density (1.2%) minimum (25.0%)25% 是什么概念就是说在以某个窗口比如 100um x 100um为单位扫查时金属图形的覆盖面积占比必须达到 25% 以上否则这片区域就必须填充 dummy metal。这个规则的物理背景是 CMP化学机械抛光工艺的均匀性要求如果大片区域没有金属抛光过程中厚度就会不均匀导致 metal 的电阻、电容和后续光刻对焦都出现偏差。所以代工厂干脆在 DRC 阶段就卡死这个下限。2.2 根因定位fill 模块与手动 block 的配合正常情况下PR 工具像 Innovus 或 ICC2 会在最后阶段自动帮你加 metal fill但问题是这个模块在顶层集成时我们为了控制高速信号的回流路径手动加入了大面积的“no-fill”区块同时还在某些敏感区域加了一堆 shielding 线。结果 fill 工具在填补时没有很好的识别到底哪些区域能填哪些不能填导致大片区域直接留白。我第一次看到这个 violation 还以为是 fill 工具没跑完于是重新补跑了一遍 dummy fill结果发现还是照样报后来查了 fill 配的 keep-out 图层才发现是之前 team 里某位同事在顶层手动画了一个很大的 placement blockage那层的 fill creation 被完全禁掉了但 DRC 不管你是谁画的它只认金属密度不够就不放行。2.3 修复方案Calibre 自动 Fill 与手动 Block 的配合解决金属密度违例的标准做法其实很机械就是两条路一是全自动 Fill如果工具流程本身就是用标准 fill 单元库直接把 keep-out 范围缩小重新跑一遍 fill。二是用 Calibre 自带的 metal fill 功能在 DRC 阶段自动修补不需要改版图直接在 DRC 结果上做“fill generation”。我当时选的是后者在 Calibre rule deck 里打开METAL_FILL_GENERATION相关的 option它会自动找出密度不足的区域然后按照设计规则插入特定尺寸的 dummy 图形。但自动 fill 也要注意几点设定的 dummy 图形间距必须大于最小 metal spacing否则越补越脏。fill 区域不要覆盖到信号线、时钟线和有特殊要求的敏感区域。做完 fill 之后要重新提取寄生参数因为加了金属 dummy 会导致耦合电容变大。经验如果这一层同时还有高速信号穿行别把 fill 的 keep-out 设得太小否则 dummy 与信号线的耦合会带来信号完整性问题这个问题在 SI 仿真里才会暴露极易返工。3. 场景二天线效应 Violation——一根长线引发的栅氧危机3.1 天线效应的物理本质和 DRC 公式天线效应在 FinFET 工艺里比平面工艺更敏感。物理本质是芯片制造过程中金属层还没有完全成型之前暴露在等离子体刻蚀环境中的金属线条会像“天线”一样收集电荷这些电荷通过栅极氧化物放掉一旦积累的电荷密度超过栅氧能承受的阈值栅氧就被打穿或者劣化。由于 FinFET 栅极包裹鳍的三面栅氧面积相对更大但氧化层厚度更薄所以 12nm 工艺下天线检查极其严格。Calibre 检查天线效应的公式本质上是一个比值比较antenna_ratio metal_area / gate_area如果这个比值超过 rule deck 里指定的上限就报出ANTENNA_01之类的 violation。12nm 下这类规则还会对每一层 metal 单独检查因为不同的金属层在制造过程中接触刻蚀环境的窗口时间不同所以在不同层上的天线容忍度也不一样。3.2 排查链路为什么所有初级工程师都会看漏我当时遇到的这个 Violation 藏在几百条报错中间是一个典型的“只看报错不追根因”就会漏掉的场景。Calibre 报的是ANTENNA_01但是点开之后关联的图形是在 M5 层上一根距离很长的 signal trace它连接到一个标准单元的 D 端而这个 D 端直接驱动了后级两个 flop 的栅极。它的问题点在于长走线的金属面积太大在 M5 这一层刻蚀时相当于一个很大的电荷收集面但栅极面积相对小所以比值超了。很多新手修天线效应的方法非常暴力——直接把线加宽。但这不是正解。加宽线会让金属面积更大天线比值更高反而会加重问题。正确排查链路应当是这样打开 Calibre RVE 的 violation 报告找到ANTENNA_01的详细坐标。确认这个 violation 是发生在哪个金属层、哪个栅极连接上。看整条 net 的网络连接判断这条天线电流路径经过哪些层次。对比 rule deck 中这一层的 antenna ratio 上限确认超出的比例。最终决定是用跳层、加二极管还是插 buffer。3.3 修复手段跳层、加天线二极管、插入 buffer 的取舍具体修复办法有三类但要分场景选跳层如果天线比例只超了一点点最便宜的办法是把整条走线的某一段从 M5 换到 M4 或者其他层这样 M5 层上收集电荷的面积就降下来了。这个办法不需要加额外器件对时序影响最小也是我首选的手段。加天线二极管如果跳层解决不了可以在靠近栅极的位置加一个反偏二极管到电源或地。它的原理是给积累的电荷提供一个泄放通道避免电荷集中攻击栅氧。TSMC 12nm 的标准单元库里就有专门的 antenna diode cell命名一般是ANTENNA_*或者DIODE_*。加上之后 DRC 一般直接 clean但代价是面积增加、漏电增加。插入 buffer如果这根 net 本身就是关键路径加 buffer 会改变时序但这个办法本质上通过切断长线来减小单段线的天线面积。不到万不得已我不推荐因为你要重新做时序收敛。我们项目最后用跳层局部加 diode 的组合搞定的。这里有一个特别值得说的点Calibre 报出来的很多 antenna violation 并不是一条完整路径的报错而是只报了最严重的一个 segment修完那一段之后RVE 刷新后可能又会暴露出同一个 net 上的另一段 violation。所以修 antenna 必须修完一轮再重跑一遍循环个两三次才敢说干净。注意某些 rule deck 里 antenna check 分为antenna_fat_metal和antenna_carrier即大块 metal 区域和细线分别用不同检查方式。清 DRC 时如果只关注单根长线大块 metal 区的 antenna violation 是看不出来的一定要在 RVE 里按 cell 和 net 过滤保证每个漏电大的金属图形都被检查到。4. 场景三通孔封装与 Metal 连接违例4.1 现象Vx 到 Mx 的 enclosure 不足与堆叠问题第三个高频场景是通孔相关的 Violation。这类错误的报错信息通常长这样V0.ENCL.M1 : V0 enclosure M1 4.0 nm V0.AREA : V0 area 0.0025 um^2大意就是通孔V0周围必须被 M1 包住一圈包住的宽度不能小于某个值同时通孔本身的面积也有下限。12nm 下通孔层V0、V1、V2、Vx和金属层M1、M2、Mx组合起来会形成各种组合性检查。这类 violation 很多是发生在修了其他东西之后才冒出来的。比如你在修某个 spacing violation 的时候把两条线拉开了一点结果线边距离通孔中心变远了通孔的 enclosure 就不够了。更麻烦的是多层通孔堆叠的情况下V1 和 V2 之间有错位老工程师一看就知道这是 via pillar 的 alignment 问题但新手往往会去手拉线条试图包住通孔最后把整片区域改得乱七八糟。4.2 为什么修一条往往震出一批修通孔封装这类 violation 的难点在于修一条往往引出多条的连锁反应。因为在 12nm 这种密度下任何一层的边缘移动都会同时影响左右两侧相邻图形的 spacing 检查。很多刚接触 12nm 的工程师第一次上手时用 Calibre 的 RVE 直接拖拽图形拖了左边这条线的 edge右边那条线的 spacing 又不过他。所以正确的打开方式不是手拖图形而是从根源上解决如果通孔是处在两个不同 net 的连接处确认两层 metal 的走线方向是否满足通孔焊盘的规划。如果通孔面积不够确认是不是用了单通孔规则有没有要求双通孔。如果 enclosure 不够优先调整上一层 metal 的宽度而不是移动通孔位置。4.3 批量修的方法与检查步骤在实际项目中我一般是这样批量处理第一步先按 error type 分组。Calibre RVE 里按 error type 排序是基本功把所有V*.ENCL.*归到一组按坐标排序看是不是集中在几个局部区域。第二步判断是否是同源问题。如果一组 Violation 都集中在某个 macro 边界或者某个 channel 区域大概率是这个地方的底部走线没有预留好通孔需要的宽度应该回溯到 PR 阶段去看 why 这里会这样布线而不是在 DRC 阶段硬修。第三步真正动手。如果是简单的一两处孤立 violation就直接改线的宽度或者调整通孔的位置但改完之后必须对那个区域单独重新跑一次局部 DRC check确认没有引入新 violation。这中间迭代的效率很重要。我习惯用 Calibre 命令行批量跑calibre -drc -hier -turbo 8 rule_deck.drc -input top.gds -output top.drc.pgp跑完后用 RVE 打开top.drc.pg文件按 error type 分组查看。清 DRC 阶段一天跑几十次是很正常的事所以一定要养成用命令行批量跑、在 RVE 里分层查看的习惯。经验出现在顶层模块引线区的通孔 enclouse 问题百分之六十是 floorplan 阶段给 macro pin 留的空间不够才会逼得布线器把通孔挤到边缘。这种问题如果只靠后段硬修修完一个又冒一个效率极低。建议在做完 floorplan 之后先做一次 pre-route 的 DRC 预跑提前发现引线区空间不足。5. 场景四阱边界与闩锁效应——静默的 Killer5.1 N/P 间距、阱边缘接触与闩锁风险的关系第四类坑最隐蔽但也最致命。它就是跟闩锁效应Latch-up相关的一系列规则。闩锁效应的本质是 CMOS 工艺中寄生 PNPN 结构被意外触发产生低阻抗大电流通路轻则电路功能错误重则烧毁芯片。在 12nm 工艺里TSMC 的 rule deck 通过检查以下几种图形关系来尽量避免闩锁风险同一阱内 N 和 P 的最小间距N/P 有源区到阱边缘的最小间距阱接触well tap与有源区的最小间距不同电位电源和地之间存在的 PNPN 路径上的总距离限制这些检查在 Calibre 报错里往往带着LATCHUP、WELLTAP、OD_SPACING之类的关键字。我在项目里遇到的是一个典型问题某个模拟模块内部把 P 扩散区放到了 N-well 边缘从 DRC 规则看每种图形单独都符合最小尺寸但组合起来 N/P 之间的距离刚好落在闩锁危险区Calibre 直接报了一个OD.NW.ACTIVE.SP类型的严重违例。5.2 DRC 报告解析识别属于 Latch-up 类的规则命脉很多工程师看到这类 Violation 的第一反应是觉得规则太苛刻但如果你真从闩锁原理上理解就会发现TSMC 是在拿 DRC 规则来兜底因为一旦产品量产之后发生闩锁代价是不可逆的。所以你最好别去发呆而是直接去改版图。识别这类规则的命脉是什么两个东西第一找到这个区域里电源和地各自的有源区图形第二理解在这些图形之间需要保留足够长的“阻隔距离”。从底层逻辑看这相当于给 PNPN 寄生结构中间串一个高阻区让它不容易进入正反馈。5.3 正确修法加 Guard Ring、调整接触修复手段优先考虑加 guard ring保护环。Guard ring 的作用是在外部载流子还没到达敏感寄生结构之前就被收集走防止触发闩锁。在 Calibre 里加 guard ring 一般就是画一条围绕敏感区域的 P 或 N 环接到固定的电位上。实际操作中要注意如果敏感区域是 NMOSguard ring 应该是 P 接 GND环绕整个 NMOS 区域。如果是 PMOSguard ring 应该是 N 接 VDD环绕整个 PMOS 区域。Guard ring 不要离有源区太近否则会把 DRC 的 spacing 又带炸建议按照 rule deck 中给出的 minimum ring spacing 留足间距。修完之后要重点关注与 guard ring 重叠的 OD 和 metal 层的连接问题这类修改往往会在局部引入新的OD.SP.*问题。除了加 guard ring还有两个辅助手段一是增加 well tap在有源区旁边多加几组衬底接触让衬底电位更加稳定不容易被外部电流扰动二是调整 N/P 的布局距离把有源区间距拉大牺牲一点面积换取可靠性。我当时处理这个问题时是加了一圈双层 guard ring一层接 VDD 包裹 PMOS一层接 GND 包裹 NMOS中间再用 OD 隔离带隔开最后整块区域的LATCHUP全部干净了。代价是面积增加了将近 5%但好在这是一个模拟辅助模块不影响整体 floorplan。重要修闩锁相关 rule 时一定要同时关注密度规则和天线规则因为加 guard ring 会让局部金属密度变化同时新增的金属环可能改变某个 net 的天线面积导致之前 clean 的 rule 被重新报出。这类连锁反应在 12nm 下非常常见所以每次 Modify 完都要完整重跑整张 C 版图不要只跑局部。6. 从 Violation 到 Clean 的通用策略与我的实操心得6.1 修 DRC 的顺序标准先高频后低频先底层后顶层在项目收尾阶段我形成了一套自己的 DRC 清理顺序虽然不是多复杂但确实帮我省了大量来回跑的时间。总原则概括成十二个字先高频后低频先底层后顶层。为什么先高频因为高频事件往往共享同一个根因。比如一块区域同时报了 20 条 M2 spacing你修完根因后这 20 条会一次性消失效率极高。反过来如果一上来就去抠某条独立的 enclosure 问题可能修半天只消掉一条还容易震出别的错误完全属于低效操作。为什么先底层因为底层的图形是上层图形的基础比如把 M1 的线移了位置上头 M2、V1 可能全都要跟着变。如果你先修顶层底层一改顶层又要重新修第二遍。所以我的习惯永远是从 OD、Poly、M1 开始往上层走。实际操作里我会把 DRC 结果导成文本报告然后用脚本分类统计grep -E M2.SP|M2.ENCL|V1.ENCL top.drc.pgp | sort | uniq -c | sort -nr这样可以一眼看出哪类错误的数量最大、最需要优先处理。6.2 Calibre RVE 的常用命令和高效操作Calibre RVE 界面看起来复杂但真正高频的功能就几个熟练之后清 DRC 的效率能提升一倍以上按 error type 过滤在 RVE 左侧列表里点击某个 rule name所有相应 violation 就会高亮方便快速集中处理。按 cell name 过滤如果某个模块是别人负责的可以直接按 cell 过滤只处理自己负责的范围。“Pan to error”和“Highlight net”选中一条 violation 后按快捷键定位到版图坐标同时高亮关联 net一眼看出整条 net 的连接情况。RVE 里直接做“Skip this rule”如果你确认某个 rule 是 false violation 且已经在 waiver 列表里可以直接 skip避免每次刷新都被同样的信息干扰。命令行跑 DRC 时加-hier参数也很重要。层次化 DRC 比 flat 模式快得多而且跑出来的结果会带着 cell 层级信息方便定位到具体子模块但要注意某些顶层连接相关规则必须 flat 才能完全识别两边的检查范围最好对照规则说明确认一下。6.3 小组协作时 Clean 标准如何统一最后说一个团队协作层面的坑。多个人同时清同一份 DRC 时很容易出现“同一个 Violation 被两个人同时改了结果互相覆盖”的情况或者“我认为 clean 的部分其实只是在我负责的 block 里 clean顶层合并后还有问题”。我们项目的做法是先在 Calibre 报告里按坐标对所有 Violation 编号每个人认领一个坐标区间禁止越界修改。所有修改必须走 ECO 流程修改后在 Comment 里记录修了什么、为什么修这样即使后续有人要 revert 也知道当时的上下文。每轮大改之后项目经理在 clean 前必须把各人分区的结果 merge 到一张 gds再做一次全芯片 DRC 总跑不要只跑自己改过的区域。Clean 的标准也要提前定义清楚是 flat DRC 全部 0 错误还是允许某些 waiver 存在哪些错误的 waiver 是合力共同确认过的waiver 列表要同步到所有成员手里避免有人不知道某些 error 已经被豁免浪费时间去修不该修的东西。我自己经历过的最尴尬的一件事就是帮同事修一条他认为“明明 clean 了但还是报错”的 Violation结果发现他的 Calibre rule deck 版本和另外一个人不一致同一个图形在一台机器上 clean另一台机器上 report 出问题。所以团队里所有成员必须统一使用同一版本的工具和同一版本 rule deck这是后续一切 DRC 讨论的基础没有这个前提所有的“我的 clean 你的 dirty”都是在浪费时间。写在最后一点关于耐心与验证的体会清 12nm 的 DRC说白了就是两个方面一是能不能看懂规则背后的物理意义二是能不能把握住修改之后会不会产生二次问题。很多 junior 工程师带着一腔热血冲进 RVE 里疯狂拖图形结果越拖越乱原因就在于没想清楚“这条规则为什么存在”。金属密度规则是为了 CMP 均匀性天线规则是为了保护栅氧通孔 enclosure 是为了保证连接可靠性闩锁规则是为了避免寄生 PNPN 导通。当你把每一条 check 还原成制造和器件层面的物理需求时修起来才有方向感而不是像无头苍蝇一样乱撞。我自己在这些项目里还有个笨但管用的习惯每修完一个类别的 Violation就在一个文本文件里记一行包括类别、坐标、根因、修法、是否引起二次 Violation。到第二个项目再遇到类似的报错时直接翻历史记录就能找到当时的最优解。这个习惯让我后来越做越快建议你们也试试。如果你现在正卡在某条 12nm 的 DRC 上迟迟过不去不妨先退一步把报错规则名和具体数值记录下来对照 rule deck 里的英文描述先把物理含义搞清楚再动手。这条路径本身就是从一个 Violation 走向 Clean 最快的路。