共计 1712 个字符,预计需要花费 5 分钟才能阅读完成。
背景痛点:为什么需要 Skill 自动化
在集成电路设计领域,版图工程师每天都要面对重复性操作:比如手动调整数百个 MOS 管的尺寸参数,或者逐个修改金属层的连接关系。这种低效的手动操作不仅耗时耗力,还容易引入人为错误。以某次版图修改为例,工程师需要调整 50 个相同结构的单元:

- 手动操作耗时约 3 小时,且存在误操作风险
- 使用 Skill 脚本可在 10 分钟内完成,准确率 100%
技术对比:Skill vs Python/Tcl
1. 语法特性
- Skill:Lisp 方言,前缀表达式语法。例如计算 1 + 2 写作
(+ 1 2) - Python:更接近自然语言,适合算法开发但 EDA 接口较少
- Tcl:字符串处理强但类型系统较弱
2. 执行效率(以版图操作为例)
| 操作类型 | Skill(ms) | Python(ms) |
|---|---|---|
| 创建 100 个矩形 | 12 | 85 |
| 修改层属性 | 8 | 110 |
3. EDA 生态支持
- Skill 直接操作 Virtuoso 数据库对象
- Python 需通过 PCI 接口转换,存在性能损耗
核心语法实战:创建参数化 MOS 管
; 定义参数化 MOS 管生成函数
procedure(createParamMOS(l w fingers)
let((cellView inst)
; 类型检查
unless(numberp(l) && numberp(w) && integerp(fingers))
error("参数类型错误")
)
; 创建单元
cellView = ddGetObj("PDK" "nmos" "layout")
inst = dbCreateInst(cellView "I1" (list 0 0) "R0")
; 设置参数
for(i 1 fingers
dbCreateRect(inst "diff" (list (* i w) 0) (list (* (i+1) w) l))
)
; 返回实例对象
inst
)
)
完整版图生成示例
/* 自动生成差分对版图单元 */
procedure(genDiffPair(@key (width 0.5) (length 0.18) (fingers 4))
let((cv topCell m1 m2)
; 创建新 cell
cv = ddGetObj("MyLib" "diff_pair" "layout")
when(!cv cv = pcDefinePCell(...))
; 生成 MOS 管
m1 = createParamMOS(length width fingers)
m2 = createParamMOS(length width fingers)
dbMoveFig(m2 (list (* width (fingers+2)) 0))
; 金属连线
dbCreatePath(cv "metal1" (list 0 width) (list (* width fingers) width))
; 错误处理
on_error(printf("ERROR: %s\n" _error)
dbClose(cv)
exit())
; 性能提示:预加载 techfile
ddTrigger('techLoad"tsmc18")
)
)
五大避坑指南
- 内存泄漏:
- 使用
let限定变量作用域 -
定期调用
gc()强制回收 -
线程安全:
- 避免在多线程中同时修改同一对象
-
用
pcMutexLock保护关键段 -
版本兼容:
- 检查
axlVersion()做条件编译 -
避免使用已废弃的 API
-
性能陷阱:
- 批量操作用
dbReplaceProp替代多次dbAddProp -
使用
dbOpenCellViewByType加速单元格访问 -
调试技巧:
axlSetVariable("cmd" "verbose" t)显示详细错误axlDBDump()查看对象结构
性能优化进阶
数据库查询优化
; 慢查询(逐一遍历)foreach(inst cv~>instances
when(inst~>name == "M1" doSomething())
)
; 优化方案(哈希查找)inst = dbFindAnyInstByName(cv "M1")
脚本预处理
; 编译为字节码加速执行
pcCompile("myscript.il" "myscript.bin")
load("myscript.bin")
开放性问题
随着机器学习在 IC 设计中的应用,如何用 Skill 实现:
– 将 CNN 推理结果实时反馈到版图布线?
– 构建参数化单元与 ML 模型的协同优化循环?
期待在评论区看到您的实践方案!
正文完
