2. Calibre DRC 基础:DRC规则文件结构、标准规则解读、运行DRC的基本流程

各位工程师朋友,咱们今天来聊聊Calibre DRC。说实话,DRC这东西,刚入行时觉得它就是一堆烦人的规则,跑起来还慢。但干久了你会发现——它其实是芯片流片前的最后一道防线。我见过太多因为DRC没跑干净就贸然tapeout的项目,结果回来一堆短路、断线,那叫一个惨。

好,咱们直接进入正题。这一章,我带你拆解DRC规则文件的结构,看懂那些标准规则到底在说什么,最后捋一遍跑DRC的完整流程。

2.1 DRC规则文件结构

Calibre的DRC规则文件,后缀通常是.drc.rul。你打开一看,密密麻麻的,别慌。它的结构其实很清晰,就像一本操作手册。

我个人习惯把规则文件分成三大块:

  • 头部定义区:声明工艺、单位、层号映射
  • 规则主体区:具体的检查语句
  • 输出控制区:定义报错格式、报告内容

咱们先看一个最简单的规则文件骨架:

// 头部定义
PRECISION 1000
RESOLUTION 5

// 层定义
LAYER M1 1001
LAYER V1 1002
LAYER M2 1003

// 规则主体
@ M1最小宽度检查
M1_WIDTH = WIDTH M1 < 0.18
M1_WIDTH CHECK M1

// 输出
DRC RESULTS DATABASE "drc_results.db"
DRC SUMMARY REPORT "drc_summary.rpt"

嗯,这里要注意:PRECISIONRESOLUTION决定了你所有尺寸的单位精度。我遇到过有人把PRECISION设成100,结果0.18um的宽度检查变成了0.18*100=18,完全不对。所以,这两个参数一定要和工艺文件对齐

2.2 标准规则解读

标准DRC规则,说白了就是工艺厂给你的“设计红线”。你跨过去,芯片就可能出问题。咱们挑几个最常见的来拆解。

2.2.1 最小宽度规则

这是最基础的规则。比如金属线宽不能小于0.18um。为什么?因为太细的线,光刻时容易断,电流一大就烧了。

规则写法:

M1_MIN_WIDTH = WIDTH M1 < 0.18
M1_MIN_WIDTH CHECK M1

我曾经在一个高速接口项目中,为了省面积,把M1线宽压到了0.16um。结果DRC报了一堆错,工艺厂直接打回。后来才知道,那家厂的0.18um工艺,实际光刻裕度只有0.02um,你压到0.16,良率直接掉到60%。

注意:最小宽度规则通常不是单一值。对于电源线、地线,工艺厂会要求更宽的线宽,比如0.5um或1um。别搞混了。

2.2.2 最小间距规则

两条同层金属之间不能靠太近。否则容易短路,或者产生串扰。

规则写法:

M1_MIN_SPACE = SPACE M1 < 0.2
M1_MIN_SPACE CHECK M1

你想想看,为什么间距规则比宽度规则更严格?因为光刻时,两条线的边缘会“糊”在一起。间距不够,就等于短路。

2.2.3 包围规则

比如过孔(Via)被金属包围的尺寸。如果金属包不住过孔,那过孔就容易脱落。

规则写法:

V1_ENC_M1 = ENCLOSURE M1 V1 < 0.1
V1_ENC_M1 CHECK V1

这里有个坑:ENCLOSURE的方向。我记得刚带团队时,有个小伙子把M1和V1写反了,结果检查出来全是假错。所以,第一个参数是包围层,第二个是被包围层,顺序别搞反。

2.2.4 密度规则

这个很多人容易忽略。工艺厂要求每块区域的金属密度不能太低,也不能太高。太低,CMP研磨会不平;太高,容易过腐蚀。

规则写法:

M1_DENSITY = DENSITY M1 100 100 < 0.2
M1_DENSITY CHECK M1

这里的100 100是检查窗口大小,单位是um。我建议你拿到工艺文件后,先看看密度窗口是多少。有的厂用50um,有的用200um,差别很大。

2.3 运行DRC的基本流程

好,规则文件看懂了,咱们怎么跑起来?流程其实就四步,但每一步都有讲究。

  1. 准备输入文件:GDSII或OASIS版图 + DRC规则文件
  2. 设置运行环境:指定工艺库、临时目录、输出路径
  3. 执行DRC命令:命令行或图形界面
  4. 分析结果:看报告、查错误、修版图

咱们重点说说第三步。命令行方式最常用,也最可控。一个典型的命令长这样:

calibre -drc -hier -turbo 4 my_design.gds -rule my_drc_rule.drc

参数解释:

参数含义我的建议
-drc运行DRC模式必选
-hier层次化检查大芯片必开,否则内存爆炸
-turbo 4使用4核并行根据服务器CPU核数设置,别贪多

为什么要用-hier?我试过一次,一个500万门的芯片,不开层次化,跑了48小时还没出结果。开了之后,2小时搞定。说白了,层次化就是只检查顶层和底层之间的连接关系,重复单元只检查一次。

小技巧:跑DRC之前,先用calibre -drc -check_only检查规则文件语法。我见过太多人直接跑,跑一半报语法错,白白浪费几个小时。

2.4 结果分析与常见陷阱

DRC跑完了,会生成一个结果数据库和一个文本报告。你打开报告,会看到类似这样的内容:

Total errors: 152
  M1_MIN_WIDTH: 23
  M1_MIN_SPACE: 45
  V1_ENC_M1: 84

别急着全修。我教你一个方法:先看数量最多的错误类型。因为很多时候,一个大的布局问题会导致成百上千个同类错误。比如V1_ENC_M1报了84个,很可能是一个标准单元库的过孔位置整体偏了。

我曾经遇到过一个案例,M1_MIN_SPACE报了500多个错。我一看,全是同一个模块里的。后来发现是那个模块的电源地线间距设错了。改一个参数,500个错全消。所以,别一个一个修,先找根因

另外,注意假错。有些DRC错误其实是规则文件写得太死导致的。比如某些特殊结构(电感、天线)本来就不需要遵守普通规则。这时候,你需要和工艺厂沟通,申请waiver(豁免)。

核心要点:
  • DRC规则文件 = 头部 + 规则 + 输出,三部分缺一不可
  • 标准规则:宽度、间距、包围、密度,每个都有物理意义
  • 运行流程:准备 → 设置 → 执行 → 分析,层次化检查是性能关键
  • 修错先看根因,别陷入“一个一个修”的陷阱

好了,这一章的内容就到这里。下一章咱们会深入讲如何编写自定义DRC规则,包括条件检查、派生层、以及如何用SVRF语言写出高效的检查语句。到时候我会分享一些我在实际项目中用过的“骚操作”,保证让你大开眼界。

记住,DRC不是用来折磨你的,它是帮你把问题留在tapeout之前。跑一次DRC,省一次流片费,这笔账你算得过来。