共计 1376 个字符,预计需要花费 4 分钟才能阅读完成。
技术背景
Skill 语言是 Cadence EDA 工具链中的专用脚本语言,尤其在 Virtuoso 平台中扮演着自动化核心角色。与 Tcl/Python 等通用脚本语言相比,Skill 具有以下特性差异:

| 特性 | Skill | Python |
|---|---|---|
| 执行环境 | 内嵌于 Cadence 工具 | 独立解释器 |
| 执行效率 | 直接调用 EDA 内核 API | 需通过接口层转换 |
| 数据类型 | 动态类型 +EDA 对象系统 | 动态类型 |
| 典型应用 | 版图批量操作 | 算法开发 / 数据分析 |
开发环境配置
- 确认 Cadence 安装路径(通常为
/cadence/IC617) - 在 home 目录创建或修改
.skill.cshrc文件:
;; 加载默认库路径
loadi(strcat(getShellEnvVar("CDS_ROOT") "/tools/dfII/samples/skill/local/load.il"))
;; 设置自定义脚本搜索路径
setSkillPath(append1(getSkillPath() '("./skill_lib")))
- 启动 Virtuoso 后在 CIW 窗口输入
skill进入交互模式
核心语法精讲
特殊表处理
-
list:可嵌套的异构容器,支持car/cdr操作myList = list(1 'a list(2 3)) ;=> (1 a (2 3)) -
defun:定义函数时自动创建局部变量作用域defun(addSquares (x y) let((sum) sum = x*x + y*y sum ; 隐式返回值 ) ) -
progn:顺序执行多个表达式并返回最后结果
动态类型系统
类型检查发生在运行时,常见类型转换函数:
numberp(1.23) ;=> t
stringp("text") ;=> t
listp('(a b)) ;=> t
实战代码示例
MOSFET 生成脚本
procedure(createNMOS (@key (w 1u) (l 180n) (fingers 1))
let((cellId libId)
libId = ddGetObj("analogLib")
cellId = dbCreateCell(libId "nmos_auto")
;; 参数化器件生成
pcDefinePCell(list(ddGetObj("basic") "nmos" "symbol")
list(list("w" w "float")
list("l" l "float")
)
let((master)
master = pcCellMaster
dbCreateParamInst(cellId master "I0" list(0 0) "R0" 1)
)
)
cellId
)
)
版图属性批量修改
defun(batchChangeProp (objList propName newVal)
foreach(obj objList
when(obj~>propName
dbReplaceProp(obj propName newVal)
)
)
t ; 返回成功标志
)
避坑指南
常见错误处理
*Error* eval: undefined function:- 检查函数名拼写
-
确认是否加载所需库文件
-
内存泄漏排查:
- 使用
status(freeHeap)监控内存 - 及时释放 EDA 对象引用
进阶学习
- OpenAccess API:通过
oa<ClassName>访问数据库对象 - AEL 语言:Skill 的扩展语法糖
思考题
- 如何实现自动计算并填充 MOSFET 的 finger 宽度?
- 编写递归函数统计版图中所有文本对象的数量
- 设计闭包函数实现属性修改的 undo 功能
正文完
