SoC 模块划分原则:时钟域、电压域、复用度、团队边界四条判据怎么落地
更新时间:2026-10-28。前面 SoC、ASIC、MCU 的区别 讲了 SoC 是「把一整套系统集成进一颗芯片」,一颗芯片里有什么 给了一颗芯片的内部剖面。这一篇往架构阶段走一步:当系统规格定下来之后,第一件大事就是把这颗 SoC 切成若干模块。切得好,后面 RTL、验证、综合、后端、低功耗全都顺;切得烂,每一步都在还债。
本文要回答的问题
- SoC 模块划分到底在划什么?和软件工程的模块划分有什么不同?
- 时钟域、电压域、复用度、团队边界这四条判据各自怎么操作、冲突时谁优先?
- 一个 MCU 级 SoC 按这四条判据切出来长什么样?
- 为什么「一个 Verilog 文件一个模块」「按文件目录划分」是最常见的反例?
一、模块划分划的不是代码,是边界
很多从软件转过来的工程师会把「模块划分」理解成「把代码拆成几个文件/几个 class」。在 SoC 里这只对了一小半。SoC 的模块边界一旦画下去,同时决定了四件物理与工程事实:
读这张卡抓住一句话:模块边界是时序、功耗、物理、工程四条线的共同切点。所以划分的第一条纪律是——边界一经冻结就不能随代码重构随便动,动一次边界,验证环境、约束文件、UPF、后端布局全部跟着返工。这也是为什么划分发生在架构阶段,而不是 RTL 写到一半再说。
软件里重构一个模块边界代价是几小时编译;芯片里改一次边界,代价是验证回归重跑、网表重做、时序重签,按周计。这个数量级差异决定了 SoC 划分必须「先想清楚再动手」。
二、判据一:时钟域——异步边界必须落在模块边界上
第一条、也是优先级最高的判据:一个模块内部只用一个时钟(及其派生门控时钟),跨时钟域的信号只能出现在模块边界上。
原因很简单:跨时钟域(CDC,Clock Domain Crossing)信号需要专门的同步器(双触发器同步、异步 FIFO、握手协议),这些同步器必须被显式设计、显式验证。如果允许模块内部藏着一个时钟域交叉点,CDC 检查工具和验证计划都会漏掉它——而亚稳态问题在仿真里大概率不暴露, silicon 上偶发死机,是最贵的 bug 类别之一。亚稳态的原理见 建立保持时间与亚稳态。
落地做法:
- 先列出系统里所有时钟:CPU 主时钟、总线时钟、各外设时钟(UART 波特率时钟、USB 48MHz、RTC 32.768kHz……);
- 按时钟把功能聚类,同钟的功能才允许同模块;
- 凡是必须跨域的通路,把同步器做成边界上的标准件(如异步 FIFO 模块),并在模块接口清单里显式标注「此端口为异步接口」。
时钟域划完之后,复位树、时钟门控策略、时序约束文件(SDC)的骨架就自然长出来了。时钟与复位的基础概念可回看 时钟与复位入门。
三、判据二:电压域与电源岛——能关断的必须能独立成块
第二条判据从低功耗来:凡是要独立电源管理(独立关断、独立调压)的功能,必须划成独立模块。
一颗现代 SoC 不会所有模块永远上电。典型策略:
- 常开域(always-on):RTC、唤醒逻辑、电源管理单元本身,常供电,用极低功耗设计;
- 可关断域:GPU、视频编解码、ISP 等大引擎,不用时整片断电(power gating);
- 动态调压域:CPU 集群按负载调压调频(DVFS),独立供电轨。
这些「电源岛」的边界必须和模块边界对齐——电源岛的开关、隔离单元(isolation cell)、电平转换器(level shifter)都插在边界上。如果一个模块一半在常开域、一半在可关断域,物理上无法实现干净关断。电源意图用 UPF(Unified Power Format)描述,按模块层次书写,细节见 低功耗设计与 UPF。
电压域与时钟域经常正交:同一个电压域里可以有多个时钟,同一个时钟也可以跨电压域(配 level shifter)。划分时两条判据都要过一遍,取并集切出的块才是最终边界。
四、判据三:复用度——买的 IP 和自研的模块分开管
第三条判据从工程资产来:按「复用粒度」切模块,让可复用的部分自成边界。
一颗 SoC 的模块按来源大致分三类:
| 来源 | 例子 | 对边界的要求 |
|---|---|---|
| 外购/授权 IP | CPU 核、DDR 控制器、USB 控制器 | 接口是固定的(AMBA 等),边界被 IP 供应商预先定义,顺着用,不要拆穿它 |
| 公司级平台 IP | 自研总线、DMA、中断控制器 | 跨项目复用,接口冻结,按平台规范成块 |
| 本项目的定制逻辑 | 专用加速器、胶合逻辑 | 自由度最大,按前两条判据切 |
外购 IP 的接口协议(如 AMBA AHB/APB/AXI)天然就是模块边界——这也是为什么 SoC 架构图看起来总是「一条总线挂一圈 IP」的菊花状,总线协议把模块间的契约标准化了。协议入门见 AMBA 总线入门、片上总线,IP 的概念见 IP 核是什么。
复用判据的实践含义:自研部分切模块时,问自己「这块逻辑下一个项目还会用吗」——会的,就按通用接口标准包成独立 IP;不会的,边界可以按本项目时序/功耗最优来切,不必强求通用。
五、判据四:团队边界——一个模块一个负责人
最后一条是组织判据,也是最容易被技术人忽视、却经常最终决定划分方案的一条:模块粒度要对齐团队分工,一个模块一个明确负责人,模块间接口就是人与人之间的契约。
经验法则:一个 RTL 工程师能有效负责的规模大约是几万到十几万门级别的模块;模块再大,内部要再分子模块并让同一人统管;模块间接口文档(端口、时序、寄存器映射)就是两个团队之间的合同,改接口要走正式的变更流程。寄存器映射的组织方式见 寄存器映射入门。
这条判据还解释了一个现象:两家公司的同类产品,SoC 模块划分经常长得不一样——因为划分方案里沉淀了各自的 IP 资产和团队结构,没有唯一的「标准答案」。
六、实例:一个 MCU 级 SoC 按四条判据切出来
把四条判据套在一个典型的 Cortex-M 级 MCU SoC 上:
读这张图抓住四条判据是怎么落上去的:时钟域把图切成了 fast / periph / aon 三大块,所有跨域通路都收敛到「AHB2APB 桥」和 PMU 控制这两个显式边界上;电压域让 aon(绿色,常开域)和 analog(橙色,模拟独立供电轨)独立成块,主域可被 PMU 整体门控;复用度体现在 CPU、DMA、总线矩阵是外购或平台 IP,边界顺着 AMBA 接口走;团队边界上,每个 APB 外设(UART/SPI/定时器)都是标准粒度的小模块,一个人或一个小型任务就能认领,总线与系统集成由架构组负责。
注意一个细节:PLL 和 ADC 虽然规模很小,也独立成块——因为模拟电路的供电、版图、验证流程和数字完全不同,这是电压域/工艺判据压过了「规模小可以合并」的直觉。
七、反例:按 Verilog 文件划分模块
最后说最常见的错误做法:模块边界跟着文件走——一个 .v 文件就是一个模块,文件怎么目录化,模块就怎么分。
为什么是反例,对照四条判据看:
- 文件是代码组织的维度,不承担任何时序/功耗/物理语义。一个文件里混两个时钟域,CDC 检查全漏;
- 按文件切出来的「模块」往往没有定义良好的接口——信号随便跨文件拉线,模块间契约不存在,换人维护即灾难;
- 验证无法按文件切 testbench,覆盖率、回归都没法归属;
- 综合与后端拿到的是一堆无层次的平铺逻辑,层次化时序签核、增量编译全部失效。
正确的方向恰好相反:先按四条判据定模块架构,再决定每个模块的 RTL 拆成几个文件。文件服务于模块,模块服务于架构。一个模块拆多个文件(数据通路、控制、寄存器各一文件)完全正常;反过来一个文件塞多个模块、或模块边界与架构图对不上,就是坏味道。
用一张思维导图收拢全篇的判据体系:

