Cadence Skill Language 实战指南:从基础语法到生产环境避坑

2次阅读
没有评论

共计 1523 个字符,预计需要花费 4 分钟才能阅读完成。

image.webp

背景:EDA 工具链中的隐形王者

Cadence Skill Language 是 Virtuoso 等 EDA 工具的核心脚本语言,相比 Verilog/VHDL 专注于硬件描述,它更擅长工具交互和设计自动化。在 TSMC 5nm 工艺设计套件 (PDK) 中,超过 60% 的 DRC 规则检查脚本由 Skill 实现。

Cadence Skill Language 实战指南:从基础语法到生产环境避坑

语法精要:硬件工程师的思维转换

  1. 过程式编程范式:与 Verilog 的并行执行不同,Skill 是严格顺序执行的 procedure(过程)语言
  2. 动态类型系统:变量无需声明类型,但要注意 list(列表)和 array(数组)的性能差异
  3. 特色数据结构
  4. 数据库对象 ID(dbId)是版图操作的核心句柄
  5. 嵌套 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)

性能陷阱:递归的致命诱惑

  1. 版图遍历陷阱
    ; 危险示例:递归遍历层次化版图
    procedure(recursiveTraverse obj)
        foreach(child obj~>children
            recursiveTraverse(child)  ; 深度优先可能导致栈溢出
        )
  2. 替代方案
  3. 使用 dbHierarchyFlattener 工具预处理
  4. 迭代式广度优先搜索

调试技巧:CIW 窗口实战

  1. 断点设置
    debugMode(t)          ; 启用调试模式
    setBreakpoint('foo)   ; 在 foo 函数处中断
  2. 变量监控
  3. 在 CIW 输入 ?varName 查看变量值
  4. 使用 trace 函数追踪特定变量

避坑指南

作用域三宗罪

  1. 全局变量污染
    a = 1  ; 危险!创建了全局变量
    procedure(foo() let((a) a=2))  ; 应该用 let 限定作用域
  2. 动态绑定陷阱:闭包中意外修改外部变量
  3. 命名空间冲突:自定义函数与内置函数重名

PDK 兼容性清单

  • 工艺版本匹配(如 tsmcN65 vs tsmcN65RF)
  • 层映射表验证(GDSII number vs 技术层名)
  • 单位一致性检查(微米 vs 纳米)

效率提升实践

通过以下技巧,我们的物理验证团队将脚本运行时间从 4.2 小时缩短至 2.8 小时:
1. 用 dbOpenCellViewByType 替代 geGetEditCellView 减少 GUI 开销
2. 对大规模操作使用 dbReplaceProp 批量更新属性
3. 预编译常用正则表达式模式

掌握这些实战技巧后,配合 Cadence 官方文档中的skillref.pdf,相信你也能写出工业级可靠的 Skill 脚本。

正文完
 0
评论(没有评论)