共计 1255 个字符,预计需要花费 4 分钟才能阅读完成。
为什么选择 Skill 语言
在 EDA(电子设计自动化)工具链中,Skill 语言是 Cadence 平台的核心脚本语言。与 Tcl/Perl 等通用脚本语言相比,Skill 直接内置于 Virtuoso 等工具中,能深度操作版图数据库。举个典型场景:当需要批量修改 5000 个晶体管尺寸时,Skill 脚本可以在几秒内完成,而手动操作可能需要数小时。

环境配置实战
- 启动 Cadence Virtuoso 后,CIW(Command Interpreter Window)就是我们的主战场。建议先执行:
; 显示当前工作目录
getWorkingDir()
; 设置脚本搜索路径
prependInstallPath("/home/user/skill_scripts")
- 创建.skill 文件时,推荐使用以下文件头防止编码问题:
;; -*- mode: skill; coding: utf-8 -*-
五个必学代码示例
示例 1:基础数据结构
;; 创建包含设计单元名的 list
cellList = list("AND2" "OR3" "XOR")
;; 字符串拼接(注意 Skill 索引从 1 开始)printf("当前处理单元: %s" car(cellList))
示例 2:GDSII 文件处理
;; 带错误处理的文件操作
unless(isFile("layout.gds")
error("GDSII 文件不存在")
)
gdsIn = infile("layout.gds")
while(line = gets(gdsIn)
;; 解析层次编号
when(regexpMatch(line "LAYER [0-9]+")
layerNum = atoi(last(reverse(parseString(line))))
)
)
close(gdsIn)
示例 3:版图批量修改
;; 修改所有矩形宽度
foreach(shape geGetEditCellView()~>shapes
when( shape~>objType == "rect"
shape~>width = 0.2 ;; 统一设为 200nm
)
)
性能优化关键点
内存泄漏是常见问题,建议定期检查:
;; 显示当前内存使用
mem = getMemoryUsage()
printf("已使用内存: %d KB" mem/1024)
;; 重要原则:及时释放大对象
delete(myLargeList)
setq(myLargeList nil)
生产环境避坑指南
- 变量作用域 :全局变量要用
defvar声明,否则可能意外覆盖
defvar("*globalConfig*" t) ;; 正确定义全局变量
- 版本兼容:检查 CIW 版本号
when( version < 6.1
warning("此脚本需要 Cadence 6.1+")
)
进阶思考方向
- 参数化单元生成:结合
dbCreateParametricCell()函数 - 百万级实例优化:采用
geGetSelSet()替代循环遍历 - 跨工具交互:通过 OA(OpenAccess)数据库实现
建议从修改现有脚本开始,逐步尝试添加日志输出、异常处理等工业级功能。遇到问题时,多使用 axlShell() 命令查看底层数据结构。
正文完
