3. 设计规则检查(DRC)基础与Pegasus运行环境
DRC(Design Rule Check)是物理验证的第一道关卡,它把代工厂工艺能力翻译成一组可计算的几何约束,再对版图逐层检查。理解DRC,关键不是记住某条规则的名字,而是理解“规则类型—检查对象—违例判据”三者的对应关系,以及Pegasus如何把这些规则组织成可执行的运行环境。
一、DRC基本规则类型
版图由多层几何图形构成,DRC规则本质上是对这些图形的尺寸、相对位置和分布密度施加约束。常见类型可归纳为以下几类:
- 宽度(Width):单层图形自身的最小尺寸。例如M1最小宽度0.05μm,检查的是同一多边形内相对边之间的距离。
- 间距(Space):同层或异层图形之间的最小间隔。同层间距检查两个独立多边形边缘的距离;异层间距(如M1到Via1)则检查跨层图形的关系。
- 包围(Enclosure):某一层必须被另一层覆盖的最小余量。典型如Via1被M1包围0.03μm,判据是外层图形边界到内层图形边界的距离。
- 延伸(Extension/Overhang):图形超出参考边界的长度。例如Poly超出有源区的最小延伸量,常用于保证栅极与有源区的套准余量。
- 密度(Density):单位窗口内某层图形面积占比。CMP工艺要求金属密度落在一定区间,过高会碟形凹陷,过低会侵蚀,因此密度规则通常给出最小值和最大值。
- 面积与计数:最小面积(Area)、最小孔数(Min Hole)、最小台阶(Notch)等,用于约束图形的可制造性。
这些规则在规则文件中通常以“层定义 + 规则语句 + 判据参数”的形式出现。例如一条间距规则会先声明参与检查的层,再给出距离阈值和检查条件(如是否忽略同网节点)。理解规则类型,才能在看到违例时快速判断是尺寸不足、间距过近,还是密度越界。
二、Pegasus运行脚本与规则文件结构
Pegasus是Cadence的物理验证引擎,其运行入口通常是一个运行脚本(runset),配合规则文件(rule deck)完成检查。运行脚本负责指定输入版图、规则文件、运行模式、输出目录和资源参数;规则文件则定义层映射、规则语句和检查选项。
一个典型的Pegasus运行脚本结构如下:
# runset: drc_run.rs
layout = "top.gds"
cell = "TOP"
rule = "tech.drc"
mode = "hierarchical"
threads = 16
output = "./drc_out"
report = "drc.rpt"
summary = "drc.sum"
规则文件通常分为三部分:层定义区、规则检查区、输出控制区。层定义把GDS层号映射为可读名称,规则检查区逐条写出检查语句,输出控制区决定报告格式和违例分类。例如:
# tech.drc
layer M1 4
layer VIA1 5
layer M2 6
# 宽度检查
width(M1) >= 0.05
# 间距检查
space(M1) >= 0.05
# 包围检查
enclosure(VIA1, M1) >= 0.03
# 密度检查
density(M1, window=100um) >= 0.30
density(M1, window=100um) <= 0.70
运行脚本与规则文件分离,便于同一套规则在不同项目、不同工艺节点间复用。实际项目中,规则文件往往由代工厂提供,运行脚本由验证工程师根据项目需求调整。
三、层次化与扁平化模式选择
Pegasus支持层次化(hierarchical)和扁平化(flat)两种检查模式。层次化模式利用版图的层次结构,对重复单元只检查一次,再通过层次引用关系传播结果;扁平化模式则把整个版图展开为单一层次,逐图形检查。
选择依据主要看设计规模和重复度。如果设计中有大量重复的标准单元、存储器阵列或IP模块,层次化模式能显著减少计算量,但要求版图层次结构清晰、单元边界规则一致。如果设计层次混乱、存在大量跨层次图形合并,或者规则本身涉及全局密度、跨模块间距,扁平化模式反而更直接,但内存和运行时间会随版图面积线性增长。
实际工程中常采用混合策略:主体用层次化模式,对少数复杂区域或全局规则单独做扁平化检查。Pegasus允许在运行脚本中通过 mode 参数切换,也支持在规则文件中用 hier 或 flat 关键字对特定规则单独指定模式。
四、多线程与分布式计算资源配置
DRC检查是计算密集型任务,Pegasus支持多线程和分布式两种加速方式。多线程通过 threads 参数控制单机并行度,适合单节点多核环境;分布式通过任务划分把版图切成多个区域,分发给多台机器并行检查,最后合并结果。
配置多线程时,线程数不宜超过物理核数,否则会因上下文切换导致效率下降。一般建议设置为物理核数的70%~90%,留出资源给内存和I/O。例如16核机器可设 threads = 12 到 14。
分布式配置需要指定任务划分方式和机器列表。常见做法是按版图坐标切分,每个区域独立检查,再合并违例报告。配置示例:
# 分布式配置
distributed = true
partition = "grid"
grid_x = 4
grid_y = 4
hosts = "node01 node02 node03 node04"
threads_per_host = 8
分布式检查的关键是任务均衡。如果某个区域图形密度远高于其他区域,会出现“长尾”现象,整体运行时间由最慢的任务决定。因此划分时应尽量让各区域图形数量接近,或对高密度区域单独增加线程。运行结束后,Pegasus会生成合并报告,包含总违例数、分类统计和每个区域的检查状态。