芯片设计流程概览:从RTL到GDSII的完整流程
做芯片后端设计这么多年,我经常被问到同一个问题:「芯片到底是怎么从代码变成实物的?」
说实话,刚入行那会儿,我也觉得这过程很神秘。RTL 是啥?GDSII 又是啥?中间到底经历了多少步骤?
今天,我就带你走一遍这个流程。不扯虚的,全是实战中摸爬滚打出来的经验。
从 RTL 到 GDSII:一条清晰的路径
整个芯片设计流程,说白了就是把功能描述(RTL)一步步变成物理版图(GDSII)。我习惯把它分成两大阶段:
- 前端设计:负责功能实现,输出网表
- 后端设计:负责物理实现,输出 GDSII
你想想看,前端像建筑师画图纸,后端像施工队盖楼。图纸画得再好,施工出问题,楼照样塌。
我遇到过不少项目,前端 RTL 仿真跑得飞起,结果后端一综合,时序全崩了。为什么?因为前端没考虑物理实现的约束。所以,前后端一定要尽早对齐,别等到最后才发现问题。
完整流程的 7 个关键步骤
嗯,这里我按实际项目中的顺序,给你拆解一下:
- RTL 设计 & 仿真:用 Verilog/VHDL 写代码,验证功能正确性。这一步我建议多跑 corner case,别只盯着 happy path。
- 逻辑综合:把 RTL 转成门级网表。说白了,就是把「if-else」变成「与或非门」。这里要注意约束文件的完整性,我曾经因为漏写一条 false path,导致综合结果多出 20% 的面积。
- 形式验证:检查综合后的网表跟 RTL 功能是否一致。这一步很多人会跳过,但我劝你别省。有一次流片回来发现功能不对,查了三个月,最后发现是综合工具的一个 bug。从那以后,形式验证我一次都没落下。
- DFT(可测试性设计):插入扫描链、BIST 等测试结构。嗯,这里有个坑——DFT 插入后会影响时序,一定要提前评估。
- 后端物理设计:包括布局、时钟树综合、布线。这是最耗时的阶段,也是我今天要讲的重点。
- 物理验证:检查 DRC、LVS、ERC。说白了,就是看你的版图有没有违反工艺规则。我见过最惨的一次,DRC 报了 10 万个错误,整个团队加班两周才清完。
- 签收(Tapeout):生成 GDSII 文件,交给晶圆厂流片。这一步要检查所有文件是否齐全,少一个 mask layer 都可能让芯片报废。
顶层集成与版图合并的角色定位
在整个流程中,顶层集成和版图合并是后端物理设计里最容易被低估的环节。
很多人觉得,不就是把各个模块拼在一起吗?有什么难的?
我告诉你,大错特错。
顶层集成,说白了就是把多个子模块(block)放到一个顶层芯片里,并处理好它们之间的连接、供电、时钟、IO 等。你想想看,一个芯片可能有几十个模块,每个模块都有自己的电源域、时钟域、复位策略。把它们拼在一起,就像把几十个独立的小城市合并成一个超级大都市——交通、水电、通信,哪样都不能乱。
我参与过一个 SoC 项目,顶层集成了 12 个不同的 IP 模块。刚开始觉得很简单,结果一跑顶层 LVS,发现电源网络短路了。查了三天,最后发现是两个模块的 VDD 网络在顶层意外连在了一起。从那以后,我每次做顶层集成,都会先画一张电源网络拓扑图,把每个模块的供电关系理清楚。
版图合并呢?它跟顶层集成是孪生兄弟。版图合并指的是把各个子模块的 GDSII 文件合并到顶层 GDSII 中,并处理模块之间的缝隙、填充、dummy 插入等。
这里有个关键点:合并顺序。我建议先合并大模块,再合并小模块。为什么?因为大模块占地方,先放好大模块,小模块可以见缝插针。反过来,小模块先放,大模块可能放不进去,最后还得重来。
顶层集成与版图合并的核心任务
我整理了一个表格,方便你对照:
| 任务 | 说明 | 常见坑 |
|---|---|---|
| 电源网络规划 | 设计顶层电源网格,确保每个模块供电充足 | IR drop 超标,模块供电不足导致功能失效 |
| 时钟分配 | 将时钟信号从 PLL 分配到各个模块 | 时钟 skew 过大,跨模块时序违例 |
| IO 规划 | 安排芯片的输入输出引脚位置 | IO 拥挤导致布线困难,信号质量下降 |
| 模块间布线 | 连接不同模块之间的信号线 | 长线延迟大,跨模块路径时序不收敛 |
| 物理验证 | 检查 DRC/LVS/ERC 等 | 模块边界处出现 DRC 违例,需要手动修复 |
| 版图合并 | 将子模块 GDSII 合并到顶层 | 合并顺序错误导致模块重叠或空隙 |
一张图看懂顶层集成与版图合并
下面这张 SVG 流程图,是我自己画的。它展示了顶层集成与版图合并在整个芯片设计流程中的位置:
顶层集成中的常见陷阱
做顶层集成这么多年,我踩过的坑不少。挑几个典型的跟你说说:
我曾经在一个项目中,顶层电源网格设计得太稀疏。结果流片回来,芯片在高速运行时,某个模块的电压降到了标称值的 85%。芯片直接罢工。后来我们花了两个月,重新 tapeout 才解决。
建议:做顶层电源规划时,一定要跑 IR drop 分析。别偷懒,多跑几个 corner。
时钟树综合时,很多人只关注模块内部的时钟 skew,忽略了跨模块路径。结果顶层时序分析时,发现一条跨模块路径的 setup 违例了 500ps。最后只能降频使用。
建议:在顶层做时钟树综合时,把跨模块路径的时序约束写清楚。我习惯在顶层加一些 buffer 来调整时钟延迟。
每次做顶层集成前,我都会先画一张模块关系图。图上标清楚每个模块的输入输出信号、时钟域、电源域。这张图不花哨,但非常实用。它能帮你提前发现很多潜在问题。
版图合并的实操要点
版图合并听起来简单,做起来全是细节。我总结了几条实操经验:
- 合并顺序很重要:先大后小,先核心后外围。大模块放好了,小模块自然能找到位置。
- 注意模块边界对齐:两个模块的边界如果没对齐,合并后会出现缝隙或重叠。我建议在模块设计阶段就统一边界格点。
- dummy 填充别省:模块合并后,边界处往往会有空隙。这些空隙如果不填充 dummy,会影响 CMP 平坦度,导致良率下降。
- 跑一遍顶层 DRC:合并完成后,一定要跑顶层 DRC。很多 DRC 违例都出现在模块边界处,比如间距违例、天线违例等。
嗯,这里还要提醒一点:版图合并不是一次性的工作。随着项目推进,模块可能会修改,版图也需要重新合并。所以,我建议把合并流程脚本化,每次合并都跑同一个脚本,避免人为失误。
总结一下
顶层集成与版图合并,说白了就是把芯片的各个部分拼成一个完整的、可制造的物理设计。它不像前端设计那样「高大上」,但它是芯片能否成功流片的关键一环。
我见过太多项目,前端设计完美,后端物理设计也做得不错,结果在顶层集成阶段翻了车。为什么?因为顶层集成涉及的东西太杂了——电源、时钟、IO、布线、验证,哪个环节出问题,芯片都可能报废。
所以,我的建议是:重视顶层集成,把它当作一个独立的、重要的设计阶段来对待。别把它当成「最后拼一下」的收尾工作。
好了,这一章的内容就到这里。记住我今天讲的这些坑和经验,你在实际项目中一定能少走很多弯路。
- 芯片设计流程:RTL → 综合 → 物理设计 → 顶层集成 → 版图合并 → GDSII
- 顶层集成负责模块间的连接、供电、时钟、IO 等
- 版图合并负责子模块 GDSII 的拼接、填充、验证
- 常见陷阱:电源规划不足、跨模块时钟问题、模块边界 DRC 违例
- 实操建议:先大后小、统一格点、脚本化合并流程