共计 1614 个字符,预计需要花费 5 分钟才能阅读完成。
背景介绍:为什么选择 Skill 脚本
Skill 脚本是 EDA(电子设计自动化)工具中广泛使用的脚本语言,尤其在 Cadence 设计平台中占据重要地位。它的核心优势在于:

- 高度集成:直接与 EDA 工具交互,无需额外接口
- 语法简洁:类似 Lisp 的语法结构,学习曲线平缓
- 执行高效:在工具内部运行,避免进程间通信开销
典型应用场景包括:
- 设计流程自动化(版图生成、DRC 检查等)
- 批量数据处理(网表修改、参数提取)
- 自定义工具功能扩展
环境搭建三步曲
- 基础环境准备
- 确认已安装 Cadence IC/VIrtuoso 等支持 Skill 的软件
-
设置环境变量(以 Linux 为例):
export CDS_ROOT=/path/to/cadence export PATH=$CDS_ROOT/tools/bin:$PATH -
开发工具配置
- 推荐使用 VSCode + Skill 插件(语法高亮 / 代码补全)
-
或直接使用 CIW(Command Interpreter Window)交互环境
-
验证安装
println("Hello Skill!") ; 在 CIW 输入该命令应能看到输出
核心语法速成
变量与数据类型
;; 基本类型示例
numVar = 123 ; 整数
floatVar = 3.14 ; 浮点数
strVar = "text" ; 字符串
listVar = '(1 2 3) ; 列表
symVar = 'symbol ; 符号
函数定义
procedure(greet(name)
printf("Hello %s!\n" name)
)
greet("John") ; 调用示例
流程控制
;; 条件判断
if( numVar > 100 then
println("Large number")
else
println("Small number")
)
;; 循环示例
for( i 1 5
println(i)
)
实战案例:版图元件批量重命名
以下脚本实现将选中器件的名称前缀统一修改:
procedure(batchRename(prefix)
let((cv selObjs)
cv = geGetEditCellView()
selObjs = geGetSelSet(cv)
foreach(obj selObjs
when(obj~>objType == "inst" ; 仅处理实例
newName = sprintf(nil "%s_%s" prefix obj~>name)
dbRenameInst(obj newName)
printf("Renamed %s -> %s\n" obj~>name newName)
)
)
t ; 返回真值表示成功
)
)
;; 使用方法:;; 1. 在版图窗口选中需要重命名的器件
;; 2. 在 CIW 执行:batchRename("NEW_PREFIX")
最佳实践指南
- 代码组织结构
- 按功能模块拆分到不同.il 文件
-
使用
load()函数管理依赖 -
错误处理
procedure(safeOperation() unless(protectedFunc() println("Operation failed!") exit()) ) -
常见陷阱
- 变量作用域:使用
let控制局部变量 - 内存泄漏:及时
dbClose()打开的数据 - 路径处理:使用
getWorkingDir()替代硬编码
性能优化技巧
-
数据库操作:
;; 低效方式 foreach(obj cv~>instances if(obj~>name == "target" then ... ) ) ;; 高效方式 targetObj = dbFindAnyInstByName(cv "target") -
批量处理 :优先使用
mapcar替代显式循环 - 延迟更新 :大量修改时先用
deferUpdate/resumeUpdate包裹
学习资源推荐
- 官方文档:Cadence 安装目录下的
skill.pdf - 实用函数库:
$CDS_ROOT/share/skill中的示例代码 - 社区资源:Cadence Support 案例库、EDAboard 论坛
建议从修改现成脚本开始实践,逐步过渡到独立开发。遇到问题时,多使用 help 命令(如help dbCreateRect)查看函数说明。
正文完
