AXI (Advanced eXtensible Interface) 协议详解

AXI 是 ARM 公司 AMBA 规范中的高性能总线协议,是 AHB 的演进版本,广泛应用于现代 SoC 设计中。


1. AXI 核心架构 --- 5 通道分离

AXI 最大的设计特点是将地址/数据/响应完全分离为独立的单向通道,实现真正的全双工通信:

复制代码
                    ┌─────────────────┐
    Write Address ──►│                 │
       Write Data  ──►│    AXI         │──► Write Response
                    │                 │
     Read Address  ──►│  Interconnect  │──► Read Data
                    │                 │──► Read Response
                    └─────────────────┘
通道 方向 功能
AW (Write Address) Master → Slave 写地址、控制信息
W (Write Data) Master → Slave 写数据、字节选通
B (Write Response) Slave → Master 写事务完成响应
AR (Read Address) Master → Slave 读地址、控制信息
R (Read Data) Slave → Master 读数据、读响应

2. AXI 信号详细清单

2.1 全局信号

信号 宽度 说明
ACLK Clock 1 全局时钟
ARESETn Reset 1 低电平复位

2.2 Write Address Channel (AW)

信号 方向 宽度 说明
AWID M→S 可配 写事务 ID
AWADDR M→S 32-64 写地址
AWLEN M→S 4 (AXI3) / 8 (AXI4) Burst 长度 (拍数-1)
AWSIZE M→S 3 每拍字节数
AWBURST M→S 2 Burst 类型
AWLOCK M→S 1 锁定类型
AWCACHE M→S 4 Cache 属性
AWPROT M→S 3 保护类型
AWQOS M→S 4 QoS 优先级
AWREGION M→S 4 区域标识
AWVALID M→S 1 地址有效
AWREADY S→M 1 从机准备好收地址

2.3 Write Data Channel (W)

信号 方向 宽度 说明
WID M→S 可配 写数据 ID (AXI3 only)
WDATA M→S 32-1024 写数据
WSTRB M→S WDATA_WIDTH/8 字节选通
WLAST M→S 1 Burst 最后一拍
WVALID M→S 1 数据有效
WREADY S→M 1 从机准备好收数据

2.4 Write Response Channel (B)

信号 方向 宽度 说明
BID S→M 可配 响应事务 ID
BRESP S→M 2 写响应状态
BVALID S→M 1 响应有效
BREADY M→S 1 主机准备好收响应

2.5 Read Address Channel (AR)

信号 方向 宽度 说明
ARID M→S 可配 读事务 ID
ARADDR M→S 32-64 读地址
ARLEN M→S 4/8 Burst 长度
ARSIZE M→S 3 每拍字节数
ARBURST M→S 2 Burst 类型
ARLOCK M→S 1 锁定类型
ARCACHE M→S 4 Cache 属性
ARPROT M→S 3 保护类型
ARQOS M→S 4 QoS 优先级
ARREGION M→S 4 区域标识
ARVALID M→S 1 地址有效
ARREADY S→M 1 从机准备好收地址

2.6 Read Data Channel (R)

信号 方向 宽度 说明
RID S→M 可配 读数据事务 ID
RDATA S→M 32-1024 读数据
RRESP S→M 2 读响应状态
RLAST S→M 1 Burst 最后一拍
RVALID S→M 1 数据有效
RREADY M→S 1 主机准备好收数据

3. VALID / READY 握手机制

AXI 所有通道使用同一种握手协议:

复制代码
              ┌─────────────────────┐
              │   VALID AND READY   │
              │         ↓           │
              │     传输发生        │
              └─────────────────────┘
              ↗                    ↖
        VALID (源发出)        READY (目标接收)

规则:

  • 源端拉高 VALID 表示"我有数据/地址/响应要发"

  • 目标端拉高 READY 表示"我可以接收"

  • 只有当 VALID=1 且 READY=1 在同一拍时,传输才发生

  • VALID 和 READY 谁先都可以,互不依赖

    时序示例:
    T1 T2 T3 T4 T5
    ACLK: /‾_/‾_/‾_/‾_/‾_
    VALID: ----‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾----
    READY: ----‾‾‾‾‾‾‾‾
    _____‾‾‾‾‾‾‾‾----
    传输: ✓ ✓ ✓
    (T3 的 READY=0 导致等待)

**关键约束:VALID 不能依赖 READY!**即源端不能"看到 READY 才拉 VALID",否则会死锁。


4. Burst 传输详解

4.1 Burst 类型 (ARBURST/AWBURST)

编码 类型 说明
00 FIXED 固定地址(如 FIFO 端口访问)
01 INCR 增量地址(顺序访问内存)
10 WRAP 回绕地址(Cache Line 填充)
11 Reserved 保留

4.2 Burst 长度

