共计 2276 个字符,预计需要花费 6 分钟才能阅读完成。
什么是 Skill 语言?
Skill 语言是 Cadence 公司专为 EDA(电子设计自动化)工具链开发的领域特定语言(Domain Specific Language, DSL)。它在芯片设计流程中扮演着重要角色,特别是在 Cadence Virtuoso 等工具中,用于自动化设计任务、创建定制化设计流程和扩展工具功能。

与通用编程语言相比,Skill 语言更专注于解决 EDA 领域的特定问题。它直接内置于 Cadence 工具环境中,可以高效地访问和操作设计数据库,这使得它在芯片设计自动化方面具有独特优势。
Skill 语言与其他语言的对比
1. 语法结构
- Skill:采用 Lisp-like 语法,函数式编程风格
- Python:面向对象,语法简洁易读
- Tcl:命令式语言,基于字符串处理
2. 执行效率
- Skill:直接运行在 EDA 工具内部,执行效率最高
- Python:需要通过 API 接口与 EDA 工具交互,有一定开销
- Tcl:执行效率介于 Skill 和 Python 之间
3. 工具链集成
- Skill:深度集成,可以直接访问底层设计数据
- Python:需要通过特定接口(如 PySkill)访问
- Tcl:集成度较好,但不如 Skill 直接
Skill 语言基础语法
变量定义
; 定义变量
a = 10 ; 整数
b = 3.14 ; 浮点数
c = "hello" ; 字符串
d = list(1 2 3) ; 列表
流程控制
; if 条件判断
if(a > 5 then
println("a 大于 5")
else
println("a 不大于 5")
)
; for 循环
for(i 1 10
println(i)
)
; while 循环
while(a > 0
println(a)
a = a - 1
)
函数声明
; 定义函数
procedure(myFunction(arg1 arg2)
; 函数体
return arg1 + arg2
)
; 调用函数
result = myFunction(3 4)
println(result) ; 输出 7
与 Virtuoso 工具交互
获取当前 cellView
; 获取当前打开的 cellView
cv = geGetEditCellView()
; 检查是否获取成功
unless(cv
error("没有打开的 cellView!")
)
创建矩形图形
; 在当前 cellView 中创建矩形
rectId = dbCreateRect(
cv
list("metal1" "drawing") ; 图层
list(0 0 100 100) ; 坐标(x1 y1 x2 y2)
)
内存管理技巧
『警告』:Skill 使用动态作用域,容易导致变量污染
; 好的做法:使用局部变量
procedure(safeFunction()
let((localVar) ; 声明局部变量
localVar = 10
; 其他操作
)
)
; 不好的做法:使用全局变量
globalVar = 10 ; 可能在别处被意外修改
实用代码示例
版图参数化生成脚本
; 参数化生成矩形阵列
procedure(createRectArray(cv layerName xSpace ySpace rows cols)
let((rectId)
for(row 1 rows
for(col 1 cols
x1 = (col-1)*xSpace
y1 = (row-1)*ySpace
x2 = x1 + xSpace
y2 = y1 + ySpace
rectId = dbCreateRect(
cv
list(layerName "drawing")
list(x1 y1 x2 y2)
)
)
)
)
)
设计规则检查 (DRC) 自动化
; 运行 DRC 检查并输出结果
procedure(runDRCCheck(cellName)
let((drcResults)
; 打开指定 cell
sch = dbOpenCellViewByType(cellName "schematic" "schematic" "r")
unless(sch
error(strcat("无法打开原理图:" cellName))
)
; 运行 DRC
drcResults = deCheckSchematic(sch)
; 输出结果
foreach(result drcResults
printf("DRC 错误: %s\n" result->message)
)
)
)
实践建议
调试技巧
- 使用 skillDebugger 工具
- 设置断点:
dbSetBreakpoint - 单步执行:
dbStep -
查看变量:
dbPrint -
日志输出
- 使用
println进行调试输出 - 重定向输出到文件
性能优化
- 批处理:对于大数据量操作,使用批处理模式
- 缓存数据:避免重复查询设计数据库
- 减少图形刷新:操作期间暂停刷新
; 批处理示例
procedure(batchProcessShapes(cv)
let((shapes)
; 暂停图形刷新
hiDisableUpdate()
; 获取所有图形
shapes = cv->shapes
; 批量处理
foreach(shape shapes
; 处理每个图形
)
; 恢复图形刷新
hiEnableUpdate())
)
与 Calibre 集成
- 通过 Skill 调用 Calibre
- 解析 Calibre 结果文件
- 在 Virtuoso 中标记 DRC 错误
现代开发流程整合
随着芯片设计流程的现代化,如何将 Skill 脚本整合到 CI/CD 流程中是一个值得思考的问题。可以考虑以下方向:
- 将常用 Skill 脚本封装成可重用组件
- 开发自动化测试框架验证 Skill 脚本
- 与版本控制系统(如 Git)集成
- 通过 Jenkins 等工具实现自动化执行
Skill 语言虽然是一个历史悠久的 EDA 专用语言,但在现代芯片设计流程中仍然发挥着不可替代的作用。通过合理的使用和优化,可以显著提高设计自动化效率,缩短芯片开发周期。
希望本文能够帮助硬件工程师和 EDA 开发者更好地理解和应用 Skill 语言,在实际工作中发挥它的强大功能。
正文完
