BLOG

Record, summarize, and improve.

AXI

Channels

Signals

  • Global signals
  • Write address channel signals
  • Write data channel signals
  • Write response channel signals
  • Read address channel signals
  • Read data channel signals

Transactions

Ordering Model

Atomic Access

AXI 的核心思想只有两点:5个独立通道握手机制。掌握了这两个核心,你就读懂了 80% 的 AXI。

1. 核心架构:5个独立通道

传统的总线(如 AHB)读和写往往共用地址和数据线。而 AXI 为了实现高性能,把读、写操作彻底拆分开,形成了 5个完全独立的通道

💡 为什么是 5 个通道?

  • 读操作(2个通道):
    • AR (Read Address): 主机(Master)跟从机(Slave)说:“我要读哪个地址,读多少数据”。
    • R (Read Data): 从机把数据打包发给主机,顺便附带一个状态回复(成功还是失败)。
  • 写操作(3个通道):
    • AW (Write Address): 主机跟从机说:“我要写哪个地址,写多少数据”。
    • W (Write Data): 主机把要写的数据发给从机。
    • B (Write Response): 从机收到数据并写入后,给主机发一个“回执”,报告写成功了还是出错了。核心痛点:为什么写操作多了个 B 通道(写回复)?

因为 AXI 支持异步写。主机把写地址和写数据扔给总线后,就可以去干别的事了。从机真正写完后,必须通过 B 通道喊一声:“老大,我写完了!”主机才算彻底放心。而读操作中,数据本身就是从机返回的,不需要额外的回复通道。

2. 核心灵魂:VALID / READY 握手机制

AXI 总线上的所有通道,传输数据都遵循同一套规则:双向握手

每个通道都有两个最关键的信号:

  • VALID(主方就绪): 发送方说:“我的数据/地址已经准备好了,挂在总线上了。”
  • READY(从方就绪): 接收方说:“我现在有空,可以接收数据了。”

只有当 VALID 和 READY 同时为高电平(1)时,在时钟上升沿,数据才算真正传输成功。

握手的三种场景(看懂这个,时序图就通过了):

  1. VALID 先高,READY 后高: 发送方数据先到了,等等接收方。接收方一好(READY=1),瞬间完成传输。
  2. READY 先高,VALID 后高: 接收方早就空着了,等发送方。发送方数据一到(VALID=1),瞬间完成传输。
  3. 同时为高: 心灵感应,直接传输。

3. AXI 为什么快?(进阶高频概念)

面试或实际开发中,你会经常听到以下三个词,它们是 AXI 高性能的秘密:

  • Burst(突发传输): 主机只需要给出一个起始地址,然后告诉从机“我要连续读/写 $N$ 个数据”。总线会自动累加地址,不需要每个数据都发一次地址,极大地节省了开销。
  • Outstanding(超前传输): 主机不需要等上一笔写操作写完(收到 B 回复),就可以直接连续发送下一笔写地址。就像快递员不用等第一件快递签收,就可以连续派送第二件、第三件。
  • Interleaving(交织传输): 不同的数据块可以交错着发送。比如 A 数据的传输可以插在 B 数据传输的空隙中,充分压榨总线带宽。

4. 极简总结:3分钟记忆法通道名称简称方向核心作用

通道名称 简称 方向 核心作用
写地址 AW Master → Slave 发送写目标物理地址及突发属性
写数据 W Master → Slave 发送实际写入的数据,支持掩码(Byte Strobe)
写响应 B Slave → Master 从机反馈写操作是否成功
读地址 AR Master → Slave 发送读目标物理地址及突发属性
读数据 R Slave → Master 从机返回读取的数据以及读状态

记住口诀: 读写分离五通道,数据传输看握手(VALID/READY)。

现在你已经掌握了 AXI 的核心骨架。接下来如果是去做 FPGA/IC 设计,可以直接去查阅具体的信号定义(如 AWADDR, WDATA, WLAST 等);如果是做 SoC 验证或驱动,记住这 5 个通道和 Outstanding 的特性就完全够用了。

我们来看一个 SoC 中最经典的场景:DMA(直接内存访问)将数据从一个外设(比如网卡/FIFO)搬运到 DDR 内存中。

在这个场景中,DMA 作为 AXI Master(主机),而外设和 DDR 控制器作为 AXI Slave(从机)。DMA 将同时用到 AXI 的读通道写通道

场景设定

  • 任务: DMA 需要从 外设寄存器(地址 0x4000_0000)读取 4 个 32-bit 的数据,然后写入到 DDR 内存(地址 0x8000_0000)中。
  • 突发长度(Burst Length): 4(即一次申请,连续传输 4 个数据)。

