4. DRC违例分析与修复实战

DRC(Design Rule Check)违例分析不是“看到红叉就改”的机械操作,而是一条从规则语义理解、违例定位、根因判断到修复验证的完整闭环。模拟版图中最常见的四类违例是间距(Spacing)、宽度(Width)、包围(Enclosure)和密度(Density)。本节以 Virtuoso Layout Editor 为操作平台,结合 Calibre 或 Assura 的 DRC 结果,逐类展开定位、标记、修复与复验的实际做法。

一、先读懂规则文件,再动手改版图

拿到 DRC 报告后,第一步不是打开版图,而是回到规则文件(如 rule.drc 或 calibre.drc)中确认该条规则的准确语义。以常见的 M1 间距规则为例:

M1.S.1 {
    @ Min M1 spacing = 0.14um
    INTERNAL M1 < 0.14 ABUT < 90 SINGULAR
}

这条规则的含义是:同一层 M1 图形之间,边到边的最小间距为 0.14 μm;ABUT < 90 表示仅检查夹角小于 90° 的相邻边,SINGULAR 表示只报单点违例。理解这些限定词,才能判断违例是真实违规还是规则边界情况。模拟版图中常见的“看似违规、实则被 ABUT 条件排除”的情况,往往就出在这里。

二、四类典型违例的定位与标记

在 Virtuoso Layout Editor 中,推荐使用“报告驱动定位法”:先打开 DRC 结果文件(*.sum 或 *.results),用 Shift+R 调出 RVE(Results Viewing Environment),双击某条违例,版图会自动缩放并高亮到对应坐标。此时应立即用 Create → Marker 或快捷键 M 在该位置放置一个带编号的标记,编号与 DRC 报告中的违例序号一致,便于后续逐条闭环。

四类违例的典型特征如下:

  • 间距违例:两条同层金属或不同层金属之间距离小于规则值。常见于差分对走线、电源地线并行区域。定位时注意区分“边到边”与“角到角”间距,规则文件中的 INTERNAL 与 EXTERNAL 分别对应同层和异层。
  • 宽度违例:单条金属或通孔宽度小于最小宽度。模拟版图中细长走线、电流镜支路容易触发。需注意规则中是否区分 MIN WIDTH 与 MIN WIDTH (WITH HOLE)。
  • 包围违例:接触孔(Contact/Via)被上下层金属包围不足,或栅极被有源区包围不足。典型如 M1 ENCLOSURE OF VIA1 >= 0.03um,修复时需同时调整上下层金属的延伸量。
  • 密度违例:某层图形密度低于或高于规则窗口要求。常见于大块空白区域或局部金属过密。密度规则通常带窗口尺寸,如 DENSITY M1 >= 25% WINDOW 100um,修复时需在空白区填充 dummy 图形或调整布局。

三、修复策略与操作要点

间距违例的修复优先级最高,因为它往往影响多个网络。若两条走线间距不足,可先尝试将其中一条整体平移(Edit → Move),平移量取规则值减去当前间距再加 0.01 μm 余量。若平移会破坏其他规则,则考虑局部“缩进”或“绕行”。在 Virtuoso 中可用 Stretch 命令配合 F3 精确输入坐标,避免鼠标拖拽带来的误差。

宽度违例的修复相对直接:选中违例图形,用 Reshape 或 Stretch 将窄边拉宽至规则值以上。但要注意,拉宽后可能引入新的间距违例,因此每次修改后应局部重新运行 DRC,而不是等全部改完再跑。

包围违例的修复需要同时观察上下层。以 Via1 被 M1 包围不足为例,正确做法是同时扩大 M1 和 M2 的覆盖范围,而不是只改一层。在 Virtuoso 中可打开 Layer Selection 只显示相关层,用 Edit → Modify 调整图形边界。若包围不足发生在阵列通孔中,建议使用 Copy 配合 Array 重新生成,保证每个通孔包围一致。

密度违例的修复通常不涉及功能图形,而是添加 dummy 填充。在 Virtuoso 中可使用 Create → Dummy 或调用 foundry 提供的填充脚本。填充时需注意 dummy 图形与功能图形之间仍需满足间距规则,且 dummy 层通常需要单独标记,避免被误认为功能层。密度检查的窗口尺寸和步进必须与规则文件一致,否则填充后仍可能不达标。

每次修改后,建议只对修改区域所在窗口重新运行 DRC,而不是全芯片重跑。Virtuoso 中可用 Verify → DRC → Area 指定矩形区域,大幅缩短验证时间。

四、闭环记录与复验

闭环记录的核心是“违例编号—根因—修改动作—复验结果”四要素对应。建议在版图目录下维护一份 drc_fix_log.csv,字段包括:违例编号、规则名、坐标、类型、根因描述、修改动作、修改人、复验状态。每次复验后更新状态为“Pass”或“Fail”,Fail 的条目必须重新进入分析流程。

复验时,先清除旧标记(Edit → Delete → Markers),再重新加载 DRC 结果。若某条违例消失,但相邻位置出现新违例,说明修复动作引入了新问题,需回到定位步骤重新分析。只有所有违例状态均为 Pass,且密度检查在指定窗口内全部达标,才算完成本轮 DRC 闭环。

DRC 违例分析修复闭环流程 ① 规则文件解读 确认间距/宽度/包围/密度 语义与限定条件 ② RVE 定位与标记 双击违例→自动缩放 放置编号 Marker ③ 违例分类判断 间距 / 宽度 / 包围 / 密度 确定根因类型 间距违例修复 Move / Stretch 平移 规则值 + 0.01μm 余量 注意角到角间距 宽度违例修复 Reshape 拉宽窄边 检查 WITH HOLE 条件 局部重跑 DRC 包围违例修复 同步调整上下层金属 阵列通孔用 Array 重建 保证包围量一致 密度违例修复 添加 Dummy 填充 窗口尺寸与规则一致 Dummy 层单独标记 ④ 局部区域 DRC 复验 Verify → DRC → Area 指定矩形 ⑤ 闭环记录更新 编号—根因—动作—复验状态 Fail 重新分析 关键检查点 · 规则限定词 · 修改余量 0.01μm · 窗口尺寸一致 闭环四要素 · 违例编号 · 根因描述 · 修改动作 + 复验状态

整个闭环的关键在于:每次修改后必须重新验证,且验证范围要覆盖修改区域及其邻域。间距、宽度、包围、密度四类违例往往相互耦合——拉宽金属可能触发间距,添加 dummy 可能触发包围,因此不能孤立地看待任何一条违例。只有把“规则语义—定位标记—分类修复—局部复验—记录更新”串成一条可追溯的链路,DRC 修复才真正具备签核意义。