3、几何建模:中介层(Interposer)与RDL层几何参数化建模、Python脚本驱动CAD
各位同学,咱们今天聊聊几何建模这块硬骨头。说实话,很多做仿真的朋友容易忽略这一步,觉得网格画好、求解器选对就万事大吉。但我个人经验告诉我——几何模型建得不对,后面全是白费功夫。尤其是2.5D封装里的中介层和RDL层,尺寸精度差个几微米,应力结果可能就完全不一样了。
3.1 中介层的几何参数化思路
中介层,说白了就是硅或者玻璃做的“转接板”。它上面要打TSV(硅通孔),下面要连Bump,中间还要走RDL线。你想想看,这么多结构叠在一起,如果每个尺寸都写死,那改一次参数就得重画一遍模型,累不累?
所以我建议从一开始就搞参数化建模。把关键尺寸定义成变量,比如:
- 中介层厚度(H_interposer):典型值100~300μm
- TSV直径(D_tsv):一般10~50μm
- TSV间距(Pitch_tsv):40~100μm
- RDL线宽/线距(W_rdl, S_rdl):2~10μm级别
- 介质层厚度(H_dielectric):5~20μm
把这些参数放在脚本最前面,后面所有几何操作都引用这些变量。改设计?改一行参数就行。我在项目中遇到过客户临时要求把中介层厚度从200μm改成150μm,要是没做参数化,那得重画一整天。有了参数化,改个数字,重新跑一遍脚本,十分钟搞定。
核心原则:能用变量就别用常量。变量名要起得一看就懂,别用a、b、c这种,过两周你自己都忘了是啥。
3.2 RDL层的分层建模策略
RDL层不是一层铜皮那么简单。实际封装里,RDL是分层堆叠的——介质层、种子层、电镀铜层,有时候还有阻焊层。每一层的材料属性不同,厚度也不同,仿真时必须分开建模。
我个人习惯这样分层:
| 层名 | 材料 | 典型厚度(μm) | 作用 |
|---|---|---|---|
| 顶层介质 | PI或PBO | 5~15 | 保护层、应力缓冲 |
| RDL铜层 | 电镀铜 | 3~10 | 信号布线 |
| 种子层 | Ti/Cu | 0.1~0.5 | 电镀基底 |
| 底层介质 | SiO2或SiN | 2~5 | 绝缘隔离 |
注意,种子层虽然很薄,但它的杨氏模量和铜不一样,应力传递时会有影响。我曾经偷懒没建种子层,结果仿真出来的RDL剥离应力比实测低了30%……嗯,后来再也不敢省这步了。
3.3 Python脚本驱动CAD——以PyAnsys为例
好,理论说完了,咱们上点干货。怎么用Python脚本驱动CAD建模?我推荐用PyAnsys的Mapdl模块,或者直接用pyansys库调用APDL命令。下面给一个完整的参数化建模脚本示例:
# -*- coding: utf-8 -*-
"""
2.5D封装中介层与RDL层参数化建模脚本
作者:资深封装仿真工程师
"""
import pyansys
from pyansys import Mapdl
# ========== 参数定义区 ==========
H_interposer = 200e-6 # 中介层厚度 200μm
D_tsv = 30e-6 # TSV直径 30μm
Pitch_tsv = 80e-6 # TSV间距 80μm
W_rdl = 8e-6 # RDL线宽 8μm
S_rdl = 8e-6 # RDL线距 8μm
H_rdl_cu = 5e-6 # RDL铜厚 5μm
H_dielectric_top = 10e-6 # 顶层介质厚度 10μm
H_dielectric_bot = 3e-6 # 底层介质厚度 3μm
L_chip = 5e-3 # 芯片边长 5mm
N_tsv_x = 10 # X方向TSV数量
N_tsv_y = 10 # Y方向TSV数量
# ========== 启动ANSYS ==========
mapdl = Mapdl()
mapdl.prep7() # 进入前处理
# ========== 创建中介层块体 ==========
mapdl.block(0, L_chip, 0, L_chip, 0, H_interposer)
# ========== 创建TSV圆柱 ==========
# 循环生成TSV阵列
for i in range(N_tsv_x):
for j in range(N_tsv_y):
x_center = (i + 0.5) * Pitch_tsv
y_center = (j + 0.5) * Pitch_tsv
# 创建圆柱体(TSV)
mapdl.cyl4(x_center, y_center, D_tsv/2, 0, D_tsv/2, 360, H_interposer)
# ========== 创建RDL层 ==========
# 先建底层介质
mapdl.block(0, L_chip, 0, L_chip, H_interposer, H_interposer + H_dielectric_bot)
# 建RDL铜线(简化:用长方体代替实际走线)
# 实际项目中需要根据GDS版图逐条生成
for i in range(N_tsv_x - 1):
x_start = (i + 0.5) * Pitch_tsv
x_end = x_start + W_rdl
y_start = 0
y_end = L_chip
z_bot = H_interposer + H_dielectric_bot
z_top = z_bot + H_rdl_cu
mapdl.block(x_start, x_end, y_start, y_end, z_bot, z_top)
# 建顶层介质
mapdl.block(0, L_chip, 0, L_chip,
H_interposer + H_dielectric_bot + H_rdl_cu,
H_interposer + H_dielectric_bot + H_rdl_cu + H_dielectric_top)
# ========== 布尔运算:从中介层中减去TSV孔 ==========
# 这一步是为了在中介层中挖出TSV孔洞
all_tsv = mapdl.vsel('s', 'type', 1) # 假设TSV是第一个创建的体
mapdl.cmsel('s', 'interposer_volu')
mapdl.vsbv('all', 'all') # 体减操作
print("几何建模完成!")
print(f"中介层尺寸: {L_chip*1e3:.1f}mm x {L_chip*1e3:.1f}mm x {H_interposer*1e6:.0f}μm")
print(f"TSV数量: {N_tsv_x * N_tsv_y} 个")
print(f"RDL线宽/线距: {W_rdl*1e6:.0f}/{S_rdl*1e6:.0f} μm")
小技巧:脚本里的参数定义区最好单独放一个文件(比如params.py),主脚本用from params import *导入。这样改参数时不用翻找主脚本,也方便做参数扫描分析。
3.4 几何建模的避坑指南
做几何建模这么多年,我踩过的坑不少。挑几个典型的跟大家说说:
- 布尔运算失败:当TSV和RDL靠得太近时,布尔减操作容易报错。解决办法是给TSV和RDL之间留至少1μm的间隙,或者用
vovlap(体搭接)代替vsbv(体减)。 - 网格划分时出现畸形单元:RDL层很薄(几微米),而中介层很厚(几百微米),直接划分网格会在厚度方向产生高长宽比的单元。我建议分层划分网格——每层单独设定单元尺寸。
- 坐标系混乱:APDL默认是笛卡尔坐标系,但有些用户习惯用柱坐标定义TSV。记得在创建TSV前切换坐标系:
csys,1(柱坐标),用完再切回来csys,0。
警告:千万不要在同一个体上反复做布尔运算!每做一次布尔运算,ANSYS内部会生成新的图元编号,搞不好就把之前的编号搞乱了。我建议先把所有几何体建好,最后统一做一次布尔运算。
3.5 从GDS版图到仿真几何的转换思路
实际项目中,RDL的走线不是简单的横平竖直,而是根据GDS版图来的。怎么把GDS导入到仿真模型里?我常用的方法有两种:
- 直接导入法:用
pyansys的gds2ansys工具(如果有的话),或者先把GDS转成DXF,再导入ANSYS。 - 脚本生成法:解析GDS文件,提取每层图形的多边形坐标,然后用APDL的
polygon或block命令逐层生成。这个方法更灵活,但写脚本的工作量大一些。
我个人偏向第二种。虽然前期写脚本费点功夫,但一旦写好,后面改设计、做参数扫描就方便多了。而且脚本可以复用——换个封装项目,改改参数就能用。
3.6 本章知识体系总览
下面这张图总结了咱们这章的核心内容,从参数定义到脚本实现,再到避坑要点,一目了然:
嗯,这章内容就到这儿。几何建模是仿真的地基,地基打不牢,后面算得再漂亮也是空中楼阁。希望大家在实际项目中,能养成参数化建模的好习惯——相信我,你会感谢自己的。
公众号:蓝海资料掘金营,微信deep3321