第一步:DMA 从外设读数据(利用 AR 和 R 通道)

DMA 先当“买家”,去外设那里“进货”。

1. 发送读地址 (AR 通道)
  • DMA 将 ARADDR 设为 0x4000_0000,并将突发长度 ARLEN 设为 3(AXI 协议中,实际传输次数 = LEN + 1,所以 3 代表传 4 个数据)。
  • DMA 拉高 ARVALID=1
  • 外设准备好接收地址后,拉高 ARREADY=1
  • 握手成功: 在时钟上升沿,外设存下这个地址,开始准备数据。
2. 返回读数据 (R 通道)
  • 外设准备好第一个数据 D0,放在 RDATA 上,拉高 RVALID=1
  • DMA 此时可以接收,RREADY=1(握手 1 成功,D0 传完)
  • 外设接着放 D1D2
  • 放最后一个数据 D3 时,外设不仅拉高 RVALID,还会把 RLAST 信号拉高(=1),告诉 DMA:“这是最后一颗数据了,读传输结束!”
  • DMA 接收 D3,看到 RLAST=1,知道读操作完美闭环。

第二步:DMA 将数据写入 DDR(利用 AW、W 和 B 通道)

数据暂存在 DMA 内部的 FIFO 后,DMA 开始当“卖家”,去 DDR 那里“出货”。

1. 发送写地址 (AW 通道)
  • DMA 将 AWADDR 设为目标内存地址 0x8000_0000AWLEN 设为 3(传 4 个数据)。
  • DMA 拉高 AWVALID=1。DDR 控制器响应,AWREADY=1(地址握手成功)
2. 发送写数据 (W 通道)
  • DMA 把刚才读到的 D0 挂到 WDATA 上,拉高 WVALID=1。DDR 接收成功(WREADY=1)。
  • DMA 连续发送 D1D2
  • 发送到最后一个数据 D3 时,DMA 必须把 WLAST 信号拉高(=1),提醒 DDR:“这是最后一批货了,准备收尾。”
3. 接收写响应 (B 通道) —— 关键的最后一锤
  • DDR 控制器把 4 个数据安全地写入 DDR 颗粒后,通过 B 通道向 DMA 反馈。
  • DDR 拉高 BVALID=1,并通过 BRESP 信号返回 00(代表 OKAY,传输成功)。
  • DMA 收到 BVALIDOKAY 回复(DMA 的 BREADY=1),整个 DMA 搬运任务才算真正大功告成。

💡 从这个例子看 AXI 的高明之处

如果这是一个高性能 DMA,它在向外设发送读地址(AR)后,根本不需要等数据全部读回来,就可以同时向 DDR 发送写地址(AW)。

甚至,第一笔搬运还没结束,DMA 就可以发出第二笔、第三笔的地址申请(这就是 Outstanding 超前传输)。总线通道上布满了正在飞驰的地址和数据,没有任何一个时钟周期被浪费,这就是 AXI 能实现极高吞吐量的重要原因。

AXI与AMBA其他协议

在 AMBA(Advanced Microarchitecture Bus Architecture)家族中,AXI 协议为了适应不同的应用场景,衍生出了几个不同的版本。我们先来看看 AXI(通常指 AXI4 Full)与 AXI-lite 的核心差异,然后再横向对比一下 ARM 的其他主流总线协议。

1. AXI-Full 与 AXI-Lite 的差异

简单来说,AXI-Full 是“全功能性能怪兽”,而 AXI-Lite 是“极简版瘦身协议”

AXI-Lite 砍掉了 AXI-Full 中所有复杂的性能特性,专门用来控制那些对速度要求不高、但需要节省面积的寄存器。

核心差异对比特性AXI-Full (AXI4)与AXI-Lite为什么这么改?

特性 AXI-Full (AXI4) AXI-Lite 为什么这么改?(设计意图)
突发传输 (Burst) 支持(一次地址,最多传 256 个数据) 不支持(单次传输,1次地址只能传 1 个数据) 寄存器配置通常是一对一的,不需要连续大块搬运数据。
超前传输 (Outstanding) 支持(可以连续发多个地址) 通常不支持(发一个地址,必须等结果回来才能发下一个) 简化硬件控制逻辑,减小芯片面积。
数据总线宽度 支持 32, 64, 128 到 1024-bit 固定为 32-bit 或 64-bit(通常用 32-bit) 绝大多数 CPU 和外设的控制寄存器都是 32 位的。
ID 信号 (多线程) 支持(通过 ID 实现乱序和交织传输) 不支持(没有 ID 信号) 砍掉 ID 可以省去大量的硬件标记和排序逻辑。
窄带/掩码传输 (Strobe) 支持(可以只写一个字节) 支持但受限 依然保留了字节选通能力,方便按字节修改寄存器。

