第三章:封装设计流程——从RTL到GDS,封装设计交接物
各位做芯片后端的朋友,咱们今天聊聊封装设计流程。说实话,很多做数字后端的人,对封装这块儿总觉得隔着一层纱。我当年刚接触先进封装时,也踩过不少坑。今天就把我从RTL到GDS这条路上,封装设计到底交接什么、怎么交接,掰开了讲清楚。
一、封装设计不是“最后一步”
很多人以为封装是芯片设计完了才开始的。其实不然。在先进封装里,尤其是2.5D/3D IC,封装设计和芯片设计是并行推进的。我习惯把整个流程分成三个阶段:
- 前端规划阶段:RTL还没冻结,封装架构就要开始评估
- 中端协同阶段:芯片Place & Route进行中,封装基板布线同步启动
- 后端整合阶段:GDS出来后,做最终的物理验证和签核
说白了,封装设计不是等芯片设计完了再“包一层”,而是从一开始就要参与进来。你想想看,如果等到芯片GDS都出来了,才发现die-to-die接口位置不对,那代价可就大了。
二、封装设计的核心交接物
封装设计过程中,有几个关键的交接物。我每次做项目,都会盯着这几个文件反复确认。它们就像封装设计的“身份证”,缺一不可。
1. Netlist——封装互连的“蓝图”
封装级的Netlist和芯片级的Netlist不太一样。芯片级Netlist描述的是晶体管和标准单元之间的连接,而封装级Netlist描述的是die、中介层(Interposer)、基板(Substrate)之间的连接关系。
封装Netlist包含的内容:
- 各个die的端口定义(端口名、坐标、层数)
- die-to-die的互连关系
- die-to-substrate的连接
- 电源/地网络的分配
- 关键信号的拓扑约束
我记得有一次,客户给的封装Netlist里,一个die的电源端口名字写错了,导致后面整个电源网络分析都跑偏。后来花了三天才定位到问题。所以我现在拿到Netlist,第一件事就是做端口名一致性检查。
2. LEF/DEF——封装物理信息的“载体”
LEF(Library Exchange Format)和DEF(Design Exchange Format)在封装设计里,作用比芯片级更复杂。封装级的LEF/DEF主要描述的是:
- LEF:die的边界、bump/pad的位置、尺寸、层叠信息
- DEF:die在封装中的具体摆放位置、旋转角度、互连线的布线信息
这里有个坑,我特别想提醒大家。芯片级的LEF通常只包含标准单元和宏单元的信息,但封装级的LEF必须包含bump map和micro-bump的详细信息。如果bump的坐标和芯片内部IO pad的坐标对不上,后面做物理验证时就会报出一堆DRC错误。
我的经验:在生成封装LEF时,一定要和芯片后端团队确认bump的坐标原点是否一致。我曾经遇到过芯片用左下角为原点,封装用中心为原点,结果bump位置整体偏移了50um。这种低级错误,提前对齐就能避免。
3. GDS——最终交付的“实物”
封装级的GDS和芯片级的GDS,层级结构完全不同。芯片GDS里是标准单元、宏单元、金属层,而封装GDS里是:
- 中介层(Interposer)的金属层和TSV
- 基板的布线层和过孔
- bump和micro-bump的图形
- die的边界标记(用于对准)
- 标记点(Fiducial Mark)
封装GDS的合并是个技术活。我习惯用Calibre的MERGE命令,把各个die的GDS和封装基板的GDS合并成一个完整的GDS。但要注意,合并时一定要保持各层的命名规则一致,否则后面做LVS时会报“unrecognized layer”错误。
三、从RTL到GDS的封装设计流程
下面这张图是我自己总结的封装设计流程,大家可以参考一下。
四、交接物之间的“对账”
这三个交接物不是孤立的。它们之间必须严格对应。我每次做项目,都会做一次“三表对账”:
| 检查项 | Netlist vs LEF/DEF | LEF/DEF vs GDS | Netlist vs GDS |
|---|---|---|---|
| 端口一致性 | 端口名、方向匹配 | 端口坐标、层数匹配 | 端口连接关系一致 |
| 电源网络 | 电源域划分一致 | 电源线宽、间距符合规则 | 电源网络拓扑一致 |
| 信号完整性 | 关键信号约束一致 | 信号线长度、屏蔽符合要求 | 信号连接关系正确 |
| 物理尺寸 | die尺寸与LEF一致 | GDS中die边界与DEF一致 | 整体尺寸匹配 |
注意:我曾经在一个3D IC项目中,Netlist里定义了一个die有2000个bump,但LEF里只画了1800个bump的图形。结果LVS跑出来报了200个端口不匹配的错误。后来发现是LEF生成脚本里漏掉了一组bump。这种问题,提前做一致性检查就能避免。
五、实际项目中的交接物管理
我个人的习惯是,每个交接物都要有版本号。比如:
pkg_netlist_v1.2.spi—— 封装Netlistpkg_lef_v1.2.lef—— 封装LEFpkg_def_v1.2.def—— 封装DEFpkg_gds_v1.2.gds—— 封装GDS
版本号要统一。如果Netlist更新到v1.3,那么LEF/DEF和GDS也要同步更新。否则就会出现“Netlist说连A点,GDS里A点却不存在”的尴尬情况。
另外,交接物之间最好做一个交叉检查脚本。我写过一个小脚本,专门检查Netlist里的端口是否在LEF中都有对应的bump图形。这个脚本帮我抓出过好几次遗漏。
六、避坑指南
我曾经踩过的坑:
- 坐标原点不一致:芯片用左下角,封装用中心,导致bump整体偏移。解决方案:在项目启动时就约定好坐标原点,并在交接物中明确标注。
- 层号映射错误:芯片的M1层在封装里对应的是哪一层?如果没有统一的层映射表,GDS合并时就会乱套。我建议做一个层映射文件(Layer Map),双方确认后再开始工作。
- Netlist里漏了电源端口:有一次客户给的Netlist里,一个die的VDD端口没连出来,导致电源网络分析时那个die一直是0V。后来手动补上才通过。所以Netlist一定要做电源完整性检查。
好了,关于封装设计流程和交接物,今天就聊到这儿。这些文件看起来简单,但每个细节都可能影响最终流片的成败。做封装设计,耐心和细心比技术本身更重要。
可可精品资料库