这张导图同时给出了推荐的落地顺序:时钟树优先(时序正确性是底线,不可妥协),电源岛次之(物理可实现性约束),IP 资产与团队分工最后对齐(工程效率约束)。四条判据冲突时,大体按这个顺序让路。
这一篇在知识体系里的位置
- 划分之前先理解一颗芯片里有什么、SoC 是什么:一颗芯片里有什么、SoC、ASIC、MCU 的区别;
- 模块间靠什么互连:AMBA 总线入门、片上总线;
- 时钟域交叉的底层原理与复位设计:建立保持时间与亚稳态、复位设计;
- 电压域与电源意图的工程表达:低功耗设计与 UPF;
- 划分完之后进入实现:RTL 设计、芯片设计流程。
一句话总结
一句话总结:SoC 模块划分划的不是代码而是时序、功耗、物理、工程四条线的共同边界,四条判据按优先级落地——时钟域(模块内单时钟、CDC 只在边界、同步器标准化)、电压域(电源岛对齐模块边界、常开域独立、UPF 按模块书写)、复用度(外购与平台 IP 顺标准接口用、定制逻辑自由切)、团队边界(一个模块一个负责人、接口即契约);冲突时时钟优先、电源次之、资产与人力最后对齐,而「按 Verilog 文件划分」是最典型的反例——文件服务于模块,模块服务于架构,顺序不能反。