🛑 形象比喻:

  • AXI-Full:像一辆重卡。发车前(给地址)规划好要运一整车皮的货物(Burst),一路上哪怕路况复杂、到货顺序乱了(乱序/交织)它也能处理。适合 CPU 访问 DDR 内存、DMA 大块搬运数据。
  • AXI-Lite:像一辆闪送电瓶车。一次只送一个快件(单次读写),必须送到了、签收了(等待回复),才能接下一单。适合 CPU 去配置网卡、GPIO、定时器等外设的控制寄存器(Register Config)。

2. ARM AMBA 家族的其他主流总线协议

除了 AXI,AMBA 体系里还有几个非常高频出现的总线协议。我们按照性能从低到高的顺序来看看:

① APB (Advanced Peripheral Bus) —— 极简外设总线

  • 特点: 比 AXI-Lite 还要简单的老一代总线。它甚至没有独立的 5 个通道,读和写共用线,且需要两到三个时钟周期才能完成一次传输。
  • 应用场景: I2C、UART、SPI、Watchdog 等极慢速、对功耗和面积极其敏感的外设。

② AHB (Advanced High-performance Bus) —— 经典的单通道高性能总线

  • 特点: 在 AXI 诞生之前(Cortex-M 时代)的高性能总线。它是单通道的(读写共用地址/数据线),采用独占式的总线仲裁机制(同一时间只能有一个 Master 占用总线)。虽然支持突发(Burst)传输,但不支持 Outstanding,性能上限明显低于 AXI。
  • 应用场景: 嵌入式 MCU(如 STM32 内部的核心总线)、片上高性能 SRAM 访问。

③ ACE / CHI (AXI Coherency Extension / Coherent Hub Interface) —— 跨核心缓存一致性总线

  • 特点: AXI 的终极进化版。当芯片发展到多核 CPU(比如 8 核处理器)时,每个核心自己都有 Cache(缓存)。如果核心 A 修改了数据,核心 B 怎么知道?ACE 和 CHI 就是为了解决硬件级缓存一致性(Cache Coherency)而设计的,增加了大量的握手信号和监听(Snoop)通道。
  • 应用场景: 多核 CPU 内部互联(如 ARM DynamIQ 架构)、CPU 与 GPU/NPU 之间的互联。

总结:

SoC 里的总线分工在一个现代 SoC(片上系统)中,它们通常是协同工作的:

  • CHI/ACE:负责多核 CPU 内部的刀刃级对抗,确保 Cache 一致。
  • AXI-Full:作为骨干网,连接 CPU、DMA、GPU 和 DDR 控制器,负责海量数据冲浪。
  • AHB / AXI-Lite:作为次级骨干网,连接中等速度的系统组件或进行寄存器配置。
  • APB:通过一个桥接器(Bridge)挂在 AHB/AXI 下面,负责慢速外设的养老生活。

RISCV Bus选择

但在实际的工业界和开源社区中,为了重用现有的 IP 生态,RISC-V 架构在实现高速数据传输多核连接时,主要采用了以下两类总线标准:

1. 高速数据传输:主流选择 AXI4

对于单核或多核系统中的高性能、大带宽数据传输(如 CPU 访问 DDR 内存、DMA 搬运、GPU/NPU 互联),RISC-V 阵营最普遍的选择依然是 ARM 家族的 AXI4 (Advanced eXtensible Interface 4)

  • 生态极其成熟: 市面上绝大多数的高性能外设 IP(如 DDR4/5 控制器、PCIe 控制器、USB3.0)原生接口都是 AXI。RISC-V 处理器使用 AXI 接口可以实现“即插即用”。
  • 设计范例: 知名 RISC-V 开源高性能处理器(如 Rocket Chip、香山处理器、BOOM)的对外主干总线或系统总线,普遍原生支持或通过转换提供 AXI 接口。
2. 多核连接与缓存一致性:三大流派

在多核 RISC-V 系统中,多个核心的 L1/L2 Cache 之间需要保持数据一致性。针对这种复杂的多核互联(Multi-core Interconnect)场景,目前业内主要有以下三个流派:

