共计 1471 个字符,预计需要花费 4 分钟才能阅读完成。
Skill 语言是 Cadence Virtuoso 平台的核心脚本语言,专门为 IC 设计自动化而生。它能让工程师通过编程方式操作版图、创建参数化单元、自动化设计流程。相比 Python 等通用语言,Skill 更贴近 EDA 工具链,能直接调用 Virtuoso 内部接口,执行效率更高。

一、Skill 语法核心要素
1. 变量定义
Skill 是动态类型语言,变量无需声明类型,用 let 或直接赋值即可:
let((a b)
a = 10 ; 整数
b = "text" ; 字符串
list('(1 2 3)) ; 列表
)
- 特殊符号
nil表示空值 - 列表用单引号 + 括号
'(...)表示 - 变量作用域通过
let控制
2. 控制结构
;; 条件判断
when(a > 5
println("大于 5")
)
;; 循环
for(i 0 9
printf("%d" i)
)
;; 带条件的循环
while(i < 10
i++
)
3. 函数定义
procedure(addTwo(a b)
a + b ; 最后一行作为返回值
)
;; 带默认值的参数
procedure(drawRect(@key (width 1) (height 2))
; 函数体
)
二、典型应用场景
1. 版图矩形批量创建
procedure(createRects
let((cv layer)
cv = geGetEditCellView()
layer = list("M1" "drawing")
for(i 0 4
dbCreateRect(cv layer
list(i*2 0 (i*2)+1 1) ; 坐标
)
)
)
)
;; 调用:createRects()
2. 参数化 Pcell 创建
pcDefinePCell(list(ddGetObj("mylib") "inverter" "layout")
((width 0.5) (height 0.5)) ; 默认参数
let((cv)
cv = pcCellView
dbCreateRect(cv list("M1" "drawing") list(0 0 width height))
)
)
3. 属性批量修改
procedure(changeProp(objName propName newValue)
foreach(obj geGetSelSet()
when(obj~>objName == propName
obj~>propName = newValue
)
)
)
三、常见错误与调试
-
括号不匹配:Skill 大量使用括号,建议用 IDE 高亮显示配对
-
变量作用域问题:
let((a) a = 1 let((a) ; 内层 a 遮蔽外层 a a = 2 ) println(a) ; 输出 1 ) -
调试技巧:
- 使用
println输出中间值 axlShell(进入交互模式trace函数跟踪执行流程
四、性能优化建议
-
减少数据库操作:批量处理代替循环单次操作
;; 低效方式 for(i 1 100 dbCreateRect(...)) ;; 高效方式 let((shapes) shapes = mapcar('dbCreateRect ...) ) -
使用向量运算:内置数学函数支持向量计算
-
避免频繁类型转换:保持变量类型一致性
五、与其他语言对比
| 特性 | Skill | Tcl | Python |
|---|---|---|---|
| 执行效率 | ★★★★★ | ★★★☆☆ | ★★★★☆ |
| EDA 集成度 | 原生支持 | 需接口层 | 需接口层 |
| 语法简洁性 | 括号较多 | 字符串操作强 | 易读性好 |
进阶学习路径
- 官方文档《Skill Language User Guide》
- Virtuoso 自带的
skill.cxt示例库 - 练习修改 CIW 窗口的自动记录脚本
- 参与 Cadence 社区技能挑战赛
Skill 语言的学习曲线虽然陡峭,但掌握后能极大提升 IC 设计效率。建议从简单自动化任务开始,逐步过渡到复杂 Pcell 开发。遇到问题时,多查阅 help 命令和内置函数手册,坚持 3 个月就能看到明显进步。
正文完
