共计 1303 个字符,预计需要花费 4 分钟才能阅读完成。
固定单元 vs PCell:维护成本对比
| 场景 | 固定单元维护方式 | PCell 维护方式 |
|---|---|---|
| DRC 规则更新 | 手动修改每个单元版图 | 调整参数化代码逻辑,所有实例自动更新 |
| 工艺迁移(如 65nm→28nm) | 重新绘制所有层次 | 修改工艺参数映射表 |
| 尺寸变更 | 需要人工重新布局 | 输入新参数值即时生成 |
| 设计复用 | 复制粘贴导致版本混乱 | 统一调用保证一致性 |
一、Skill 语法三分钟速成
-
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) ) )
-
let 局部变量
let((x y result) // 声明局部变量 x = 5 y = 10 result = x * y // 计算结果 println(result) // 输出 50 ) -
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 命名冲突解决
- 在 PCell 名称前添加公司前缀
- 使用
ilsGetSubdkNames()检查冲突 - 通过
libDefineShadowLib()创建隔离环境
Virtuoso XL 调试
- 按 F3 进入调试模式
- 使用
geGetSelSet()获取选中对象 axlShell()直接执行代码片段
性能优化
- 用
mapcar替代循环处理列表 - 将
dbOpenCellViewByType改为只读模式 - 对重复计算进行缓存
动手任务
改造要求:
修改示例代码实现以下功能:
1. 根据 finger 数量自动计算所需 Contact 数量
2. Contact 间距符合当前工艺 DRC 规则
3. 奇数 finger 时中心对齐
参考实现已上传至:
GitHub 仓库链接 (包含 Calibre 验证结果)
正文完
发表至: 电子设计自动化
近一天内