TileLink 是由 UC Berkeley 为 RISC-V 生态专门设计的一种开放、免费、通用的片上总线协议。

  • 核心特点: 原生支持硬件级缓存一致性(基于目录或监听协议)。它将通道划分为 A、B、C、D、E 五个通道,其设计理念与 AXI 类似,但对缓存一致性的支持比 AXI 更加原生。
  • 应用场景: Rocket ChipSiFive 公司的多核处理器内部互联。核心之间、核心与 L2 Cache 之间几乎全部使用 TileLink。
  • 对外桥接: TileLink 内部完成多核对齐后,通常会在系统边缘通过一个 Bridge 转换成 AXI4,用来连接外部的 DDR 或高速外设。

对于追求极致性能、面向服务器或数据中心的商业级 RISC-V 芯片,设计团队往往会直接采用 ARM 的高级总线标准。

  • AMBA ACE: AXI 的一致性扩展。允许跨核监听彼此的 Cache。
  • AMBA CHI (Coherent Hub Interface): 基于分包传输的分散式接口,专门为了几十甚至上百个核心的 NoC (片上网络) 架构设计。
  • 应用场景: 国内外诸多高性能 RISC-V 服务器芯片。采用 CHI 的原因很简单——当核心数达到 16、64 甚至 128 核时,TileLink 的拓扑结构支撑起来比较吃力,而 CHI 是目前工业界公认最成熟的超多核互联解决方案。

如果多核连接不仅局限于同一个芯片内部(Die 内部),而是要实现跨芯片(Die-to-Die)处理器与加速器(CXL)之间的高速缓存一致性连接:

  • RISC-V 基金会积极拥抱了 CXL (Compute Express Link) 协议,使 RISC-V 核心能够与高性能 GPU 或全芯片级内存池实现点对点的高速、低延迟、缓存一致性互联。

在实际的 RISC-V 多核 SoC 内部,总线往往是分层组合使用的:

  • 核间互联(Core to Core / L2 Cache): 采用 TileLink(开源/SiFive 体系)或 CHI(高性能大芯片),解决多核 Cache 一致性。
  • 系统主干网(System Backbone): 采用 AXI4,连通主要的内存控制器(DDR/HBM)和高速 DMA。
  • 外设控制(Peripherals): 采用 AXI-LiteAPB,连接普通配置寄存器。

这份 AXI 协议的笔记总结为你梳理了从基础信号到高级传输特性的全部核心内容。我们可以按照 AXI 规范的逻辑顺序,将这些部分串联并补充完整:

1. Channels (通道) 与 Signals (信号总览)

AXI 共有 5 个独立通道。每个通道都拥有一组专属的信号,并且每一个通道都自带一对 VALIDREADY 信号用以实现双向握手。

  • 信号命名的第一个字母代表其所属通道:
    • A 开始表示地址通道(Address)
    • W 表示写数据(Write Data)
    • R 表示读数据(Read Data)
    • B 表示写响应(Buffered Response)

2. 全套信号定义 (Signals Definition)

2.1 Global Signals (全局信号)

全局信号独立于 5 个通道,负责整个总线矩阵的同步与复位。

  • ACLK:全局时钟信号,所有输入信号都在 ACLK 的上升沿被采样。
  • ARESETn:全局复位信号,低电平有效。在复位期间,Master 的 VALID 信号必须拉低。
2.2 Write Address Channel Signals (写地址通道信号)

当 Master 想要写入数据时,通过此通道向 Slave 发送地址和突发传输控制信息。

信号名 方向 描述
AWID M → S 写地址 ID 标签,用于多线程乱序传输。
AWADDR M → S 写操作的起始物理地址
AWLEN M → S 突发长度(Burst Length),实际传输次数 = AWLEN + 1(AXI4 支持 1~256)。
AWSIZE M → S 突发大小(Burst Size),每次传输的字节数(如 $2^0=1$ 字节,$2^2=4$ 字节)。
AWBURST M → S 突发类型(Burst Type):FIXED(地址固定)、INCR(地址递增,最常用)、WRAP(回卷)。
AWVALID M → S 写地址有效信号(Master 就绪)。
AWREADY S → M 写地址准备好信号(Slave 就绪)。
2.3 Write Data Channel Signals (写数据通道信号)

Master 通过此通道将实际数据发送给 Slave。

信号名 方向 描述
WDATA M → S 实际写入的数据(如 32-bit, 64-bit, 128-bit 宽)。
WSTRB M → S 写掩码/选通(Write Strobes)。每 1 位对应 WDATA 的 1 个字节,为 1 表示该字节有效。
WLAST M → S 最后一个写数据标志。在一笔 Burst 传输中,传最后一个数据时必须拉高。
WVALID M → S 写数据有效信号。
WREADY S → M Slave 准备好接收数据信号。
2.4 Write Response Channel Signals (写响应通道信号)

