4、AXI互连架构:共享总线、交叉开关与网络片上互连
各位好,今天我们聊聊AXI互连架构。说白了,就是怎么把多个主机(Master)和多个从机(Slave)高效地连在一起。我在项目中见过不少团队,协议背得滚瓜烂熟,一到选互连架构就懵了。嗯,今天咱们就把这事掰扯清楚。
4.1 三种核心架构概览
先看一张总览图,我习惯用这张图来跟团队快速对齐思路:
4.2 共享总线架构
共享总线,这是最朴素的做法。所有主机挂在一条总线上,谁想发数据,得先申请。仲裁器说了算。
单主机多从机场景:只有一个CPU,挂了一堆外设。这种情况最简单,不需要仲裁。地址译码器根据地址范围选通对应的从机。我在做第一个SoC项目时,用的就是这种结构。当时觉得够用了,确实也够用。
多主机多从机场景:多个CPU或DMA都要访问内存和外设。这时候仲裁器就忙了。常见的仲裁策略有固定优先级和轮询两种。
关键点:共享总线的瓶颈在于——同一时刻只能有一个主机发起传输。其他主机都得等着。你想想看,如果两个CPU都在跑密集计算,一个等另一个释放总线,性能直接腰斩。
我的经验:共享总线适合主机数不超过3个的场景。超过3个,我建议直接上交叉开关。我曾经在一个项目里硬撑到4个主机,结果性能调优调了两个月,最后还是改了架构。
4.3 交叉开关架构
交叉开关(Crossbar)解决了并行访问的问题。每个主机到每个从机都有独立的物理路径。说白了,就是给每个主机配了一条专用通道。
举个例子:主机A访问从机1,主机B访问从机2,这两件事可以同时发生,互不干扰。这才是真正的并行。
地址译码与路由:交叉开关内部有一个路由矩阵。每个主机发起的传输,先经过地址译码,确定目标从机,然后路由矩阵建立连接。连接建立后,数据直接走专用通道。
| 特性 | 共享总线 | 交叉开关 |
|---|---|---|
| 并行度 | 1(串行) | N(并行) |
| 面积开销 | 低 | 高(O(N²)) |
| 最大主机数 | 3-4 | 8-16 |
| 适用场景 | 低带宽、小系统 | 中高带宽、多核 |
注意:交叉开关的面积随端口数平方增长。8个主机8个从机,内部就有64条路径。布线资源消耗巨大。我见过一个团队,为了追求极致性能,做了16x16的交叉开关,结果芯片面积超标,最后不得不降级。
4.4 网络片上互连架构
当主机数量超过16个,交叉开关就扛不住了。这时候需要网络片上互连(Network-on-Chip,NoC)。
NoC的思路跟计算机网络很像。数据被封装成包,通过路由器逐跳转发。每个路由器只连接相邻的几个节点,所以扩展性极好。
路由器结构:一个典型的NoC路由器有5个端口(东、南、西、北、本地)。每个端口都有输入缓冲、路由计算、交换分配和交叉开关。
// 简化的NoC路由器伪代码
module noc_router (
input [DATA_WIDTH-1:0] data_in [0:4], // 5个输入端口
output [DATA_WIDTH-1:0] data_out[0:4] // 5个输出端口
);
// 路由计算:根据目标地址决定输出端口
// 交换分配:仲裁多个输入请求同一输出端口
// 交叉开关:将输入连接到输出
endmodule
路由算法:最常用的是XY路由。先沿X方向走到目标列,再沿Y方向走到目标行。死锁问题可以通过虚通道(Virtual Channel)解决。
避坑指南:我曾经在一个NoC设计中忽略了死锁问题。两个路由器互相等待对方释放资源,整个系统卡死了。后来加了虚通道才解决。记住,NoC设计一定要做死锁分析。
4.5 如何选择?
选哪种架构,我一般看三个指标:主机数量、带宽需求、面积预算。
- 主机 ≤ 3,带宽低:共享总线。简单、省面积、够用。
- 主机 4-16,带宽高:交叉开关。并行度高,但注意面积。
- 主机 > 16,可扩展:NoC。复杂但灵活,适合大规模系统。
嗯,这里要注意:实际项目中往往是混合架构。比如,CPU集群内部用交叉开关,集群之间用NoC连接。我最近做的一个AI芯片,就是这种设计。
好了,关于互连架构就聊这么多。记住,没有最好的架构,只有最合适的。根据你的场景,选对架构,后面设计会顺很多。