共计 1883 个字符,预计需要花费 5 分钟才能阅读完成。
为什么需要学习 Skill 脚本?
在 IC 设计领域,Cadence Virtuoso 是业界标准的版图设计工具。但实际工作中,我们经常遇到需要重复操作的情况,比如批量修改器件参数、自动布局布线、DRC 检查等。这时候,Skill 脚本就能大显身手了。

Skill 是 Virtuoso 内置的脚本语言,它可以帮助我们:
- 自动化重复性工作,提高设计效率
- 实现复杂的设计规则检查
- 与 PDK 深度集成,扩展工具功能
- 创建自定义的用户界面
相比于手动操作,使用 Skill 脚本可以节省大量时间,减少人为错误,特别适合需要反复迭代的设计流程。
基础语法快速上手
1. 变量与数据类型
Skill 是动态类型语言,变量不需要声明类型。常见数据类型包括:
; 定义变量
x = 10 ; 整数
y = 3.14 ; 浮点数
str = "Hello Skill" ; 字符串
lst = list(1 2 3) ; 列表
sym = 'symbol ; 符号
2. 函数定义与调用
定义函数使用 procedure 关键字:
procedure(addTwoNumbers(a b)
a + b ; 返回值是最后一个表达式的值
)
; 调用函数
sum = addTwoNumbers(5 7)
3. 控制流程
条件判断和循环语句:
; if 语句
if( x > 10 then
printf("x 大于 10")
else
printf("x 小于等于 10")
)
; for 循环
for(i 1 5
printf("当前值:%d" i)
)
; while 循环
count = 0
while( count < 5
printf("计数:%d" count)
count++
)
实战案例:自动创建 MOS 管阵列
让我们通过一个实际案例来学习 Skill 脚本的应用。假设我们需要在版图中创建 5×5 的 MOS 管阵列。
procedure(createMosArray()
let((cellView libName cellName techFile mosParams inst)
; 获取当前设计环境
cellView = geGetEditCellView()
libName = cellView~>libName
cellName = cellView~>cellName
techFile = techGetTechFile(libName)
; MOS 管参数设置
mosParams = list(list("model" "nch")
list("w" 1u)
list("l" 0.18u)
list("fingers" 1)
)
; 创建 5x5 阵列
for(row 0 4
for(col 0 4
; 计算位置
xPos = col * 5u
yPos = row * 5u
; 创建 MOS 管实例
inst = dbCreateParamInst(
cellView
techFile
"mos"
sprintf(nil "M%d_%d" row col)
list(xPos:yPos)
"R0"
mosParams
)
; 添加连线(示例)when(inst
dbCreateRect(
cellView
"metal1"
list(xPos:yPos (xPos+1u):(yPos+1u))
)
)
)
)
printf("MOS 管阵列创建完成!")
)
)
常见问题与调试技巧
1. 脚本加载失败
- 检查文件扩展名是否为
.il - 确保文件路径正确
- 使用
load()函数加载脚本
2. 变量未定义
; 错误示例
printf("Value: %d" undefinedVar)
; 正确做法
when(boundp('undefinedVar)
printf("Value: %d" undefinedVar)
)
3. 对象操作错误
操作版图对象时,先检查对象是否存在:
when(obj = dbFindObjByName(cellView "instName")
; 安全操作对象
obj~>width = 2u
)
性能优化建议
- 批量操作 :尽量减少单个操作,使用
dbReplaceProp替代多次dbAddProp - 缓存查找结果:重复使用的对象应该缓存起来
- 避免嵌套循环:在版图操作中,深层嵌套循环会显著降低性能
- 使用事务 :大批量修改时,使用
dbOpenChangeGroup和dbCloseChangeGroup
生产环境部署注意事项
- 版本兼容性:不同 Virtuoso 版本的 Skill API 可能有差异
- 错误处理:关键操作需要添加错误捕获
- 日志记录:重要操作记录到日志文件
- 权限管理:脚本应遵循最小权限原则
进阶练习
- 修改上面的 MOS 管阵列脚本,使其支持参数化配置(行数、列数、尺寸等)
- 尝试为阵列自动添加电源和地线
- 实现一个 DRC 检查脚本,自动标记版图中所有间距违规的区域
希望这篇指南能帮助你快速入门 Skill 脚本开发。记住,最好的学习方式就是动手实践。遇到问题时,多查阅 Cadence 官方文档和社区论坛。Happy scripting!
正文完