Slave 写入完成后,通过此通道向 Master 反馈状态。

信号名 方向 描述
BID S → M 写响应的 ID 标签,必须与对应的 AWID 匹配。
BRESP S → M 写响应状态:00: OKAY(成功), 01: EXOKAY(独占成功), 10: SLVERR(从机错误), 11: DECERR(译码错误)。
BVALID S → M 写响应有效信号。
BREADY M → S Master 准备好接收响应信号。
2.5 Read Address Channel Signals (读地址通道信号)

Master 想要读取数据时,向 Slave 发送读地址和突发控制信息。

信号名 方向 描述
ARID M → S 读地址 ID 标签。
ARADDR M → S 读操作的起始物理地址
ARLEN M → S 读突发长度。
ARSIZE M → S 读突发大小。
ARBURST M → S 读突发类型。
ARVALID M → S 读地址有效信号。
ARREADY S → M Slave 准备好接收读地址信号。
2.6 Read Data Channel Signals (读数据通道信号)

Slave 根据地址,将数据和读状态一起返回给 Master。

信号名 方向 描述
RID S → M 读数据 ID 标签,必须与 ARID 匹配。
RDATA S → M 从机返回的读取数据。
RRESP S → M 读响应状态(状态编码与 BRESP 相同,指示该笔读数据是否有效)。
RLAST S → M 最后一个读数据标志。
RVALID S → M 读数据有效信号。
RREADY M → S Master 准备好接收读数据信号。

3. Transactions (传输事务)

在 AXI 中,一次完整的读/写操作被称为一个 Transaction

  • 读事务 (Read Transaction):包含 1 次读地址握手,和由 RLAST 结尾的 $N$ 次读数据握手。
  • 写事务 (Write Transaction):包含 1 次写地址握手、$N$ 次写数据握手(最后一次带 WLAST),以及最终由 Slave 触发的 1 次写响应(B 通道)握手。

4. Ordering Model (保序/排序模型)

AXI 为了实现超高吞吐量,支持乱序(Out-of-order)机制。总线如何知道哪些数据可以打乱,哪些必须严格按顺序执行?这就依赖于 ID 信号

保序核心规则:
  1. 同 ID 必保序(ID Ordering)
    • 来自同一个 Master 且 ID 相同的 Transactions,必须严格按照发出的先后顺序执行。先发出的地址,其对应的数据必须先传输、先响应。
  2. 异 ID 可乱序(Interleaving/Out-of-order)
    • ID 不同的 Transactions,执行顺序没有任何限制
    • 读交织(Read Interleaving):Slave 返回不同 ID 的读数据时,可以交错着回(比如先回 ID=1 的数据1,再回 ID=2 的数据1,再回 ID=1 的数据2)。
    • 写交织:AXI4 已经取消了写交织(因为硬件维护成本太高,AXI4 要求同一 ID 的写数据通道必须是连续且保序的)。

5. Atomic Access (原子访问)

在多核系统或软硬件协同中,多个 Master 可能同时去改写内存里的同一个标志位(如信号量 Semaphore)。为了防止发生冲突,AXI 提供了两种原子访问机制(通常通过 AxLOCK 信号控制):

① Locked Access (锁定访问)
  • 机制:当 Master 发出 AxLOCK = Locked 传输时,总线内部的仲裁器会直接“包场”,把总线独占。在解锁之前,其他任何 Master 都无法访问该 Slave。
  • 缺点:严重恶化总线通信延迟,影响系统实时性。在 AXI4 中已被弃用(Deprecated)
② Exclusive Access (独占访问 —— 现代多核标准)

类似于软件中的“乐观锁”,它不锁总线,允许大家同时访问,但在硬件层引入了一个 Exclusive Monitor(独占监听器)

  • 工作流程
    1. Master A 从地址 0x1000 发起 Exclusive Read。Slave 内部的监听器会记录下:“Master A 正在盯着 0x1000 呢。”
    2. 在 Master A 准备修改并写回之前,如果 Master B 突然插刀,往 0x1000 写了新数据。监听器就会把 Master A 的独占标记抹去/置为无效
    3. 随后,Master A 发起 Exclusive Write 尝试写入该地址。
    4. 结果判定:如果监听器发现标记依然有效,说明期间没人动过,写入成功,Slave 通过 B 通道返回 EXOKAY;如果发现标记失效了,写入失败,Slave 返回 OKAY(注意:此时数据并不会真正写入内存),Master A 发现不是 EXOKAY,就知道自己被插队了,会选择重新开始整个流程。