共计 2437 个字符,预计需要花费 7 分钟才能阅读完成。
为什么选择 Skill 语言
在 EDA 工具链中,Cadence Skill 语言就像芯片设计师的瑞士军刀。我第一次接触 Skill 是为了批量修改版图标记层,当时用 Python 调用 OpenAccess 效率极低,而 Skill 脚本直接在 Virtuoso 环境中运行,速度提升了 20 倍不止。这种与工具深度集成的特性,让 Skill 成为自动化流程不可替代的解决方案。

核心语法特性(与 Python 对比)
- Lisp 方言的独特语法:
- 前缀表达式写法:(函数名 参数 1 参数 2)
- 列表处理优先:'(a b c) 比 Python 的 [a,b,c] 更常用
-
示例:比较两种语言的加法运算
; Skill 版本 (plus 1 2 3)# Python 版本 1 + 2 + 3 -
EDA 专用数据类型:
- 版图对象:dbShape、dbInst 等
- 设计层次:cellView->cell->library 结构
-
单位系统:预置 micron、angstrom 等单位常量
-
执行环境依赖:
- 必须运行在 Cadence 工具上下文
- 无法单独编译成可执行文件
典型应用场景
PDK 开发实例
制作 PCELL(参数化单元)时,这个脚本能自动生成不同尺寸的 MOS 管:
(procedure (createMosFET w l)
(let ( (cv (geGetEditCellView)) )
; 创建矩形有源区
(dbCreateRect cv "diff" (list 0.0 0.0 w l))
; 添加多晶硅栅极
(dbCreateRect cv "poly" (list -0.1 0.0 0.1 l))
; 输出调试信息
(printf "MOSFET W=%g L=%g created\n" w l)
)
)
版图自动化实战
批量打标工具示例,自动在指定位置添加尺寸标记:
(procedure (addSizeLabels layer)
(foreach inst (geGetSelectedSet)
(let ( (bbox (dbInstBBox inst)) )
(dbCreateLabel
(car bbox) ; 取左下角坐标
(sprintf "%.2fx%.2f"
(abs (- (cadr bbox) (car bbox))) ; X 方向尺寸
(abs (- (caddr bbox) (cadddr bbox))) ; Y 方向尺寸
)
layer
)
)
)
)
调试技巧宝典
CIW 窗口妙用
- 实时交互 :在 CIW 输入
(load "script.il")直接测试脚本 - 错误捕获 :用
errset函数包裹可能报错的代码段(errset (dbCreateRect cv "metal1" rectCoords) t) - 变量检查 :输入
?varName查看变量当前值
Debugger 高级功能
- 设置断点:在代码中插入
(break)语句 - 单步执行:使用
(step)命令 - 调用栈查看:
(trace)函数输出执行路径
性能优化指南
内存管理
- 对象释放:
(let ( (tmpObj (dbCreatePath...)) ) ; 使用完毕后 (dbDelete tmpObj) ) - 避免重复查询:
; 错误做法:循环内重复获取 cellView (for i 1 100 (dbCreateRect (geGetEditCellView)...)) ; 正确做法:预先获取 (let ( (cv (geGetEditCellView)) ) (for i 1 100 (dbCreateRect cv...)) )
循环优化
- 使用
foreach替代while:; 更高效的遍历方式 (foreach elem myList (processElement elem)) - 预计算循环次数:
(let ( (total (length instList)) ) (for i 0 (sub1 total) (process (nth i instList))) )
生产环境建议
版本兼容
- 添加头文件检查:
(unless (isCallable 'dbCreateRect) (error "需要 Virtuoso 6.1.8 以上版本") ) - 特性检测替代版本号判断:
(when (boundp 'advancedFeature) (enableNewAPI) )
错误恢复
- 事务回滚机制:
(let ( (success nil) ) (unwindProtect (progn (doCriticalOperation) (setq success t) ) (unless success (rollbackChanges)) ) ) - 自动日志记录:
(outfile "script.log" "a") (printf "%s: Operation started\n" (getCurrentTime))
与 Python 交互
通过 subprocess 调用 Skill 脚本:
import subprocess
def run_skill(script_path):
cmd = ['virtuoso', '-nograph', '-replay', script_path]
try:
output = subprocess.check_output(cmd, stderr=subprocess.STDOUT)
return output.decode('utf-8')
except subprocess.CalledProcessError as e:
print(f"Skill 执行失败: {e.output.decode('utf-8')}")
return None
进阶练习
- 实现一个自动对齐版图器件的脚本,要求支持 X / Y 方向对齐和等间距分布
- 开发 PCELL 生成器,根据输入参数动态创建不同 finger 数量的 MOS 管
- 编写 DRC 检查辅助工具,自动高亮违反最小间距规则的图形
学习资源推荐
- 官方文档:Cadence 安装目录下的
sklanguser.pdf - 实战宝典:《Skill Scripting for Cadence Virtuoso》
- 在线社区:www.cadence.com/community
刚开始接触 Skill 时,我被它的括号语法折磨得够呛。但坚持写了几周后,发现这种简洁的表达方式反而让 EDA 专用操作变得异常高效。记得第一次成功用脚本生成整个 IO ring 时,那种成就感至今难忘。希望这篇指南能帮你少走些弯路,早日享受自动化设计的乐趣!
正文完
发表至: 未分类
近两天内
