共计 2253 个字符,预计需要花费 6 分钟才能阅读完成。
背景痛点
在芯片设计的物理实现阶段,Pad 的绘制是一个重复性极高但又必须精确完成的任务。传统手动绘制方式存在几个明显痛点:

- 耗时严重:一个中等复杂度的芯片可能包含数百个 Pad,每个 Pad 需要单独设置参数、绘制图形、检查 DRC
- 人为错误风险:手动操作易出现坐标计算错误、层次错放、参数不一致等问题
- 修改困难:设计变更时需逐个调整 Pad,效率低下且难以保证全局一致性
技术选型
实现 Pad 自动化的常见方案包括:
- EDA 工具 GUI 操作录制
- 优点:无需编程,快速实现简单自动化
-
局限:灵活性差,无法处理复杂逻辑,维护困难
-
Python 脚本 +API 调用
- 优点:生态丰富,适合复杂算法
-
局限:依赖外部环境,执行效率较低
-
Skill 脚本原生开发
- 优势:直接操作设计数据库,执行效率最高;与 Cadence 环境无缝集成
- 不足:学习曲线较陡,调试工具较弱
对于 Pad 绘制这种需要高频访问设计数据的场景,Skill 脚本在性能和集成度上具有不可替代的优势。
核心实现
参数化设计框架
建立参数化的 Pad 生成函数,核心参数包括:
procedure(createParametricPad(@key (layer "METAL") ; 指定默认层
@key (width 50.0) ; 默认宽度(um)
@key (height 50.0) ; 默认高度
@key (x 0.0) ; X 坐标
@key (y 0.0) ; Y 坐标
@key (shape "rect") ; 形状类型
))
几何计算要点
- 坐标系统转换:处理不同坐标系(设计坐标 vs 版图坐标)
- 边界计算:根据 Pad 尺寸和间距要求计算有效区域
- 特殊形状处理:圆形 / 八角形等非矩形 Pad 的顶点生成算法
完整代码示例
/*
* 生成参数化 Pad 的 Skill 脚本
* 支持矩形 / 圆形 / 八角形三种基本形状
*/
procedure(createPad(@key (lib "mylib") ; 库名称
@key (cell "top") ; 单元名称
@key (view "layout") ; 视图名称
@key (layer "METAL1") ; 目标层
@key (width 50.0)
@key (height 50.0)
@key (x 0.0)
@key (y 0.0)
@key (shape "rect")
@optional (rotation 0) ; 旋转角度
))
let((cv shape)
; 打开或创建目标单元
cv = ddGetObj(lib cell view)
unless(cv cv = dbOpenCellViewByType(lib cell view "maskLayout" "w"))
; 根据形状类型生成几何图形
case(shape
("rect"
shape = dbCreateRect(cv
list(layer "drawing")
list(x:y x+width:y x+width:y+height x:y+height)
))
("circle"
let((radius)
radius = width/2
shape = dbCreateEllipse(cv
list(layer "drawing")
list(x:y)
radius:radius
radius:radius
0.0
)))
("octagon"
let((points delta)
delta = min(width height)*0.2
points = list(
x:y+delta
x+delta:y
x+width-delta:y
x+width:y+delta
x+width:y+height-delta
x+width-delta:y+height
x+delta:y+height
x:y+height-delta
)
shape = dbCreatePolygon(cv
list(layer "drawing")
points
)))
)
; 处理旋转
when(rotation != 0
dbSetTransform(shape
list(rotation:rotation
list(x+width/2:y+height/2)
))
)
; 返回创建的对象句柄
shape
)
性能优化技巧
算法层面
-
批量操作 :使用
mapcar代替循环处理 Pad 阵列; 低效做法 for(i 1 100 createPad(x i*100 y 0) ) ; 高效做法 mapcar('createPad makeList(100 'x @ 100:9900:100'y 0) ) -
空间索引优化 :利用
dbGetOverlaps快速定位相邻 Pad
执行层面
- 延迟更新:在大量操作前调用
deferUpdate(true) - 内存管理:及时释放临时变量,特别是几何对象
- 并行处理 :对独立 Pad 组使用
thread特性(需环境支持)
避坑指南
常见错误
- 单位混淆:确保所有参数使用同一单位(通常为 um)
- 层设置遗漏:忘记指定 pin/purpose 导致 LVS 错误
- 坐标偏移:未考虑旋转中心点导致位置偏差
最佳实践
- 参数校验:添加类型和范围检查
unless(numberp(width) && width > 0 error("Width must be positive number") ) - 异常处理 :使用
protect/endprotect保证资源释放 - 日志输出 :关键步骤添加
printf调试信息
扩展方向
- 多 Pad 类型支持:增加 Bump/RDL 等复杂结构
- 智能排列:根据 Die Size 自动计算最优 Pad 分布
- CI 集成:与 Jenkins 联动实现自动版图验证
- 可视化配置:开发 GUI 界面供非工程师使用
通过 Skill 脚本实现 Pad 自动化,我们实测将原本需要 8 小时的手动工作缩短到 15 分钟以内,且彻底消除了人为错误。建议读者从简单矩形 Pad 开始,逐步扩展脚本功能,最终构建完整的 Pad 设计自动化框架。
正文完
