共计 2201 个字符,预计需要花费 6 分钟才能阅读完成。
Skill 语法概述与 EDA 工具中的重要性
Skill 是 Cadence Virtuoso 平台专用的脚本语言,专门为 EDA 工具链的自动化需求设计。作为 Virtuoso 环境中的 ” 瑞士军刀 ”,它直接与工具内核交互,能实现从版图编辑到仿真设置的全流程控制。与通用语言不同,Skill 的语法设计充分考虑了 EDA 领域的特殊需求:

- 原生支持版图数据库对象(如 shape、instance、pin 等)的直接操作
- 内置物理设计规则检查(DRC)和电路连接性检查功能
- 与 CIW(Command Interpreter Window)深度集成,支持交互式调试
在先进工艺节点下,手动操作已无法满足迭代需求。通过 Skill 脚本可批量处理重复任务,比如自动生成匹配结构、智能绕线或设计规则验证,效率提升可达 10 倍以上。
常见开发痛点分析
即使经验丰富的开发者也会遇到这些典型问题:
- 对象引用失效:当版图元素被删除后,未及时清除的变量引用会导致脚本崩溃
- 性能悬崖:遍历大型设计时,不当的循环结构可能使执行时间呈指数增长
- 环境依赖:脚本在不同 PDK(工艺设计套件)版本中的兼容性问题
- 调试困难:缺乏现代 IDE 的断点调试功能,依赖 print 语句排查问题
核心语法元素详解
变量与数据类型
Skill 是动态类型语言,但变量声明仍推荐使用类型前缀(业界惯例):
iVar = 42 ; 整型
fVar = 3.14 ; 浮点
sVar = "text" ; 字符串
bVar = t ; 布尔值(t/nil)objVar = geGetSelSet() ; 版图对象
特殊数据类型需注意:
- list:使用
cons构建,如(list 1 2 3) - array:固定长度,创建时需指定大小
make_array(3) - table:键值对集合,类似字典
函数定义
函数支持可选参数和关键字参数:
procedure(myFunc(arg1 @optional (arg2 默认值) @key (key1 val1))
printf("arg1=%L arg2=%L key1=%L" arg1 arg2 key1)
)
控制结构
除常规 if/while 外,EDA 场景特有的遍历操作:
foreach(obj geGetEditCellView()~>shapes
when(obj~>layerName == "metal1"
; 处理金属层图形
)
)
实战代码示例
版图器件批量修改
以下脚本将选中器件的参数统一更新:
procedure(batchUpdateInstParams(@optional (value 1u))
let((cv insts)
cv = geGetEditCellView()
insts = cv~>instances ; 获取所有实例
foreach(inst insts
when(inst~>isSelected()
dbSetq(inst "w" value) ; 修改宽度参数
dbSetq(inst "l" value) ; 修改长度参数
)
)
hiRedraw(cv) ; 刷新视图
)
)
DRC 违规自动修复
自动调整金属间距的智能脚本:
procedure(autoFixMetalSpacing()
let((cv shapes violations)
cv = geGetEditCellView()
shapes = cv~>shapes
violations = drcFindViolations(cv "minSpacing")
foreach(vio violations
when(vio~>layer == "metal3"
;; 计算需要移动的向量
moveVec = list(vio~>requiredDX vio~>requiredDY)
;; 执行移动操作
dbMoveShape(vio~>shape moveVec)
)
)
drcUpdate(cv) ; 更新 DRC 状态
)
)
性能优化技巧
- 数据库查询加速:
- 使用
geGet~系列函数时添加?fast t选项 -
对大规模遍历先用
dbCreateQuery创建查询对象 -
内存管理:
- 及时用
destroy释放不再使用的对象 -
大列表处理采用尾递归优化
-
并行计算:
threadCount = 4 parallel( list(list(lambda() (processRegion leftBottom)), list(lambda() (processRegion rightTop)) ) ?threads threadCount )
生产环境最佳实践
- 版本控制:
-
脚本头部添加元信息注释
;;; @author: John ;;; @version: 1.2 ;;; @pdk: tsmcN5 -
错误处理:
procedure(safeOperation() on_error(println("ERROR:" _error) return(nil) ) ; 主逻辑... ) -
模块化开发:
- 按功能拆分成
<moduleName>.il文件 - 通过
load动态加载
总结与进阶建议
掌握 Skill 语法后,推荐探索:
- 与 Python 混合编程(通过 PySkill 接口)
- 开发自定义菜单和 GUI 界面(使用 hiCreateAppForm)
- 研究 Cadence 官方示例库中的
$CDS_ROOT/share/skill
建议从实际项目中的一个小自动化任务开始,比如自动生成匹配阵列或版图对齐辅助线。当脚本能稳定运行后,逐步添加异常处理和日志功能,最终形成可复用的工具链。
实践提示:在 CIW 窗口输入
skill ?可查看所有内置函数,help 'functionName获取特定函数帮助。遇到复杂问题时,善用trace函数跟踪执行流程。
