共计 1672 个字符,预计需要花费 5 分钟才能阅读完成。
1. Skill 文件的基本概念与应用场景
Skill 是 Cadence Virtuoso 平台专用的脚本语言,主要用于 EDA 工具自动化操作。它结合了 Lisp 语法特点和 EDA 领域特定功能,能实现:
- 批量处理版图设计任务
- 自定义设计规则检查
- 自动化参数化单元生成
- 工具界面功能扩展
典型应用场景包括:
- 重复性操作自动化(如批量导出版图 GDS)
- 设计流程封装(如一键执行 DRC/LVS)
- 复杂计算实现(如蒙特卡洛分析)
2. 常见新手错误分析
错误 1:忽略环境初始化
; 错误示例:直接调用 ciw 命令
ciw->helloWorld() ; 报错:未定义函数
; 正确做法:load("strcmp.il") ; 先加载基础库
ciw = getCIW() ; 获取当前窗口对象
错误 2:变量作用域混淆
procedure(TestScope()
let((x)
x = 5 ; 局部变量
printf("%d" x)
)
printf("%d" x) ; 报错:x 未定义
)
错误 3:列表操作越界
; 错误示例:list = '(1 2 3)
nth(5 list) ; 越界访问
; 安全写法:when(length(list) > 5
nth(5 list)
)
3. 完整示例代码
;============== 版图批量导出工具 ==============
procedure(ExportAllLayouts(@optional (libName "myLib"))
let((lib cell view files)
; 1. 检查库是否存在
unless(ddGetObj(libName)
error("Library %s not found" libName)
))
; 2. 获取所有单元
cells = ddGetObj(libName)->cells
foreach(cell cells
; 3. 过滤有效版图
when(layoutView = cell->layout
; 4. 生成 GDS 文件名
gdsName = sprintf(nil "%s.gds" cell->name)
; 5. 执行导出
hiExportGDS(
?libName libName
?cellName cell->name
?viewName "layout"
?fileName gdsName
)
printf("Exported %s\n" gdsName)
))
)
)
)
4. 调试技巧与工具推荐
调试三板斧:
-
print 大法:
printf("DEBUG: x=%g y=%g\n" x y) -
断点工具:
Ctrl+X 进入调试模式 :step 单步执行 :cont 继续运行 -
错误捕获:
errset(dangerousOperation() t ; 返回 nil 不报错 )
推荐工具:
- Virtuoso 自带的 CIW 窗口
- Skill IDE 插件(需单独安装)
- gdb 调试器(适用于复杂脚本)
5. 生产环境最佳实践
性能优化:
- 使用
mapcar代替循环:; 较慢写法:foreach(x list y += x*x) ; 更快写法:y = apply('plus mapcar('lambda(x x*x) list))
安全规范:
-
输入验证:
unless(stringp(input) error("Expected string input") ) -
资源释放:
let((fileId) fileId = outfile("data.txt") ... close(fileId) ; 必须关闭! ) -
权限控制:
unless(isAdmin() error("Permission denied") )
6. 进阶学习路径
推荐学习顺序:
- 《Cadence Skill Language User Guide》
- Virtuoso 自带示例脚本(安装目录下的 skill/ 目录)
- 开源项目参考(如 OpenEDA 项目)
- 参加 Cadence 官方培训
实践练习
- 编写脚本批量重命名版图中所有矩形为 ”rect_序号 ” 格式
- 实现自动检查金属层密度的工具(输出密度低于 30% 的区域)
- 创建交互式菜单,提供常用 DRC 规则的快速执行功能
结语
掌握 Skill 脚本开发能极大提升 IC 设计效率。建议从简单自动化任务开始,逐步过渡到复杂工具开发。遇到问题时多查阅 help 命令和官方文档,坚持 3 - 5 个实际项目后就能得心应手。

(注:实际使用时请替换为真实流程图)
正文完
发表至: 电子设计自动化
近一天内
