1、CMN概述:什么是CMN?为什么需要一致性?CMN在SoC中的位置

1.1 从一次流片失败说起

先讲个故事。我入行第三年,参与了一款手机SoC的设计。团队花了18个月,流片回来,跑Linux没问题,一跑多核Android游戏就死机。查了三个月,最后定位到——CPU和GPU之间缓存数据不一致。

CPU改了内存里的一个纹理数据,GPU不知道,直接用了自己L2 cache里的旧数据。画面撕裂、程序崩溃。嗯,这就是典型的一致性问题

从那以后,我深刻理解了:没有一致性,多核SoC就是一堆各自为政的孤岛

1.2 什么是CMN?

CMN,全称是Coherent Mesh Network,一致性网格网络。它是ARM公司推出的一套片上互连方案。

说白了,CMN就是SoC里所有主设备(CPU、GPU、DSP、NPU)之间的数据高速公路。但它不只是路,它还负责保证:

  • 所有主设备看到的内存数据是同一份
  • 谁改了数据,其他人能及时知道
  • 数据在cache和内存之间不乱窜

核心要点: CMN不是简单的总线,而是一个带一致性协议的互连网络。它实现了硬件层面的缓存一致性,让软件开发者不用操心数据同步问题。

1.3 为什么需要一致性?

你想想看,现代SoC里有多少个处理器核心?

  • 8个CPU核心(大小核架构)
  • 1个GPU(几百个着色器核心)
  • 1个NPU(神经网络处理器)
  • 1个DSP(数字信号处理器)

每个处理器都有自己的cache。CPU改了数据,数据留在L1 cache里。GPU去读内存,读到的还是旧数据。这不就乱套了吗?

我在项目中遇到过最典型的场景:CPU写了一个共享变量,DSP读到的却是旧值。调试了整整一周,最后发现是DMA绕过了一致性协议直接访问内存。

避坑指南: 我曾经在配置CMN时,忘记给某个加速器开启snoop filter功能。结果这个加速器读到的数据永远是过时的。排查了三天,最后发现是HN-F(Home Node Filter)的配置位没置1。这种低级错误,新手特别容易犯。

1.4 CMN在SoC中的位置

CMN位于SoC的中心位置。它连接着:

  • 计算域:CPU集群、GPU、NPU
  • 内存域:DDR控制器、HBM控制器
  • I/O域:PCIe控制器、USB控制器、Ethernet
  • 系统域:调试接口、性能监控单元

我习惯把CMN比作一个十字路口。所有数据流量都要经过它,它负责调度、路由、一致性维护。

下面这张图展示了CMN在典型SoC中的位置:

SoC 芯片 CMN 一致性网格网络 Coherent Mesh Network CPU Cluster Cortex-X4 + A720 + A520 GPU Immortalis-G720 NPU 神经网络处理器 DDR Controller LPDDR5X PCIe Controller Gen5 x16 Debug & PMU 调试与性能监控 计算域 内存域 I/O域 系统域

1.5 CMN的核心组件

CMN不是一块铁板,它由多个组件构成。我挑几个最重要的说:

组件 全称 功能
RN-F Request Node - Full 完全一致性请求节点,CPU集群通过它接入CMN
RN-I Request Node - I/O I/O一致性请求节点,PCIe等外设通过它接入
HN-F Home Node - Full 全功能归属节点,负责目录维护和snoop过滤
SN-F Subordinate Node - Full 从属节点,连接DDR控制器等从设备
XP Crosspoint 交叉点,负责数据包的路由和转发

个人经验: 配置CMN时,HN-F的数量和位置很关键。我习惯把HN-F放在靠近DDR控制器的位置,这样可以减少数据路径的跳数。曾经有个项目,HN-F放得太远,导致内存访问延迟增加了30%。

1.6 一致性协议:MESI的变种

CMN使用的一致性协议是MESI协议的变种,叫做MOESI。多了一个O(Owned)状态。

为什么会这样?

MESI协议里,如果多个CPU共享一份数据,其中一个CPU要修改,必须先把其他CPU的cache line invalidate掉。这个过程会产生大量的snoop广播。

MOESI协议增加了Owned状态:

  • 拥有Owned状态的CPU可以直接响应其他CPU的读请求
  • 不需要每次都去内存拿数据
  • 减少了内存访问次数,降低了延迟

我在项目中遇到过一个问题:某个加速器频繁读写共享数据,导致CMN的snoop traffic暴涨。后来把加速器配置成RN-I(I/O一致性节点),只做简单的监听,不做完整的一致性维护,问题就解决了。

1.7 为什么选择CMN而不是总线?

传统的总线架构(如AXI总线)有什么问题?

  • 带宽瓶颈:所有设备共享一条总线,带宽有限
  • 延迟不可控:设备越多,仲裁越复杂,延迟越大
  • 一致性难做:总线没有内置的一致性协议,需要软件维护

CMN采用网格拓扑,每个节点都有独立的路径。数据可以从CPU直接走到DDR,不需要经过其他设备。这就好比:

  • 总线 = 单车道公路,所有车挤在一起
  • CMN = 城市路网,每个路口都有立交桥

关键区别: CMN的带宽是可扩展的。增加一个CPU集群,只需要增加一个RN-F节点和相应的网格链路。总线架构增加一个主设备,所有设备的带宽都会被稀释。

1.8 实际项目中的CMN配置

拿我最近参与的一个手机SoC项目举例:

  • 8核CPU:1个X4超大核 + 3个A720大核 + 4个A520小核
  • GPU:Immortalis-G720,10核
  • NPU:自研架构,4核
  • DDR:LPDDR5X,4通道

CMN配置如下:

  • 4个RN-F:CPU集群分两组,每组一个RN-F
  • 2个RN-I:GPU和NPU各一个
  • 4个HN-F:每个DDR通道对应一个
  • 8个XP:组成4x4的网格

这个配置下,CPU到DDR的延迟控制在40ns以内,带宽达到200GB/s以上。嗯,这个数据是我亲自用PMU测出来的。

1.9 小结

CMN是当代高性能SoC的数据中枢。它解决了三个核心问题:

  1. 互联:让所有主设备能高效通信
  2. 一致性:保证所有设备看到的数据是统一的
  3. 可扩展:增加设备不影响已有设备的性能

我个人觉得,理解CMN的关键不在于记住那些组件名称,而在于理解数据是怎么流动的,以及一致性是怎么维护的。后面的章节,我会一步步拆解这些细节。

学习建议: 刚开始接触CMN时,不要试图一次性搞懂所有细节。先画一张SoC的框图,标出CMN的位置和主要连接。然后问自己三个问题:数据从哪里来?到哪里去?怎么保证不出错?想清楚这三个问题,你就入门了。


公众号:蓝海资料掘金营,微信deep3321