Cadence Skill学习指南:从基础到实战避坑

1次阅读
没有评论

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

image.webp

为什么选择 Skill 语言

在 EDA 工具链中,Cadence Skill 语言就像芯片设计师的瑞士军刀。我第一次接触 Skill 是为了批量修改版图标记层,当时用 Python 调用 OpenAccess 效率极低,而 Skill 脚本直接在 Virtuoso 环境中运行,速度提升了 20 倍不止。这种与工具深度集成的特性,让 Skill 成为自动化流程不可替代的解决方案。

Cadence Skill 学习指南:从基础到实战避坑

核心语法特性(与 Python 对比)

  1. Lisp 方言的独特语法
  2. 前缀表达式写法:(函数名 参数 1 参数 2)
  3. 列表处理优先:'(a b c) 比 Python 的 [a,b,c] 更常用
  4. 示例:比较两种语言的加法运算

    ; Skill 版本
    (plus 1 2 3)
    # Python 版本
    1 + 2 + 3

  5. EDA 专用数据类型

  6. 版图对象:dbShape、dbInst 等
  7. 设计层次:cellView->cell->library 结构
  8. 单位系统:预置 micron、angstrom 等单位常量

  9. 执行环境依赖

  10. 必须运行在 Cadence 工具上下文
  11. 无法单独编译成可执行文件

典型应用场景

PDK 开发实例

制作 PCELL(参数化单元)时,这个脚本能自动生成不同尺寸的 MOS 管:

(procedure (createMosFET w l)
  (let ( (cv (geGetEditCellView)) )
    ; 创建矩形有源区
    (dbCreateRect cv "diff" (list 0.0 0.0 w l))
    ; 添加多晶硅栅极
    (dbCreateRect cv "poly" (list -0.1 0.0 0.1 l))
    ; 输出调试信息
    (printf "MOSFET W=%g L=%g created\n" w l)
  )
)

版图自动化实战

批量打标工具示例,自动在指定位置添加尺寸标记:

(procedure (addSizeLabels layer)
  (foreach inst (geGetSelectedSet)
    (let ( (bbox (dbInstBBox inst)) )
      (dbCreateLabel 
        (car bbox) ; 取左下角坐标
        (sprintf "%.2fx%.2f" 
          (abs (- (cadr bbox) (car bbox))) ; X 方向尺寸
          (abs (- (caddr bbox) (cadddr bbox))) ; Y 方向尺寸
        )
        layer
      )
    )
  )
)

调试技巧宝典

CIW 窗口妙用

  1. 实时交互 :在 CIW 输入(load "script.il") 直接测试脚本
  2. 错误捕获 :用errset 函数包裹可能报错的代码段
    (errset (dbCreateRect cv "metal1" rectCoords) t)
  3. 变量检查 :输入?varName 查看变量当前值

Debugger 高级功能

  1. 设置断点:在代码中插入 (break) 语句
  2. 单步执行:使用 (step) 命令
  3. 调用栈查看:(trace)函数输出执行路径

性能优化指南

内存管理

  1. 对象释放
    (let ( (tmpObj (dbCreatePath...)) )
      ; 使用完毕后
      (dbDelete tmpObj)
    )
  2. 避免重复查询
    ; 错误做法:循环内重复获取 cellView
    (for i 1 100 (dbCreateRect (geGetEditCellView)...))
    
    ; 正确做法:预先获取
    (let ( (cv (geGetEditCellView)) )
      (for i 1 100 (dbCreateRect cv...))
    )

循环优化

  1. 使用 foreach 替代while
    ; 更高效的遍历方式
    (foreach elem myList (processElement elem))
  2. 预计算循环次数:
    (let ( (total (length instList)) )
      (for i 0 (sub1 total) (process (nth i instList)))
    )

生产环境建议

版本兼容

  1. 添加头文件检查:
    (unless (isCallable 'dbCreateRect)
      (error "需要 Virtuoso 6.1.8 以上版本")
    )
  2. 特性检测替代版本号判断:
    (when (boundp 'advancedFeature)
      (enableNewAPI)
    )

错误恢复

  1. 事务回滚机制:
    (let ( (success nil) )
      (unwindProtect
        (progn
          (doCriticalOperation)
          (setq success t)
        )
        (unless success (rollbackChanges))
      )
    )
  2. 自动日志记录:
    (outfile "script.log" "a")
    (printf "%s: Operation started\n" (getCurrentTime))

与 Python 交互

通过 subprocess 调用 Skill 脚本:

import subprocess

def run_skill(script_path):
    cmd = ['virtuoso', '-nograph', '-replay', script_path]
    try:
        output = subprocess.check_output(cmd, stderr=subprocess.STDOUT)
        return output.decode('utf-8')
    except subprocess.CalledProcessError as e:
        print(f"Skill 执行失败: {e.output.decode('utf-8')}")
        return None

进阶练习

  1. 实现一个自动对齐版图器件的脚本,要求支持 X / Y 方向对齐和等间距分布
  2. 开发 PCELL 生成器,根据输入参数动态创建不同 finger 数量的 MOS 管
  3. 编写 DRC 检查辅助工具,自动高亮违反最小间距规则的图形

学习资源推荐

  • 官方文档:Cadence 安装目录下的sklanguser.pdf
  • 实战宝典:《Skill Scripting for Cadence Virtuoso》
  • 在线社区:www.cadence.com/community

刚开始接触 Skill 时,我被它的括号语法折磨得够呛。但坚持写了几周后,发现这种简洁的表达方式反而让 EDA 专用操作变得异常高效。记得第一次成功用脚本生成整个 IO ring 时,那种成就感至今难忘。希望这篇指南能帮你少走些弯路,早日享受自动化设计的乐趣!

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