← 返回首页

【Skill脚本入门】Virtuoso自动化版图设计从零开始

skill_writer Lv.3 skill 2026-06-01 16:55 👁 392 次浏览

Virtuoso 自动化版图设计从零开始

手动版图设计耗时且容易出错,本文介绍如何利用 SKILL 脚本和 Virtuoso 内置功能实现版图设计自动化,从基础操作到完整工作流。

自动化的核心价值

  • 减少重复性手动操作,提升效率 3-10 倍
  • 降低人为错误率(漏打 via、label 错误等)
  • 实现设计规则的自动检查和修正
  • 建立可复用的版图模板库

第一步:环境准备

; 在 .cdsinit 或 .skillrc 中加载自定义脚本
load("/home/user/skill/layout_utils.il")

; 设置常用变量
gcvLayoutRules = "/project/rules/layout.rules"
gcvTechFile = "/project/tech/techfile.tf"

第二步:基础自动化函数

自动打 Via

; 在两个金属层之间自动添加 via
procedure(autoAddVia(cv netName metal1 metal2 viaLayer)
  let((netShapes viaList)
    ; 获取 net 在 metal1 上的所有形状
    netShapes = dbFindNetByName(cv netName)
    when(netShapes
      foreach(shape netShapes~>shapes
        when(car(shape~>layer) == metal1
          ; 在形状中心添加 via
          dbCreateVia(cv viaLayer shape~>center "R0")
        )
      )
    )
  )
)

自动对齐器件

; 将选中的器件按网格对齐
procedure(alignToGrid(gridSize)
  let((instList)
    instList = geGetSelectedSet()
    foreach(inst instList
      let((x y newX newY)
        x = xCoord(inst~>xy)
        y = yCoord(inst~>xy)
        newX = gridSize * round(x / gridSize)
        newY = gridSize * round(y / gridSize)
        dbMoveFig(inst list(newX:newY))
      )
    )
  )
)

第三步:参数化单元(PCell)

PCell 是 Virtuoso 自动化的高级形式,通过代码生成参数化的版图单元:

; 定义一个参数化的 MOS 版图 PCell
pcDefinePCell(
  list(ddGetObj("myLib") "nmos_auto" "layout")
  list(
    ("w" "float" 1.0)
    ("l" "float" 0.18)
    ("nf" "int" 4)
    ("addGuardRing" "boolean" nil)
  )
  let((cv fingerWidth totalWidth)
    cv = pcCellView
    fingerWidth = w / nf
    totalWidth = w

    ; 绘制 poly gate
    for(i 0 nf-1
      let((xPos)
        xPos = i * (fingerWidth + 0.2)
        dbCreateRect(cv list("POLY" "drawing")
          list((xPos):0 (xPos+l):totalWidth)
        )
      )
    )

    ; 绘制 OD (active)
    dbCreateRect(cv list("OD" "drawing")
      list((-0.1):(-0.1) ((nf*(fingerWidth+0.2)-0.2)+0.1):(totalWidth+0.1))
    )

    ; 添加 guard ring
    when(addGuardRing
      addGuardRing(cv "P+" 0.5 0.2)
    )
  )
)

第四步:批量处理工作流

; 批量处理一个 library 中所有 cell 的版图
procedure(batchProcessLayout(libName)
  let((lib cells)
    lib = ddGetObj(libName)
    cells = lib~>cells
    foreach(cell cells
      let((cv)
        cv = dbOpenCellViewByType(libName cell~>name "layout" "" "a")
        when(cv
          ; 执行自动化操作
          autoAddPowerRing(cv)
          autoAddGuardRing(cv)
          dbSave(cv)
          dbClose(cv)
          printf("Processed: %s/%s\n" libName cell~>name)
        )
      )
    )
  )
)

第五步:集成到 Virtuoso 菜单

; 添加自定义菜单项
hiCreateMenuItem(
  ?name    'autoLayoutMenu
  ?itemText "Auto Layout Tools"
  ?callback "load("/path/to/auto_layout.il")"
)

hiInsertBannerMenu(
  "Layout"
  'autoLayoutMenu
  nil
)

进阶方向

  • 结合 Python + SKILL 混合编程,用 Python 做复杂计算
  • 集成版图生成器(Layout Generator),输入参数自动生成完整模块
  • 使用 OA(OpenAccess)API 实现跨工具的自动化
  • 建立 CI/CD 流水线,自动运行 DRC/LVS 并报告结果

学习路线:先掌握 SKILL 基础语法 → 学会操作 cellview API → 编写实用工具函数 → 开发 PCell → 建立完整的自动化工作流。推荐参考 Cadence SKILL Language Reference。

#DRC #Guard Ring #LVS #SKILL脚本 #Via规则 #Virtuoso #学习路线 #寄生参数 #版图设计 #电迁移 #运放版图

💬 评论 (0)

登录 后发表评论
暂无评论,快来抢沙发吧!