1、AXI互连概述:从总线到网络,为什么复杂系统需要AXI互连?

大家好,我是你们的SoC架构讲师。今天咱们聊聊AXI互连。

说实话,我刚入行那会儿,系统里就一条AHB总线,挂几个master和slave,日子过得挺简单。但现在你打开一颗手机SoC或者AI芯片的die shot,里面密密麻麻全是互连网络。为什么会这样?

嗯,这就是我们今天要讲的核心——从总线到网络,复杂系统为什么离不开AXI互连。

1.1 传统总线的困境:一车道的瓶颈

先回忆一下经典的总线结构。比如AHB,它就像一条单车道公路。

  • 同一时刻只能有一个master占用总线。CPU要读数据,DMA要搬数据,GPU要取纹理——它们得排队。
  • 带宽固定。总线位宽是32位还是64位,一次传输就那么多。
  • 仲裁开销大。每次传输前都要仲裁,master越多,延迟越大。

我在一个老项目里遇到过这种情况:系统里挂了CPU、DSP、两个DMA和一个硬件加速器。结果CPU访问内存时,DMA刚好在做大数据块搬运,CPU就被活活堵死了。系统性能直接腰斩。

核心问题:传统总线是共享介质架构。所有通信都挤在同一条物理通道上。当系统复杂度上去后,这条通道就成了瓶颈。

1.2 AXI互连的本质:从共享到交换

AXI互连不是一条总线,它是一个交换网络。

你想想看,如果把传统总线比作一条单车道公路,那AXI互连就是一座立交桥——多个方向可以同时通行,互不干扰。

AXI互连的核心思想是:

  • 点对点连接:每个master和slave之间可以有独立的物理通道。
  • 并行传输:多个master可以同时访问不同的slave。
  • 分离事务:地址通道和数据通道分开,读写可以乱序完成。

说白了,AXI互连把「所有人挤一条路」变成了「每个人都有自己的路」。这听起来简单,但实现起来门道很多。

1.3 为什么复杂系统需要AXI互连?

我总结了几点,都是我在实际项目中踩过的坑:

1.3.1 多主多从的并发需求

现代SoC里,master数量轻松超过10个。CPU、GPU、NPU、DSP、ISP、Video Codec……每个都是带宽大户。如果还用单总线,系统根本跑不动。

举个例子:一个4K视频播放场景,ISP要写DDR,GPU要读纹理,CPU要处理控制命令,Display Controller要读帧缓冲。这四个操作如果串行执行,帧率直接掉到个位数。但用AXI互连,它们可以同时进行。

1.3.2 带宽和延迟的解耦

传统总线里,带宽和延迟是绑定的。总线频率越高,延迟越小,但功耗也越高。

AXI互连允许你用面积换带宽。比如你可以把数据位宽从128位做到512位,或者用多个物理通道做负载均衡。延迟可以通过outstanding transaction(未完成事务)来隐藏。

我的经验:在AI加速器项目中,我们用了8个AXI slave端口连接到DDR控制器,每个端口256位宽。这样总带宽做到了512GB/s,而每个端口的频率只有1GHz。如果单端口要做到这个带宽,频率得飙到4GHz——那功耗就炸了。

1.3.3 服务质量(QoS)的精细控制

复杂系统里,不是所有master都平等。CPU的延迟敏感,GPU的带宽敏感,NPU的实时性要求高。

AXI互连支持QoS机制:你可以给每个事务打上优先级标签,互连网络会根据优先级做调度。我在一个车载芯片项目里,就把安全相关的master(比如制动控制)设成最高优先级,确保它的延迟永远不超过1微秒。

1.3.4 物理实现的灵活性

AXI互连可以跨时钟域、跨电压域。你可以把高速的CPU cluster和低速的外设总线通过异步桥接连接起来。这在传统总线里很难做到。

1.4 AXI互连的典型拓扑

我画了一张图,帮你理解常见的AXI互连结构:

AXI互连典型拓扑结构 CPU Cluster GPU NPU DMA AXI Crossbar / Network on Chip DDR控制器 SRAM 外设总线桥 配置寄存器 Master(发起者) 互连网络(交换/路由) Slave(目标) ← 读/写请求 → ← 地址路由 + 数据交换 → ← 响应数据 →

这张图里,多个master通过AXI互连网络同时访问不同的slave。CPU可以读DDR,GPU可以读SRAM,NPU可以写配置寄存器——三者互不干扰。

1.5 AXI互连的关键组件

一个完整的AXI互连方案,通常包含这几个部分:

组件 功能 我的经验
Crossbar(交叉开关) 实现任意master到任意slave的连接 面积大,但延迟低。适合master数量少的场景
Interconnect(互连矩阵) 带缓冲和流水线的交换网络 支持outstanding,适合高带宽场景
NIC(Network Interface Controller) 把AXI协议转换成内部网络包 注意协议转换的延迟,我曾经在这里丢过数据
异步桥 跨时钟域同步 双缓冲设计是标配,否则容易丢数据
QoS控制器 优先级调度和带宽分配 建议用加权轮询,别用固定优先级

1.6 避坑指南:我踩过的几个坑

坑1:outstanding transaction数量设太大

我曾经在一个项目里,为了追求高带宽,把每个master的outstanding深度设成了32。结果互连网络里的buffer全被占满了,死锁了。后来发现,outstanding深度要根据slave的响应能力来设。DDR控制器一般支持4-8个outstanding,设太多没用。

坑2:地址映射没对齐

AXI互连的地址解码是基于地址范围的。如果两个slave的地址区间有重叠,或者地址边界没对齐到4KB,互连会报错。我见过一个同事把两个外设的地址范围设成了0x1000-0x1FFF和0x2000-0x2FFF,结果中间漏了0x1FFF到0x2000的缝隙——系统跑起来就挂。

我的建议:设计地址映射时,用excel列一张表,每个slave的起始地址、结束地址、大小、对齐方式都写清楚。然后写一个脚本自动生成地址解码逻辑。别手写,容易出错。

1.7 小结

好了,这一章我们讲了:

  • 传统总线的瓶颈——共享介质导致带宽受限
  • AXI互连的本质——从共享总线到交换网络
  • 复杂系统为什么需要它——并发、带宽、QoS、物理灵活性
  • 典型拓扑和关键组件
  • 一些实战中的坑

说白了,AXI互连就是现代SoC的「交通枢纽」。没有它,多核CPU、GPU、NPU这些带宽大户根本没法协同工作。下一章我们会深入AXI协议的细节——地址通道、数据通道、握手信号,这些才是真正干活时要面对的东西。

可可精品资料库