AXI中的burst有几种?都用在什么场景中
AXI中的burst有几种?都用在什么场景中
摘要:在 AXI (Advanced eXtensible Interface) 协议中,Burst 传输是数据传输的基本方式,用于提高传输效率。AXI 定义了三种 Burst 类型:FIXED、INCR 和 WRAP。每种 Burst 类型适用于不同的场景,其行为和地址计算方式也不同。以下详细解释三种 Burst 类型的应用场景,以及 WRAP Burst 的上下边界计算方法。
1. AXI 中的三种 Burst 类型及其应用场景
1.1 FIXED Burst
- 定义:FIXED Burst 是一种固定地址的 Burst 传输方式。在整个 Burst 期间,地址保持不变,每次数据传输(Beat)都访问相同的地址。
- 特点:
- 地址不递增,每次传输的地址与起始地址相同。
- 适用于访问单个寄存器或 FIFO 类型的设备。
- 应用场景:
- FIFO 访问:当 Master 需要多次读写同一个 FIFO 端口时,使用 FIXED Burst 可以连续访问同一地址。例如,读取或写入音频数据流到 FIFO。
- 寄存器轮询:当 Master 需要反复读取某个状态寄存器(如等待中断或状态位变化)时,可以使用 FIXED Burst 持续访问同一地址。
- 简单外设:某些简单外设可能只支持固定地址访问,FIXED Burst 适用于这种场景。
1.2 INCR Burst
- 定义:INCR Burst 是一种递增地址的 Burst 传输方式。每次数据传输(Beat)后,地址按照传输大小(
AxSIZE
)递增,地址连续增加。 - 特点:
- 地址从起始地址开始,每次传输后增加一个步长(步长 = 2^
AxSIZE
,例如 4 字节传输时步长为 4)。 - 地址递增可以跨页面边界(但需要注意 AXI 规范中对跨边界传输的限制)。
- 地址从起始地址开始,每次传输后增加一个步长(步长 = 2^
- 应用场景:
- 内存访问:最常见的 Burst 类型,用于读取或写入连续的内存块。例如,DMA (Direct Memory Access) 传输大块数据时,使用 INCR Burst 访问连续地址。
- 数组操作:当 Master 需要访问数组或缓冲区中的连续数据时,INCR Burst 是最自然的选择。
- 通用数据传输:适用于大多数需要高效传输连续数据的场景,是 AXI 中最常用的 Burst 类型。
1.3 WRAP Burst
- 定义:WRAP Burst 是一种环绕地址的 Burst 传输方式。地址从起始地址开始递增,但当达到某个边界时,地址会“环绕”回到较低地址,形成一个循环范围。
- 特点:
- 地址递增类似于 INCR,但会在特定边界(由 Burst 长度和大小决定)处环绕。
- 适用于需要循环访问固定范围内存的场景。
- 应用场景:
- 缓存行操作 (Cache Line Access):WRAP Burst 常用于缓存系统,当访问缓存行数据时,地址可能需要从缓存行的末尾环绕到开头。例如,处理器读取缓存行数据时,如果起始地址不是缓存行对齐的,WRAP Burst 可以在达到缓存行边界时环绕。
- 循环缓冲区 (Circular Buffer):在嵌入式系统中,循环缓冲区用于数据流处理(如音频或视频流),WRAP Burst 可以自然地处理循环缓冲区的地址环绕。
- 特定硬件加速器:某些硬件加速器(如 DSP 或 GPU)可能需要循环访问固定大小的内存块,WRAP Burst 适用于这种需求。
2. WRAP Burst 的上下边界计算
WRAP Burst 的地址计算比 INCR 和 FIXED 复杂,因为它涉及到环绕机制。WRAP Burst 的上下边界由 Burst 的长度 (AxLEN
)、大小 (AxSIZE
) 和起始地址 (AxADDR
) 共同决定。以下是详细计算方法:
2.1 基本概念
- Burst 长度 (
AxLEN
):表示 Burst 中数据传输的次数(Beat 数量),范围为 1 到 16(在 AXI4 中)。 - Burst 大小 (
AxSIZE
):表示每次传输的数据字节数,取值为 2 的幂(例如 1, 2, 4, 8, ...,128 字节)。 - 总传输字节数 (Total Bytes):
Total_Bytes = (AxLEN + 1) * (2^AxSIZE)
。 - 环绕边界 (Wrap Boundary):WRAP Burst 的地址环绕范围基于总传输字节数,地址会在达到边界时环绕到范围内较低的地址。
- 对齐要求:起始地址 (
AxADDR
) 必须与AxSIZE
对齐,即AxADDR % (2^AxSIZE) == 0
。
2.2 上下边界计算公式
- 下边界 (Lower Boundary):
Lower_Boundary = INT(AxADDR / Total_Bytes) * Total_Bytes
- 即起始地址向下对齐到总传输字节数的倍数。
- 上边界 (Upper Boundary):
Upper_Boundary = Lower_Boundary + Total_Bytes - 1
- 即下边界加上总传输字节数减 1,表示范围的最后一个字节地址。
2.3 地址计算规则
- 每次传输后,地址递增一个步长:
Next_Address = Current_Address + (2^AxSIZE)
。 - 如果
Next_Address
超出上边界 (Upper_Boundary
),则环绕到下边界:Next_Address = Lower_Boundary + (Next_Address - Upper_Boundary - 1)
。 - 简单来说,地址环绕后,会从下边界开始,继续递增剩余的偏移量。
2.4 示例计算
假设以下参数:
- 起始地址
AxADDR = 0x104
- Burst 长度
AxLEN = 3
(表示 4 次传输) - Burst 大小
AxSIZE = 2
(表示每次传输 4 字节)
步骤 1:计算总传输字节数
Total_Bytes = (AxLEN + 1) * (2^AxSIZE) = 4 * 4 = 16
字节
步骤 2:计算下边界和上边界
Lower_Boundary = (AxADDR / Total_Bytes) * Total_Bytes = (0x104 / 16) * 16 = (260 / 16) * 16 = 16 * 16 = 0x100
Upper_Boundary = Lower_Boundary + Total_Bytes - 1 = 0x100 + 16 - 1 = 0x10F
步骤 3:计算每次传输的地址
- 第 1 次传输:地址 =
0x104
(起始地址) - 第 2 次传输:地址 =
0x104 + 4 = 0x108
(未超出边界) - 第 3 次传输:地址 =
0x108 + 4 = 0x10C
(未超出边界) - 第 4 次传输:地址 =
0x10C + 4 = 0x110
(超出上边界0x10F
),环绕到:- 超出量 =
0x110 - 0x10F - 1 = 0
(实际计算中调整为边界差值) - 环绕后地址 =
Lower_Boundary + (超出量) = 0x100 + 0 = 0x100
- 超出量 =
最终地址序列:
- Beat 1:
0x104
- Beat 2:
0x108
- Beat 3:
0x10C
- Beat 4:
0x100
(环绕到下边界)
输出结果:
WRAP Burst Addresses:
Beat 1: 0x104
Beat 2: 0x108
Beat 3: 0x10C
Beat 4: 0x100
注意事项
- 对齐检查:起始地址必须与
AxSIZE
对齐,否则传输行为未定义(可能导致协议错误)。 - 边界限制:WRAP Burst 的总传输字节数必须是 2 的幂(即
AxLEN + 1
必须是 2 的幂),否则行为未定义。AXI4 限制AxLEN
为 1, 3, 7, 15(对应 2, 4, 8, 16 次传输)。 - 硬件实现:在实际硬件中,地址环绕计算由 Master 或 Slave 实现,通常 Master 在发起传输时计算地址序列。
3. 总结
- FIXED Burst:适用于访问固定地址的场景,如 FIFO 或寄存器轮询。
- INCR Burst:适用于连续内存访问,是最常见的 Burst 类型,用于 DMA 或数组操作。
- WRAP Burst:适用于循环访问固定范围的场景,如缓存行操作或循环缓冲区。
- WRAP Burst 上下边界计算:
- 总传输字节数 =
(AxLEN + 1) * (2^AxSIZE)
- 下边界 =
(AxADDR / Total_Bytes) * Total_Bytes
- 上边界 =
下边界 + Total_Bytes - 1
- 地址超出上边界时环绕到下边界。
- 总传输字节数 =
通过理解三种 Burst 类型的特性和应用场景,可以在设计或验证 AXI 系统时选择合适的传输模式。如果有具体的 AXI 设计或验证问题(例如如何在 UVM 中验证 WRAP Burst),可以进一步讨论!