第一章:层次化设计概述
什么是层次化设计
层次化设计,说白了就是把一个大芯片拆成若干小块来设计。你想想看,一个复杂的SoC可能有上亿个晶体管,谁有本事一口气画完?反正我是不行。
我刚开始做版图那会儿,接手的是一个简单的LDO模块,几千个管子,一个人吭哧吭哧画了两周。后来项目越来越大,遇到一个上百万门的数字模块,直接傻眼了——别说画了,光看网表就头晕。嗯,那时候我才真正理解什么叫「层次化设计」。
层次化设计就是把系统按功能拆分成多个层次。顶层只负责模块间的连接,底层才管具体的晶体管和走线。每个层次都有自己的抽象级别,上层不用关心下层的细节。
核心定义:层次化设计是一种自顶向下、逐层细化的设计方法。每个层次封装了特定的功能和实现细节,对外只暴露接口。
为什么需要层次化设计
我遇到过不少新手,上来就问:「老师,我直接画一个大的不行吗?」行,当然行,但你试试看——
- 管理复杂度:一个100万晶体管的芯片,拆成10个10万管的模块,每个模块再拆成10个1万管的子模块。你每次只需要面对1万管,而不是100万管。这就像写文章,没人会一口气写10万字,都是分章节写的。
- 团队协作:我在某芯片公司带团队时,一个项目5个人同时做。每个人负责一个模块,最后在顶层拼起来。如果没有层次化,5个人改同一个文件,那画面太美我不敢看。
- 复用性:有些模块是通用的,比如PLL、ADC、SRAM。设计一次,后面项目直接拿来用。我手头有个DDR接口的模块,从28nm到7nm用了三代工艺,每次只改底层器件,顶层纹丝不动。
- 调试效率:出问题了,直接定位到某个模块。我曾经遇到一个时序问题,如果是平铺设计,得翻遍整个版图;但因为是层次化设计,我直接锁定了顶层的一个子模块,半天就找到了问题根源。
| 对比项 | 平铺设计 | 层次化设计 |
|---|---|---|
| 设计规模 | 适合小规模(<1万管) | 适合大规模(>10万管) |
| 团队协作 | 几乎不可能 | 天然支持 |
| 复用性 | 差,每次重画 | 好,模块可复用 |
| 调试难度 | 高,全局搜索 | 低,逐层定位 |
| EDA工具效率 | 低,全芯片处理 | 高,逐层优化 |
层次化设计的核心思想
核心思想就三个词:分而治之、抽象封装、逐层验证。
分而治之
这是最根本的思想。把大问题拆成小问题,小问题再拆成更小的问题,直到每个问题都简单到可以轻松解决。我在华大九天的工具里做层次化设计时,通常会把芯片拆成3-5层:顶层、功能模块层、子模块层、单元层、器件层。
抽象封装
每个模块只暴露接口,隐藏内部实现。就像你开车,你只需要知道方向盘、油门、刹车怎么用,不需要知道发动机内部怎么工作的。在版图设计中,顶层设计者只需要知道模块的边界、端口位置、电源地网络,不需要关心模块内部怎么走线。
我的经验:定义接口时一定要留余量。我曾经因为端口位置定得太死,导致底层模块布线时发现走不通,最后不得不改顶层。现在我的习惯是:接口位置先定个大概,等底层模块做完再微调。
逐层验证
每一层设计完成后都要做验证,确保这一层没问题了再往上走。我见过最惨的案例:有人一口气画完了整个芯片,结果顶层发现底层有个模块的电源地接反了,全部重来。嗯,从那以后我每做完一层就做一次LVS和DRC。
避坑指南:我曾经在一个项目中,底层模块的LVS过了,但顶层拼起来后LVS报错。查了两天才发现,底层模块的电源网络命名和顶层不一致。所以,命名规范一定要统一,最好在项目开始前就定好规则。
在实际项目中,我一般这样操作:先用华大九天的工具搭好顶层框架,定义好所有模块的接口和尺寸。然后分给团队成员各自做底层。每做完一层,我就用工具做一次层次化LVS,确保连接正确。最后在顶层做全芯片的DRC和LVS。
你可能会问:「这样会不会很慢?」其实恰恰相反。因为每一层都验证过了,顶层拼起来基本一次过。我见过平铺设计的项目,改版次数是层次化设计的3倍以上。时间都花在反复修改上了。
一句话总结:层次化设计不是可选项,而是大规模芯片设计的必选项。它让复杂的事情变简单,让不可能的事情变可能。