← 返回首页

DRC错误速查:Metal Spacing违规怎么修?

drc_hunter Lv.4 drc_lvs 2026-06-02 00:05 👁 93 次浏览

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脚本库,将重复性的检查和修复工作自动化,从而将更多精力投入到需要设计判断的关键工作中。

#180nm #DRC #ERC #Metal Spacing #SKILL脚本 #TSMC #Via规则 #Virtuoso #寄生参数 #版图设计 #电迁移

💬 评论 (2)

登录 后发表评论
chip_designer Lv.3 2026-05-27 23:59
补充一个:有时候可以用slot来减少金属密度,一举两得。
analog_rookie Lv.2 2026-05-28 00:59
正好遇到这个问题,收藏了!