共计 1523 个字符,预计需要花费 4 分钟才能阅读完成。
背景:EDA 工具链中的隐形王者
Cadence Skill Language 是 Virtuoso 等 EDA 工具的核心脚本语言,相比 Verilog/VHDL 专注于硬件描述,它更擅长工具交互和设计自动化。在 TSMC 5nm 工艺设计套件 (PDK) 中,超过 60% 的 DRC 规则检查脚本由 Skill 实现。

语法精要:硬件工程师的思维转换
- 过程式编程范式:与 Verilog 的并行执行不同,Skill 是严格顺序执行的 procedure(过程)语言
- 动态类型系统:变量无需声明类型,但要注意 list(列表)和 array(数组)的性能差异
- 特色数据结构:
- 数据库对象 ID(dbId)是版图操作的核心句柄
- 嵌套 list 可替代复杂结构体
典型变量声明对比:
; Skill 示例
a = list(1 2 3) ; 动态类型列表
b = "netName" ; 无需类型声明
// Verilog 示例
reg [31:0] a = 32'd0; // 必须声明位宽
实战示例:DRC 规则检查脚本
点击展开完整 DRC 检查脚本(含 O(n)复杂度分析)
/*
* 检查最小金属间距规则
* 时间复杂度:O(n) n 为版图形状数量
*/
procedure(DRCMetalSpaceCheck(layerName minSpace)
let((cv shapes violationCount)
cv = geGetEditCellView() ; 获取当前版图
shapes = cv~>shapes ; 获取所有图形
violationCount = 0
foreach(shape shapes
when(shape~>layerName == layerName
; 空间查询使用 R -tree 加速
nearbyShapes = dbGetShapesInSpace(cv layerName shape minSpace)
when(nearbyShapes
violationCount++
drcCreateMarker(shape "METAL_SPACE" minSpace)
)
)
)
printf("发现 %d 处间距违规 \n" violationCount)
)
)
; 调用示例:DRCMetalSpaceCheck("M1" 0.05)
性能陷阱:递归的致命诱惑
- 版图遍历陷阱:
; 危险示例:递归遍历层次化版图 procedure(recursiveTraverse obj) foreach(child obj~>children recursiveTraverse(child) ; 深度优先可能导致栈溢出 ) - 替代方案:
- 使用
dbHierarchyFlattener工具预处理 - 迭代式广度优先搜索
调试技巧:CIW 窗口实战
- 断点设置:
debugMode(t) ; 启用调试模式 setBreakpoint('foo) ; 在 foo 函数处中断 - 变量监控:
- 在 CIW 输入
?varName查看变量值 - 使用
trace函数追踪特定变量
避坑指南
作用域三宗罪
- 全局变量污染:
a = 1 ; 危险!创建了全局变量 procedure(foo() let((a) a=2)) ; 应该用 let 限定作用域 - 动态绑定陷阱:闭包中意外修改外部变量
- 命名空间冲突:自定义函数与内置函数重名
PDK 兼容性清单
- 工艺版本匹配(如 tsmcN65 vs tsmcN65RF)
- 层映射表验证(GDSII number vs 技术层名)
- 单位一致性检查(微米 vs 纳米)
效率提升实践
通过以下技巧,我们的物理验证团队将脚本运行时间从 4.2 小时缩短至 2.8 小时:
1. 用 dbOpenCellViewByType 替代 geGetEditCellView 减少 GUI 开销
2. 对大规模操作使用 dbReplaceProp 批量更新属性
3. 预编译常用正则表达式模式
掌握这些实战技巧后,配合 Cadence 官方文档中的skillref.pdf,相信你也能写出工业级可靠的 Skill 脚本。
正文完
发表至: 电子设计自动化
近一天内
