共计 2102 个字符,预计需要花费 6 分钟才能阅读完成。
1. 行业背景:为什么需要 Skill 语言?
在芯片设计领域,Cadence Virtuoso 等 EDA 工具虽然提供了图形界面,但遇到重复性任务(比如批量修改版图单元、自动化设计规则检查)时,手动操作效率极低。Skill 语言就是 Cadence 生态中的 ” 瑞士军刀 ”,它能直接调用 EDA 工具底层 API,实现:

- 定制 Virtuoso 菜单和快捷键
- 自动生成复杂版图结构(如螺旋电感)
- 跨工具数据转换(如网表→版图)
与通用脚本语言相比,Skill 的优势在于:
- 原生集成:无需外部环境,随 Cadence 工具启动自动加载
- 直接内存访问 :通过
dbOpen等函数直接读写设计数据库 - 事件驱动:可绑定到鼠标点击、菜单触发等 GUI 事件
2. 语法精要:从 Python 到 Skill 的思维转换
2.1 变量与类型系统
Skill 是动态类型语言,但支持类型声明(推荐用于函数参数):
; 带类型检查的函数定义
defun(CalcCenterCoord ( (list points) )
prog((sumX sumY count)
sumX = 0
sumY = 0
count = length(points)
foreach( point points
sumX += car(point) ; car 取列表第一个元素(X 坐标)sumY += cadr(point) ; cadr 取第二个元素(Y 坐标))
return(list(sumX/count sumY/count) )
)
)
与 Python 的主要差异:
- 列表索引从 1 开始
- 用
car/cdr代替list[0]/list[1:] - 语句组必须包裹在
prog()块中
2.2 矩阵操作实战示例
版图设计中经常需要坐标变换,比如旋转一组多边形:
; 旋转矩阵乘法
defun(RotatePoints ( (list points) (float angle) )
let(( (rad (angle*PI/180))
(cosVal cos(rad))
(sinVal sin(rad)) )
foreach( mapcar point points
list(cosVal*car(point) - sinVal*cadr(point) ; 新 X 坐标
sinVal*car(point) + cosVal*cadr(point) ; 新 Y 坐标
)
)
)
)
2.3 与 CIW 交互
Command Interpreter Window (CIW) 是 Skill 的主要输出窗口:
; 在 CIW 打印彩色警告信息
printf("\033[31mERROR:\033[0m 金属间距小于 0.2um!\n")
; 弹出文件选择对话框
fileName = getFilenameDialog("选择 GDS 文件" ".gds")
3. 实战陷阱与解决方案
3.1 全局变量污染
错误示范:
; 危险!全局变量可能被其他脚本覆盖
threshold = 0.5
defun(checkWidth (w)
w < threshold ; 依赖外部变量
)
正确做法:
; 使用闭包封装局部变量
let(( (threshold 0.5) )
defun(checkWidth (w)
w < threshold
)
)
3.2 多工艺角参数传递
建议采用 let 绑定环境变量:
; 定义工艺角参数表
corners = list(list("tt" 1.0 1.0)
list("ff" 1.2 0.8)
)
foreach( corner corners
let(( (name car(corner))
(vdd cadr(corner))
(vth caddr(corner)) )
printf("Running %s corner...\n" name)
; 调用仿真脚本
runSimulation(vdd vth)
)
)
3.3 内存泄漏检测
必须成对使用dbOpen/dbClose:
cellId = dbOpen("layout.lib" "TOP" "r") ; 只读模式打开
when( cellId
shapes = dbGetShapes(cellId)
foreach( shape shapes
; 处理图形...
)
dbClose(cellId) ; 必须关闭!)
检测工具:
; 在 CIW 输入命令查看内存使用
skill memory
4. 性能优化技巧
4.1 循环结构选择
测试数据:处理 10,000 个图形的时间对比
| 循环类型 | 耗时(ms) |
|---|---|
while |
320 |
foreach |
210 |
mapcar |
190 |
4.2 大规模数据处理
分块加载示例:
; 每次处理 1000 个图形
defun(ProcessLargeLayout (cellId)
for(i 1 dbGetNumShapes(cellId) 1000
shapes = dbGetShapes(cellId i i+999)
; 处理当前块...
)
)
5. 课后练习
- DRC 标注脚本:编写一个自动在违规位置添加标注层的脚本,输入为 DRC 报告文件
- 版图比对工具:比较两个单元版的差异,用高亮层标记不一致区域
- 工艺角跑批:自动遍历所有工艺角,生成仿真报告汇总表格
总结
Skill 语言的学习曲线陡峭,但掌握后能极大提升 EDA 工作效率。建议从小的实用脚本开始(比如自动重命名图层),逐步积累自己的工具库。遇到问题时,多利用 help 命令查看内置文档,例如:
help "defun" ; 查看函数定义语法
记住:在 Virtuoso 中按下 Ctrl+ C 可以中断长时间运行的 Skill 脚本!
正文完
发表至: 未分类
近两天内
