从零开始掌握Skill PCell:定制化版图设计的入门指南

2次阅读
没有评论

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

image.webp

固定单元 vs PCell:维护成本对比

场景 固定单元维护方式 PCell 维护方式
DRC 规则更新 手动修改每个单元版图 调整参数化代码逻辑,所有实例自动更新
工艺迁移(如 65nm→28nm) 重新绘制所有层次 修改工艺参数映射表
尺寸变更 需要人工重新布局 输入新参数值即时生成
设计复用 复制粘贴导致版本混乱 统一调用保证一致性

一、Skill 语法三分钟速成

  1. defun 定义函数

    // 定义生成矩形的函数
    defun(createRect (@key (layer "M1") (width 1.0) (height 1.0))
      cv = geGetEditCellView()
      rect = cv~>createRectangle(?layer list(layer "drawing")
        ?bBox list(0:0 width:height)
      )
    )

    从零开始掌握 Skill PCell:定制化版图设计的入门指南

  2. let 局部变量

    let((x y result)  // 声明局部变量
      x = 5
      y = 10
      result = x * y   // 计算结果
      println(result)  // 输出 50
    )

  3. prog 流程控制

    prog((total cnt)
      total = 0
      for(cnt 1 10
        total = total + cnt
      )
      printf("Sum=%d" total)  // 输出 1 到 10 的和
    )

二、MOSFET PCell 实战

参数检查模块

unless(width > 0.1 && width < 10.0
  error("Width must be 0.1-10um")
)

自动适配工艺规则

// 根据工艺节点设置间距
let((minSpace)
  minSpace = cond((techNode == 28) 0.05
    (techNode == 40) 0.08
    (techNode == 65) 0.12
    t 0.15  // 默认值
  )
  polySpace = fingers * minSpace
)

GDSII 生成核心代码

// 生成多指栅极结构
for(i 1 fingers
  xOffset = (i-1) * (gateLength + polySpace)
  cv~>createPath(?layer list("PO" "drawing")
    ?width gateWidth
    ?points list(xOffset:0 xOffset:totalWidth)
  )
)

// 生成有源区
cv~>createRectangle(?layer list("DIFF" "drawing")
  ?bBox list(-enc:0 totalLength+enc:totalWidth)
)

三、高级应用技巧

PDK 命名冲突解决

  1. 在 PCell 名称前添加公司前缀
  2. 使用 ilsGetSubdkNames() 检查冲突
  3. 通过 libDefineShadowLib() 创建隔离环境

Virtuoso XL 调试

  • 按 F3 进入调试模式
  • 使用 geGetSelSet() 获取选中对象
  • axlShell()直接执行代码片段

性能优化

  • mapcar 替代循环处理列表
  • dbOpenCellViewByType 改为只读模式
  • 对重复计算进行缓存

动手任务

改造要求
修改示例代码实现以下功能:
1. 根据 finger 数量自动计算所需 Contact 数量
2. Contact 间距符合当前工艺 DRC 规则
3. 奇数 finger 时中心对齐

参考实现已上传至:
GitHub 仓库链接 (包含 Calibre 验证结果)

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