【Skill脚本入门】Virtuoso自动化版图设计从零开始
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
#学习路线
#寄生参数
#版图设计
#电迁移
#运放版图