1. 地址构造
AXI 协议是基于突发的。master通过驱动控制信息和事务中第一个字节的地址到slave来开始每个突发。随着突发的进行,slave必须计算突发中后续传输的地址。
突发不得跨越 4KB 地址边界。
注意 这防止了突发跨越两个slave之间的边界。它还限制了slave必须支持的地址增量的数量。
1.1 突发长度(burst length)
突发长度由以下指定:
- 读传输的 ARLEN[7:0]
- 写传输的 AWLEN[7:0]
在本spec中,AxLEN 表示 ARLEN 或 AWLEN。
AXI3 支持所有突发类型的突发长度为 1 到 16 次传输。
AXI4 将 INCR 突发类型的突发长度支持扩展到 1 到 256 次传输。AXI4 中所有其他突发类型的支持仍为 1 到 16 次传输。
AXI3 中的突发长度定义为: Burst_Length = AxLEN[3:0] + 1
AXI4 中的突发长度定义为: Burst_Length = AxLEN[7:0] + 1,以适应 AXI4 中 INCR 突发类型的扩展突发长度。
AXI 有以下规则管理突发的使用:
- 对于wrap突发,突发长度必须为 2、4、8 或 16
- 突发不得跨越 4KB 地址边界
- 不支持提前终止突发。
没有组件可以提前终止突发。然而,为了减少写突发中的数据传输数量,master可以通过取消断言所有写使能来禁用进一步的写入。在这种情况下,master必须完成突发中剩余的传输。在读突发中,master可以丢弃读数据,但它必须完成突发中的所有传输。
注意 丢弃不需要的读数据可能导致在访问读敏感设备(如 FIFO)时丢失数据。在访问此类设备时,master必须使用完全匹配所需数据传输大小的突发长度。
在 AXI4 中,具有 INCR(增量)突发类型且长度大于 16 的事务可以被转换为多个更小的突发,即使事务属性表明该事务是不可修改的(Non-modifiable)。在这种情况下,生成的突发必须保留与原始事务相同的事务特性,唯一的例外是:
- 突发长度减少;
- 生成的突发的地址适当调整。
注意:将更长的突发分解为多个更短的突发的能力对于 AXI3 兼容性是必需的,也可能需要用来减少更长突发对服务质量(QoS)保证的影响
1.2 突发大小(burst size)
在突发中的每个数据传输,或拍(beat),要传输的最大字节数由以下指定:
- 读传输的 ARSIZE[2:0]
- 写传输的 AWSIZE[2:0]
在本规范中,AxSIZE 表示 ARSIZE 或 AWSIZE。
下表显示了 AxSIZE 编码对应突发大小
AxSIZE[2:0] | 字节传输数 |
---|---|
0b000 | 1 |
0b001 | 2 |
0b010 | 4 |
0b011 | 8 |
0b100 | 16 |
0b101 | 32 |
0b110 | 64 |
0b111 | 128 |
如果 AXI 总线宽度大于突发大小,AXI 接口必须根据传输地址确定每次传输使用数据总线的哪些字节通道。
1.3 突发类型
AXI 协议定义了三种突发类型:
1.3.1 FIXED(固定)
在固定突发中:
- 突发中每次传输的地址都相同。
- 对于突发中的所有拍(beat),有效的字节通道是恒定的。然而,在这些字节通道内,每一拍中实际有 WSTRB 断言的字节可以不同。
这种突发类型用于对同一位置的重复访问,例如在加载或清空一个 FIFO(先进先出队列)时。
1.3.2 INCR(增量)
在增量突发中,突发中每次传输的地址是前一次传输地址的增量。增量值取决于传输的大小。
例如,在大小为四个字节的突发中,每次传输的地址是前一个地址加四。
这种突发类型用于访问常规的顺序内存。
1.3.3 WRAP(包装)
包装突发与增量突发类似,只不过当达到一个上限地址限制时,地址会回绕到一个较低的地址。 包装突发适用以下限制:
- 开始地址必须与每次传输的大小对齐。
- 突发的长度必须为 2、4、8 或 16 次传输。
包装突发的行为是:
- 突发使用的最低地址与要传输的数据的总大小对齐,即,(每次传输的大小)×(突发中的传输次数)。这个地址被定义为包装边界。
- 每次传输后,地址增量与 INCR 突发相同。然而,如果这个增量地址是(包装边界)+(要传输的数据的总大小),那么地址会回绕到包装边界。
- 突发中的第一个传输可以使用高于包装边界的地址,但必须遵守包装突发适用的限制。这意味着对于第一个地址高于包装边界的任何 WRAP 突发,地址都会发生回绕。
这种突发类型用于缓存行访问。
突发类型由以下指定:
- 读传输的 ARBURST[1:0]
- 写传输的 AWBURST[1:0]
在本规范中,AxBURST 表示 ARBURST 或 AWBURST。
下表显示了 AxBURST 信号编码对应的突发类型。
AxBURST[1:0] | 突发类型 |
---|---|
0b00 | FIXED |
0b01 | INCR |
0b10 | WRAP |
0b11 | 保留 |
1.4 突发地址
一次突发内传输的地址和字节通道取决于以下变量:
Start_Address(起始地址) 主设备发出的起始地址。
Number_Bytes(数据字节数) 每次数据传输中的最大字节数。
Data_Bus_Bytes(数据总线字节数) 数据总线中的字节通道数。
Aligned_Address(对齐地址) 起始地址的对齐版本。
Burst_Length(突发长度) 突发内总的数据传输次数。
Address_N(传输 N 的地址) 突发中第 N 次传输的地址。N 为 1 表示突发中的第一个传输。
Wrap_Boundary(包装边界) 包装突发内的最低地址。
Lower_Byte_Lane(较低字节通道) 传输中地址最低的字节的字节通道。
Upper_Byte_Lane(较高字节通道) 传输中地址最高的字节的字节通道。
INT(x) x 的向下取整整数值。
以下方程式确定突发内传输的地址:
- 起始地址(Start_Address) = AxADDR
- 数据字节数(Number_Bytes) = 2 ^ AxSIZE
- 突发长度(Burst_Length) = AxLEN + 1
- 对齐地址(Aligned_Address) = (起始地址 / 数据字节数) 的向下取整 × 数据字节数
这个方程式确定突发中第一次传输的地址:
- 传输1的地址(Address_1) = 起始地址
对于增量(INCR)突发,以及地址尚未包装的包装(WRAP)突发,这个方程式确定突发中第一次传输之后任何传输的地址:
- 传输N的地址(Address_N)= 对齐地址 + (N - 1) × 数据字节数
对于包装(WRAP)突发,包装边界变量(Wrap_Boundary)定义了包装边界:
- 包装边界(Wrap_Boundary)= (起始地址 / (数据字节数 × 突发长度)) 的向下取整 × (数据字节数 × 突发长度)
对于包装(WRAP)突发,如果传输N的地址(Address_N)= 包装边界 + (数据字节数 × 突发长度),那么使用这个方程式计算当前传输:
- 传输N的地址(Address_N)= 包装边界
使用这个方程式计算任何随后的传输:
- 传输N的地址(Address_N)= 起始地址 + (N - 1) × 数据字节数 - (数据字节数 × 突发长度)
这些方程式确定突发中第一次传输使用哪些字节通道:
- 较低字节通道(Lower_Byte_Lane)= 起始地址 - (起始地址 / 数据总线字节数) 的向下取整 × 数据总线字节数
- 较高字节通道(Upper_Byte_Lane)= 对齐地址 + (数据字节数 - 1) - (起始地址 / 数据总线字节数) × 数据总线字节数
这些方程式确定突发中第一次传输之后所有传输使用哪些字节通道:
- 较低字节通道(Lower_Byte_Lane)= 传输N的地址 - (传输N的地址 / 数据总线字节数) 的向下取整 × 数据总线字节数
- 较高字节通道(Upper_Byte_Lane)= 较低字节通道 + 数据字节数 - 1
数据传输在以下位宽上:
- DATA((8 × 较高字节通道) + 7 : (8 × 较低字节通道))