版本 信号宽度 拍数范围
AXI3 AWLEN/ARLEN = 4-bit 1~16 拍
AXI4 AWLEN/ARLEN = 8-bit 1~256 拍

实际传输拍数 = LEN + 1

4.3 Burst Size (编码与 AHB 相同)

AWSIZE/ARSIZE 字节数
000 1 Byte
001 2 Bytes
010 4 Bytes
011 8 Bytes
100 16 Bytes
101 32 Bytes
110 64 Bytes
111 128 Bytes

4.4 地址计算

INCR(增量):

复制代码
Address_N = Start_Address + (N × Transfer_Size_in_Bytes)

WRAP(回绕):

复制代码
Wrap_Boundary = INT(Start_Address / (Total_Bytes)) × Total_Bytes

Address_N = Wrap_Boundary + ((Start_Address + N × Size) - Wrap_Boundary) % Total_Bytes

其中 Total_Bytes = Burst_Length × Transfer_Size

FIXED:

复制代码
Address_N = Start_Address  (每拍同一个地址)

4.5 Burst 示例

8 拍 INCR Burst 读 (起始地址 0x30,Size=4B):

复制代码
Cycle:  T0  T1  T2  T3  T4  T5  T6  T7
ARADDR: 0x30
ARLEN:  7 (8拍)
ARBURST: INCR
...
RDATA:       D0  D1  D2  D3  D4  D5  D6  D7
RLAST:        0   0   0   0   0   0   0   1

4 拍 WRAP Burst (起始 0x34, Size=4, 边界=16B):

复制代码
Addr: 0x34 → 0x38 → 0x3C → 0x30  (回到 0x30边界)

5. 通道间依赖关系

复制代码
         AWVALID    WVALID    BVALID
写事务:    ──→   无依赖   ──→
         写地址     写数据     写响应
         
         ARVALID             RVALID
读事务:    ────────→ 无依赖 ────────→
         读地址              读数据

写事务可以提前发数据,也可以先发地址再发数据:

复制代码
情况1 (地址先行):
  AW: [A1] [A2] ...
  W:       [D1][D1][D1] [D2][D2][D2][D2] ...
  B:                           [B1] [B2] ...

情况2 (数据先行):
  AW:       [A1] ...
  W:  [D1][D1][D1] ...
  B:                [B1] ...

读事务数据必定在地址之后(逻辑上)。


6. Outstanding Transactions(多个待处理事务)

这是 AXI 相比 AHB 的重大优势:

复制代码
AHB:  发地址 → 等数据 → 发下一个地址 (串行)
AXI:  发地址1 → 发地址2 → 收数据1 → 发地址3 → 收数据2 ... (流水线)

AR通道:  [A1][A2][A3][A4] ...  (连续发地址,不等数据)
R通道:       [D1][D1] [D2] [D3][D3] [D4] ...  (乱序返回)
  • Outstanding 深度:同时可以有多少个未完成的读/写事务
  • 通过 ARID/AWID 区分各个事务
  • AXI 允许 Out-of-Order 完成:ID=3 的数据可以先于 ID=1 返回

7. Transaction ID 与乱序

复制代码
AR通道:  ID=0, Addr=A   ID=1, Addr=B   ID=2, Addr=C
R通道:        ID=1, Data=B   ID=0, Data=A   ID=2, Data=C
              (ID=1 先返回!)

排序规则:

  • 不同 ID 的事务之间:无顺序要求,可乱序
  • 相同 ID 的事务之间:必须按序完成
  • 写事务 vs 读事务:不同 ID 间无顺序要求

8. 响应类型

RRESP/BRESP 编码 说明
OKAY 00 正常访问成功
EXOKAY 01 Exclusive 访问成功
SLVERR 10 从机错误(访问错误地址等)
DECERR 11 译码错误(地址无对应从机)

9. Cache 与 Prot 信号

9.1 AWCACHE/ARCACHE (4-bit)

Bit 含义
0 Bufferable (B)
1 Modifiable (M) --- 允许读取后修改写回
2 Read-Allocate (RA)
3 Write-Allocate (WA)

常用编码:

场景 CACHE3:0 含义
Non-cacheable 0000 不缓存
Write-through 0010 写穿透
Write-back 0011 写回
Device memory 0001 设备内存(B=1)

9.2 AWPROT/ARPROT (3-bit)

Bit 含义
0 Privileged (1) / User (0)
1 Non-secure (1) / Secure (0) --- TrustZone
2 Instruction (1) / Data (0)

10. Exclusive Access(排他访问)

AXI 支持基于硬件的原子操作(类似 ARM 的 LDREX/STREX):

复制代码
读:  ARLOCK=1 (Exclusive Read) → 从机记录监控地址
写:  AWLOCK=1 (Exclusive Write) → 从机检查是否被篡改
                                   → EXOKAY (成功) / OKAY (失败)

