← 返回首页

【SKILL脚本】Virtuoso SKILL自动化版图:从入门到实战

admin Lv.10 skill 2026-05-29 11:04 👁 493 次浏览

Virtuoso SKILL自动化版图:从入门到实战

SKILL是Cadence Virtuoso的脚本语言,掌握SKILL可以大幅提升版图设计效率。本文从基础语法到实战案例,系统讲解SKILL编程。

一、SKILL基础语法

变量与数据类型

; 变量定义
let((x y z)
  x = 10          ; 整数
  y = 3.14        ; 浮点数
  z = "hello"     ; 字符串
  list(x y z)     ; 列表
)

条件与循环

; 条件语句
if(x > 0
  then printf("正数
")
  else printf("负数
")
)

; 循环
for(i 0 10
  printf("i = %d
" i)
)

; While循环
while(x > 0
  x = x - 1
)

二、版图操作核心函数

创建图形

; 获取当前CellView
cv = getCurrentCellView()

; 创建矩形
dbCreateRect(cv list("M1" "drawing") list(0:0 10:10))

; 创建路径(Purpose, Width, Points)
dbCreatePath(cv list("M1" "drawing") 0.5 list(0:0 10:0 10:10))

; 创建多边形
dbCreatePolygon(cv list("M1" "drawing") list(0:0 10:0 10:10 0:10))

; 创建文本标签
dbCreateLabel(cv list("M1" "label") 5:5 "VDD" "centerCenter" "R0" 0.2)

操作实例

; 放置实例
dbCreateInst(cv "inv" nil "U1" 0:0 "R0")

; 放置数组实例
dbCreateInstArray(cv "inv" nil "U" 0:0 "R0" 4 2 10 10)

; 移动实例
dbMoveFig(inst 5:5)

; 旋转实例
dbRotateFig(inst "R90")

三、自动化Guard Ring脚本

这是版图设计中最常用的SKILL脚本之一:

procedure(addGuardRing(cv bbox layer enc)
  ; bbox: 目标区域边界 list(x1:y1 x2:y2)
  ; layer: Guard Ring层 list("NW" "drawing")
  ; enc: 包围距离
  let((x1 y1 x2 y2 grRect)
    x1 = xCoord(car(bbox)) - enc
    y1 = yCoord(car(bbox)) - enc
    x2 = xCoord(cadr(bbox)) + enc
    y2 = yCoord(cadr(bbox)) + enc

    ; 创建外框
    grRect = dbCreateRect(cv layer list(x1:y1 x2:y2))

    ; 创建内框(挖空)
    dbCreateRect(cv layer
      list((x1+0.2):(y1+0.2) (x2-0.2):(y2-0.2))
      ?operation 'subtract
    )

    printf("Guard Ring added: (%.2f,%.2f) to (%.2f,%.2f)
" x1 y1 x2 y2
    )
  )
)

; 使用示例
cv = getCurrentCellView()
bbox = getBBox(cv)
addGuardRing(cv list("NW" "drawing") 1.0)

四、批量Dummy Fill

procedure(addDummyFill(cv layer region spacing)
  ; 在指定区域添加Dummy填充
  let((x1 y1 x2 y2 x y dummySize)
    x1 = xCoord(car(region))
    y1 = yCoord(car(region))
    x2 = xCoord(cadr(region))
    y2 = yCoord(cadr(region))
    dummySize = 0.5

    for(x x1 x2 spacing
      for(y y1 y2 spacing
        dbCreateRect(cv layer
          list(x:y (x+dummySize):(y+dummySize))
        )
      )
    )
    printf("Dummy fill completed
")
  )
)

五、错误处理

; 使用errset捕获错误
errset(
  (dbCreateRect(cv list("M1" "drawing") list(0:0 10:10))
  t   ; 返回值
  nil ; 错误时返回nil
)

; 错误信息
when(errset(expression)
  printf("Error: %s
" errset.errset)
)

六、实用技巧

  • 使用printf输出调试信息
  • 使用timer函数测量脚本执行时间
  • 将常用函数封装成库,方便复用
  • 使用hiSetBindKey绑定快捷键
  • 脚本文件保存为.il扩展名
#DRC #ERC #Guard Ring #SKILL #SKILL脚本 #Virtuoso #学习路线 #寄生参数 #版图设计 #脚本 #自动化 #运放版图

💬 评论 (0)

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