1. CMN与CHI概述:互联架构的演进、CMN-600/700系列简介、CHI协议的地位与作用

1.1 从总线到网络:互联架构的演进之路

做芯片互联设计这些年,我最大的感受就是——互联架构的演进,本质上是在解决一个核心矛盾:性能需求越来越高,而物理瓶颈越来越难突破

早期芯片设计,大家用简单的总线结构。比如AMBA 2.0的AHB,一根总线挂几个master和slave,仲裁器决定谁用总线。那时候芯片规模小,主频低,总线够用。但随着多核处理器兴起,总线成了瓶颈——多个核同时访问内存,总线带宽根本不够用。

于是有了交叉开关(Crossbar)。交叉开关让多个master可以同时访问不同的slave,带宽大幅提升。但交叉开关也有问题:面积大、连线复杂。当核数超过8个,交叉开关的复杂度会呈平方级增长,布线都布不通。

嗯,这时候就需要更高级的互联方案了。业界开始转向片上网络(Network-on-Chip,NoC)。NoC把互联从总线拓扑变成了网络拓扑,数据以报文形式在网络中传输。这就像城市交通——从单车道变成了立交桥网络。

ARM的CMN系列,就是NoC思想在ARM生态中的具体实现。我个人习惯把CMN理解为「芯片内部的互联网」——它有路由器、有协议、有流量控制,只不过所有东西都在一颗芯片上。

1.2 CMN-600/700系列:ARM的互联王牌

CMN全称是Coherent Mesh Network,直译过来就是「一致性网格网络」。它解决的核心问题是:多核之间的缓存一致性

你想想看,一个SoC里有十几个CPU核,每个核都有自己的L1/L2缓存。如果核A修改了地址0x1000的数据,核B怎么知道这个地址已经变了?这就是缓存一致性问题。CMN就是负责在核与核之间、核与内存之间,同步这些数据。

CMN-600是ARM在2015年左右推出的第一代一致性网格互联。它支持最多32个CPU核,采用2D mesh拓扑。我记得当时第一次接触CMN-600的项目,最头疼的是它的配置参数——光一个地址映射表就有上百个寄存器要配。

CMN-700是后续的增强版,支持更多核(最多64核),带宽更高,延迟更低。它还引入了CHI协议的一些新特性,比如DVM(Distributed Virtual Memory)操作的优化。

下面这张图展示了CMN-700的基本架构:

CMN-700 基本架构图 CPU Cluster 0 (4核) CPU Cluster 1 (4核) CPU Cluster 2 (4核) CPU Cluster 3 (4核) Router 0 CHI接口 Router 1 CHI接口 Router 2 CHI接口 Router 3 CHI接口 HN-F Home Node HN-I IO Home Node SN-F Memory Controller MN Misc Node 图例 Request Node Router Home Node 实线:数据通道 虚线:网格互联 CHI协议连接

从图上可以看到,CMN-700的核心组件包括:

  • Request Node (RN):请求节点,通常是CPU核或GPU核,发起读写请求
  • Home Node (HN):归属节点,负责管理缓存一致性协议
  • Subordinate Node (SN):从节点,通常是内存控制器或外设
  • Misc Node (MN):杂项节点,处理中断、调试等特殊功能

这些节点通过路由器(Router)组成2D mesh网络。每个路由器有四个方向(东、南、西、北)的连接,数据包在路由器之间跳转,最终到达目的地。

关键点:CMN-700的mesh拓扑不是随便画的。它要保证任意两个节点之间的跳数尽量少,同时还要考虑物理布局——CPU核在芯片上怎么摆,内存控制器在哪个位置,这些都会影响mesh的拓扑设计。

1.3 CHI协议:CMN的「通信语言」

CMN的硬件架构搭好了,节点之间怎么通信?这就需要协议了。CHI(Coherent Hub Interface)就是ARM为CMN量身定制的通信协议。

CHI协议的地位,说白了就是CMN的「灵魂」。没有CHI,CMN只是一堆连在一起的逻辑门,什么也干不了。

CHI协议定义了:

  • 事务类型:读、写、原子操作、DVM操作等
  • 协议状态:缓存行的状态(如Unique、Shared、Invalid等)
  • 流量控制:如何避免网络拥塞
  • 死锁避免:协议层面的死锁预防机制

CHI协议有几个版本:CHI-A、CHI-B、CHI-C、CHI-D。每个版本都在前一个版本上增加新特性。CMN-600支持CHI-B,CMN-700支持CHI-C。

CHI版本 主要特性 对应CMN
CHI-A 基础一致性协议,支持MESI状态 早期原型
CHI-B 增加原子操作、DVM支持 CMN-600
CHI-C 增加QoS、带宽优化、延迟降低 CMN-700
CHI-D 增加CXL支持、更灵活的拓扑 CMN-700 R3+

个人经验:我在做CMN-600项目时,最头疼的是CHI协议的时序收敛。CHI协议要求request和response之间有严格的顺序关系,但物理布局又导致信号延迟很大。后来我们用了pipeline + credit-based flow control才搞定。嗯,这个后面讲RTL实现时会详细说。

1.4 为什么CMN+CHI如此重要?

你可能要问:ARM有那么多互联方案,为什么CMN+CHI成了主流?

原因有三:

  1. 可扩展性:CMN的mesh拓扑可以扩展到几十个核,甚至上百个核。你只需要增加路由器和节点,不需要重新设计互联架构。
  2. 一致性保证:CHI协议提供了硬件级别的缓存一致性。软件不需要操心数据同步问题,这大大降低了多核编程的难度。
  3. 生态成熟:ARM提供了完整的工具链——从配置工具到验证IP,从性能模型到RTL代码。你不需要从零开始设计互联。

避坑指南:我曾经在一个项目中,团队为了「省面积」决定用ACE协议替代CHI。结果验证阶段发现ACE的带宽根本不够,最后不得不重新设计。我的建议是:如果核数超过4个,直接用CHI,别省那点面积。省下来的面积,不够你补性能的坑。

1.5 本章小结

这一章我们聊了:

  • 互联架构从总线到NoC的演进
  • CMN-600/700的基本架构和组件
  • CHI协议的地位和作用
  • CMN+CHI组合的优势

下一章,我们会深入CHI协议的细节——从协议层到事务层,看看数据在CMN中到底是怎么传输的。


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