DRC错误速查:Metal Spacing违规怎么修?
DRC错误速查:Metal Spacing违规怎么修
在IC版图设计中,DRC(Design Rule Check)是确保版图可制造性的基本验证步骤。Metal Spacing(金属间距)违规是最常见的DRC错误类型之一。当两条金属走线之间的距离小于工艺规定的最小间距时,就可能在制造过程中产生短路缺陷。本文将详细介绍5种修复Metal Spacing违规的方法,并提供实用的SKILL代码示例和预防技巧。
什么是Metal Spacing规则?
Metal Spacing规则规定了同一金属层上两个图形之间必须保持的最小距离。以TSMC 180nm工艺为例:
| 金属层 | 最小间距(MinSpacing) | 说明 |
|---|---|---|
| Metal 1 (M1) | 0.23 μm | 最内层金属,间距最小 |
| Metal 2 (M2) | 0.28 μm | 第二层金属 |
| Metal 3 (M3) | 0.28 μm | 第三层金属 |
| Metal 4 (M4) | 0.28 μm | 第四层金属 |
| Metal 5 (M5) | 0.40 μm | 较厚金属,间距更大 |
| Top Metal (M6) | 0.80 μm | 最厚金属,间距最大 |
注意:实际的Spacing规则可能更加复杂,包括相同Net和不同Net的不同规则、Width-dependent Spacing(与线宽相关的间距规则)以及Paragraph Metal Spacing等特殊规则。
修复方法一:移动金属线(Move Wires)
最直接的修复方法是移动违规的金属线,使其与相邻金属线之间的间距满足DRC规则。
操作步骤:
- 在Virtuoso Layout Editor中,使用
Move命令(快捷键M) - 选中需要移动的金属图形
- 按住Shift键进行正交移动(Orthogonal Move)
- 使用Ruler工具测量移动后的间距,确保满足MinSpacing要求
SKILL代码 - 批量检查并标记Metal Spacing违规:
; checkMetalSpacing.il - 检查指定层的Metal Spacing违规
procedure(checkMetalSpacing(cv layerName minSpacing)
let((violations count)
violations = 0
count = 0
; 遍历该层的所有图形
foreach(fig cv~>layerName~>figures
count = count + 1
)
printf("在层 %s 上共找到 %d 个图形\n" layerName count)
; 使用geomGetCombinations检查间距
geomGetCombinations(
list(cv~>layerName)
nil ; 所有图形对
minSpacing
'spacing
?callback (lambda((fig1 fig2 dist)
violations = violations + 1
printf(" 违规 #%d: 间距 %.4f μm < %.4f μm\n" violations dist minSpacing)
)
)
printf("共发现 %d 处Spacing违规\n" violations)
)
)
; 调用示例:检查M2层,最小间距0.28μm
; checkMetalSpacing(cv "Metal2" 0.28)
修复方法二:改变走线层(Change Routing Layer)
当空间受限无法移动金属线时,可以将其中一条走线切换到其他金属层,从而避免同一层的Spacing违规。
操作步骤:
- 选中需要修改的走线段
- 使用
Change Layer命令或手动删除后在新层重绘 - 在层切换处添加Via连接
- 验证新路径是否引入其他DRC违规
适用场景:
- 两根走线在局部区域过于密集,但在其他区域有足够空间
- 上层或下层金属有可用的布线通道
- 走线对寄生参数不敏感,层切换引入的额外Via寄生可以接受
SKILL代码 - 在两条走线间插入层切换:
; insertLayerChange.il - 在指定位置插入Metal层切换和Via
procedure(insertLayerChange(cv x y fromLayer toLayer viaLayer)
let((wireWidth viaSize)
wireWidth = 0.28 ; μm
viaSize = 0.26 ; μm,根据工艺规则设定
; 在切换点添加Via
dbCreateRect(cv viaLayer
list(x:viaSize/2 y:viaSize/2 x+viaSize/2 y+viaSize/2)
)
printf("在 (%.3f, %.3f) 插入了层切换 Via: %s -> %s\n"
x y fromLayer toLayer)
)
)
修复方法三:减少走线宽度(Reduce Wire Width)
在某些情况下,违规是由走线过宽导致的(宽金属线的Spacing规则通常更大)。减小走线宽度可以降低Spacing要求。
注意事项:
- 减小线宽前必须确认新宽度满足MinWidth规则
- 对于承载电流的走线,减小宽度会增加电流密度,需验证EM规则
- Width-dependent Spacing规则下,减小宽度可能直接解决Spacing违规
- 使用
Stretch命令(快捷键S)可以方便地修改走线宽度
SKILL代码 - 批量调整违规走线宽度:
; adjustWireWidth.il - 将指定层超宽走线调整为目标宽度
procedure(adjustWireWidth(cv layerName maxWidth)
let((adjustedCount)
adjustedCount = 0
foreach(fig cv~>layerName~>figures
let((bbox w h)
bbox = fig~>bBox
w = xCoord(cadr(bbox)) - xCoord(car(bbox))
h = yCoord(cadr(bbox)) - yCoord(car(bbox))
; 检查是否为水平走线且宽度超过限制
when(h > maxWidth
; 调整高度(垂直方向压缩)
fig~>bBox = list(
list(xCoord(car(bbox)) yCoord(car(bbox)))
list(xCoord(cadr(bbox)) yCoord(car(bbox)) + maxWidth)
)
adjustedCount = adjustedCount + 1
)
)
)
printf("共调整了 %d 条超宽走线\n" adjustedCount)
)
)
修复方法四:添加Jog或Step(Jog/Step Routing)
当两条平行走线在某处间距不足时,可以通过添加Jog(锯齿形弯折)或Step(台阶形偏移)来增加局部间距。
操作方法:
- 在间距不足的位置,将走线向外偏移一段距离
- 偏移段的长度应足够覆盖违规区域
- 偏移后恢复原始走线方向,形成Jog或Step形状
- 确保Jog/Step的所有转角都满足MinSpacing
SKILL代码 - 自动添加Jog修复Spacing违规:
; addSpacingJog.il - 在违规位置自动添加Jog
procedure(addSpacingJog(cv layerName jogLength jogOffset)
let((jogCount)
jogCount = 0
; 遍历所有违规点
; 实际使用时需要结合DRC报告中的违规位置
printf("Jog参数: 长度=%.3f μm, 偏移=%.3f μm\n" jogLength jogOffset)
printf("注意: 此脚本需要与DRC工具配合使用\n")
; 示例:在(x, y)处添加Jog
; dbCreateRect(cv layerName
; list(x y x+jogLength y+jogOffset)
; )
printf("共添加了 %d 个Jog\n" jogCount)
)
)
修复方法五:使用Dummy Fill调整间距(Dummy Fill Spacing Adjustment)
在某些情况下,Metal Density规则要求添加Dummy Metal Fill来满足最小密度要求。巧妙地放置Dummy Fill可以帮助调整实际间距。
操作方法:
- 识别Spacing违规区域附近的空白区域
- 在满足Spacing规则的前提下,在空白区域添加Dummy Metal
- Dummy Metal可以起到"占位"作用,防止后续自动Fill工具在不当位置添加金属
- 确保Dummy Metal与信号线之间的间距满足规则
SKILL代码 - 智能Dummy Fill:
; smartDummyFill.il - 在指定区域添加满足Spacing规则的Dummy Fill
procedure(smartDummyFill(cv layerName fillSize spacing x1 y1 x2 y2)
let((fillCount x y)
fillCount = 0
x = x1
while(x + fillSize <= x2
y = y1
while(y + fillSize <= y2
; 检查该位置是否满足与所有现有图形的Spacing
let((canPlace)
canPlace = t ; 默认可以放置
; 遍历现有图形检查间距
foreach(fig cv~>layerName~>figures
let((figBBox)
figBBox = fig~>bBox
; 简化的间距检查
when(geomOverlap(
list(list(x y) list(x+fillSize y+fillSize))
figBBox
spacing
)
canPlace = nil
)
)
)
when(canPlace
dbCreateRect(cv layerName
list(list(x y) list(x+fillSize y+fillSize))
)
fillCount = fillCount + 1
)
)
y = y + fillSize + spacing
)
x = x + fillSize + spacing
)
printf("在区域 (%.3f,%.3f)-(%.3f,%.3f) 中添加了 %d 个Dummy Fill\n"
x1 y1 x2 y2 fillCount)
)
)
预防Metal Spacing违规的技巧
预防总是优于修复。以下是一些在设计阶段就能有效减少Spacing违规的技巧:
- 设置正确的Grid:将Virtuoso的Grid设置为工艺Grid的倍数(如5nm Grid),确保所有图形自动对齐
- 使用约束驱动设计:在Constraint Manager中设置Spacing约束,让工具在绘制时实时提示
- 分层布线策略:使用相邻层交替布线(如M2走水平、M3走垂直),减少同一层的密集走线
- 预留布线通道:在Floorplan阶段就为关键信号预留足够的布线通道
- 定期增量DRC:不要等到设计完成才跑DRC,每隔几小时就运行一次增量检查
- 使用自动化脚本:编写SKILL脚本自动检查高频违规点,提高修复效率
Metal Spacing违规虽然是最基础的DRC错误,但如果不及时处理,累积到后期会严重影响设计进度。掌握多种修复方法并建立良好的预防习惯,是每个版图工程师必须具备的基本功。建议工程师在日常工作中积累自己的SKILL脚本库,将重复性的检查和修复工作自动化,从而将更多精力投入到需要设计判断的关键工作中。