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. 设计要点总结
-
VALID/READY 握手不要组合逻辑反馈:VALID 的产生路径上不能有来自 READY 的组合逻辑
-
ID 管理:合理使用事务 ID 才能发挥乱序优势;相同 ID 必须保序
-
Burst 不能跨 4KB 边界:AXI 规范要求单次 Burst 不能跨越 4KB 页边界(保护 MMU 页表)
-
WLAST 必须正确:Burst 最后一拍必须拉高 WLAST/RLAST
-
Narrow Transfer:当 Data Width > Transfer Size 时,通过 WSTRB 和字节通道选择实现
-
Unaligned Transfer:通过 WSTRB 实现非对齐访问,首拍和末拍可以用部分字节选通