共计 1910 个字符,预计需要花费 5 分钟才能阅读完成。
背景介绍
在模拟版图设计领域,skill 语言是 Cadence 平台的核心脚本语言。它直接与 Virtuoso 等工具集成,能够高效地实现版图自动化操作。skill 语言的优势主要体现在以下几个方面:

- 直接操作版图数据库,无需中间文件转换
- 支持复杂的数据结构处理
- 提供丰富的 EDA 工具 API 接口
- 执行效率高,适合大规模版图处理
对于模拟版图工程师来说,掌握 skill 语言可以大幅提升工作效率,特别是在重复性任务处理、批量修改和设计规则检查等场景中。
基础语法
变量定义
; 定义变量
width = 0.18 ; 工艺最小线宽
layer = "metal1" ; 层名定义
flag = t ; 布尔值(true)
流程控制
- 条件判断
if(width < 0.18 then
printf("警告:线宽小于工艺最小值!")
else
printf("线宽符合要求")
)
- 循环结构
; for 循环示例
for(i 1 10
printf("当前值:%d" i)
)
; while 循环示例
count = 0
while(count < 5
count++
printf("计数:%d" count)
)
函数定义
procedure(createRect(layer width height)
; 创建矩形
rect = dbCreateRect(layer list(0:0 width:height))
rect
)
实战应用
示例 1:自动创建标准单元
procedure(autoCreateCell(cellName width height)
; 创建新单元
cellId = dbCreateCell(cellName)
; 创建金属层图形
metal1Rect = dbCreateRect("metal1" list(0:0 width:height))
; 创建接触孔
for(i 0.5 width 1.0
for(j 0.5 height 1.0
dbCreateRect("contact" list(i-0.1:j-0.1 i+0.1:j+0.1))
)
)
printf("单元 %s 创建完成" cellName)
)
示例 2:批量修改线宽
procedure(batchModifyWidth(layerName newWidth)
; 获取当前版图中所有图形
shapes = geGetAllShapes()
; 遍历修改
foreach(shape shapes
when(shape~>layerName == layerName
dbSetWidth(shape newWidth)
)
)
printf("已完成 %d 个图形的线宽修改" length(shapes))
)
示例 3:DRC 违规自动修复
procedure(autoFixDRC()
; 运行 DRC 检查
drcErrors = drcCheckAll()
; 处理间距违规
foreach(error drcErrors
when(error~>type == "spacing"
; 自动调整图形位置
dbMove(error~>shape 0.1:0.1)
)
)
printf("已修复 %d 个 DRC 错误" length(drcErrors))
)
性能优化
- 减少数据库访问:批量操作优于单次操作
; 不推荐方式
foreach(shape shapes
dbModify(shape)
)
; 推荐方式
dbModify(shapes) ; 一次处理所有图形
- 使用高效数据结构:列表优先于数组
; 创建列表比数组更快
points = list(0:0 1:0 1:1 0:1)
- 避免嵌套循环:必要时使用内置函数
; 使用 dbSearch 代替手动遍历
metal1Shapes = dbSearch("metal1")
避坑指南
- 变量作用域问题
; 错误示例
procedure(test()
var = 1 ; 局部变量
)
printf("%d" var) ; 报错:var 未定义
; 正确做法
globalVar = nil ; 先声明全局变量
procedure(test()
globalVar = 1
)
- 字符串比较注意大小写
; 字符串比较要区分大小写
when(layerName == "METAL1" ...) ; 与 "metal1" 不匹配
- 忘记释放内存
; 大量数据处理后手动释放
shapes = nil ; 释放变量
进阶建议
- 官方文档:Cadence 提供的 SKILL Language User Guide
- 内置帮助:Virtuoso 中使用
help命令查看函数说明 - 社区资源:Cadence Support Community 论坛
- 实践项目:从简单脚本开始,逐步实现复杂功能
思考与实践
- 尝试编写一个 skill 脚本,自动为版图中所有晶体管添加保护环
- 思考如何优化一个处理百万级图形的 skill 脚本性能
- 实践将常用 skill 功能绑定到 Virtuoso 菜单栏
掌握 skill 语言需要不断实践,建议从实际工作需求出发,逐步积累脚本库,最终实现高效的设计自动化流程。
正文完