用于实现 Spinlock、Semaphore 等无锁数据结构。


11. AXI3 vs AXI4 vs AXI5

特性 AXI3 AXI4 AXI5
Burst 长度 1-16 拍 1-256 拍 1-256 拍
WID 信号 ❌ (移除)
QoS 信号 ✅ (4-bit)
Region 信号 ✅ (4-bit) ✅ (4-bit)
User 信号
TrustZone (非安全访问)
Wake-up 信号
Cache Stashing

12. AXI-Stream (AXI4-Stream)

AXI4-Stream 是 AXI 家族中用于无地址流数据传输的协议:

  • 只有单通道:TVALID + TREADY + TDATA + TSTRB + TKEEP + TLAST + TID + TDEST + TUSER

  • 没有地址概念,纯数据流

  • 用于:视频流、DAC/ADC 接口、DSP 数据通路、以太网包处理

    TVALID: ----‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾----
    TREADY: ----‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾----
    TDATA: --------
    TLAST: ----0 0 0 1 0 0 0 1 ----
    └─ Packet 0 ─┘ └─ Packet 1 ─┘


13. AXI vs AHB 深度对比

复制代码
┌──────────────┬──────────────┬──────────────────────┐
│     特性     │     AHB      │         AXI          │
├──────────────┼──────────────┼──────────────────────┤
│ 通道架构     │ 共享总线     │ 5 通道分离           │
│ 读写并发     │ ❌           │ ✅ 全双工            │
│ Burst 长度   │ 1-16         │ 1-256 (AXI4)         │
│ Outstanding  │ ❌ (1个)     │ ✅ (多个)            │
│ Out-of-Order │ ❌           │ ✅ (通过 ID 区分)    │
│ 握手机制     │ HREADY 固定  │ VALID/READY 双向     │
│ 地址/数据    │ 流水线       │ 完全解耦             │
│ 频宽         │ ~200MHz      │ ~500MHz+             │
│ 读写数据带宽 │ 单工         │ 双工,可同时进行     │
│ 字节选通     │ ❌           │ ✅ WSTRB             │
│ QoS          │ ❌           │ ✅                   │
│ Exclusive    │ ❌           │ ✅                   │
│ 面积         │ 小           │ 大 (~2-3x AHB)       │
└──────────────┴──────────────┴──────────────────────┘

性能对比(理论最大吞吐,32-bit 数据总线,200MHz):

复制代码
AHB:   地址+数据共享,每拍 ~0.8 个有效传输 → 约 640 MB/s
AXI:   读写独立通道,每拍可同时读写 → 约 800 MB/s (读) + 800 MB/s (写)

14. 典型 SoC 互联拓扑

复制代码
┌─────────────────────────────────────────────────────┐
│                   AXI Interconnect / NIC-400        │
│                                                     │
│  ┌──────┐  ┌──────┐  ┌──────┐     ┌──────┐        │
│  │CPU簇 │  │ GPU  │  │ DMA  │     │Video │        │
│  │(AXI) │  │(AXI) │  │(AXI) │     │Codec │        │
│  └──┬───┘  └──┬───┘  └──┬───┘     └──┬───┘        │
│     │         │         │              │            │
│  ┌──┴─────────┴─────────┴──────────────┴──┐        │
│  │         AXI Matrix (Crossbar)          │        │
│  └──┬──────────┬──────────┬───────────────┘        │
│     │          │          │                         │
│  ┌──┴──┐   ┌──┴──┐  ┌────┴─────┐                  │
│  │DDR  │   │AXI→ │  │ AXI→APB  │                  │
│  │Ctrl │   │AHB  │  │ Bridge   │                  │
│  │(AXI)│   │Brdg │  └────┬─────┘                  │
│  └─────┘   └──┬──┘       │                         │
│               │      ┌────┴───┬────────┐           │
│            ┌──┴──┐   │ UART   │ GPIO   │ ...       │
│            │SRAM │   │ (APB)  │ (APB)  │           │
│            │Flash│   └────────┴────────┘           │
│            │(AHB)│                                  │
│            └─────┘                                  │
└─────────────────────────────────────────────────────┘

15. 设计要点总结

  1. VALID/READY 握手不要组合逻辑反馈:VALID 的产生路径上不能有来自 READY 的组合逻辑

  2. ID 管理:合理使用事务 ID 才能发挥乱序优势;相同 ID 必须保序

  3. Burst 不能跨 4KB 边界:AXI 规范要求单次 Burst 不能跨越 4KB 页边界(保护 MMU 页表)

  4. WLAST 必须正确:Burst 最后一拍必须拉高 WLAST/RLAST

  5. Narrow Transfer:当 Data Width > Transfer Size 时,通过 WSTRB 和字节通道选择实现

  6. Unaligned Transfer:通过 WSTRB 实现非对齐访问,首拍和末拍可以用部分字节选通