AXI总线的Burst Type以及地址计算 | WRAP到底是怎么一回事?
目录
AXI总线的Burst Type以及地址计算
AXI总线的transaction是burst-based的,因此有必要好好研究一下不同burst type的工作原理。此处略过burst的定义以及burst size、burst length等信号的介绍。
一、概念
1. Transaction/Burst/Transfer/Beat
Transaction指一次传输事务,实际上包括了address phase, data phase与response phase,但由于AXI协议主要为data的传输服务,且AXI的data传输为burst-based,因此通常将Transaction与Burst等同。
Transfer是Burst的组成元素,一个Burst可以由一个或多个Transfer构成。而一个Beat指一拍,如果一个Transfer只需一拍,那么Transfer也可以等同于Beat。
总结:Transaction ≈ Burst > Transfer ≈ Beat。
2、对齐
根据对齐长度的不同,分为几类:
- 对单个transfer的num_of_bytes对齐,即start_addr可以被num_of_bytes整除,称为对齐传输、否则为非对齐传输。在非对齐传输中,可能会存在某些Byte无效的情况,通过STRB进行byte valid的标识。一般所说的对齐指的就是这种对齐。
- 对单个burst的总byte量(num_of_bytes * burst_len)对齐,此时WRAP传输的start_addr = lower_bound_addr。即不存在到达上界回卷的情况,与INCR无异。这种对齐通常是用于计算WRAP的边界地址的。
二、Burst Type介绍
AXI总线中,读写地址通道AR/AW的AxBURST[1:0]信号用于定义该transaction的burst type。
AxBURST[1:0] | Burst Type |
---|---|
2’b00 | FIXED |
2’b01 | INCR |
2’b10 | WRAP |
2’b11 | Reserved |
-
FIXED
- 同一个burst内每个transfer的地址保持一致。
- 同一个burst内byte lanes保持一致,但可以通过WSTRB选择每个transfer的有效bytes。
- 常用于对同一位置的重复访问,例如读或清空FIFO。
-
INCR
- 同一个burst内地址随transfer递增。
- 地址递增量为一个transfer的大小。
- 常用于对normal sequential memory的访问。
-
WRAP
-
start address需按照transfer的大小进行对齐(Align)。
-
burst length只能从2,4,8,16中取值。
-
地址递增达到upper boundary时回卷到lower boundary。upper boundary与lower boundary的地址计算在后文介绍。
-
通常用于从memory中读取cache line。
因为master对cache的访问通常是cache line中的某些bytes,但当发生cache miss时,从memory读回来的是整个cache line。而此时master发送的地址却不一定是cache line的起始地址,而可能位于中间,因此递增到upper boundary时需要回卷到lower boundary,才能将该cache line读完。
-
三、地址计算
1. aligned_addr的计算
aligned_addr = Floor(start_addr/num_of_bytes) * num_of_bytes
其中,num_of_bytes为单个transfer的字节数,start_addr即master发起transaction的地址,aligned_addr则是对齐地址,如果两者相同代表该transaction是对齐传输,否则就是非对齐传输。
2. WRAP的上下界地址计算
lower_bound_addr = Floor(start_addr/ (num_of_bytes * burst_len)) * (num_of_bytes * burst_len)
即下界要根据transaction的总bytes对齐得到下界。
upper_bound_addr = lower_bound_addr + (num_of_bytes * burst_len)
上界则是由下界加上总bytes得到。
在WRAP transaction中,start_addr依次递增num_of_bytes,达到upper_bound_addr后,下一个transfer地址回到lower_bound_addr。
3. Byte Lane的计算
总线宽度data_bus_bytes包括多个bytes,每个byte称为一个byte lane,STRB就是用来标记byte lane是否valid的信号。在某些情况下,data bus中并非每个byte lane都是valid的,例如:
- 单个transfer的bytes ≠ data bus size;
- 非对齐传输,即start_addr ≠ aligned_addr;
- master逻辑主动丢弃某些bytes。
第三种与master功能模块的设计逻辑有关,不在协议讨论范围,只讨论前两种情况。在前两种情况中,data bus中有效的最低byte lane与最高byte lane可以通过如下方式进行计算:
Lower_Byte_Lane = addr - Floor(addr/data_bus_bytes) * data_bus_bytes
data_bus_bytes指的是总线宽度,因为STRB决定的是data bus上的byte lane,所以要对data_bus_bytes对齐。
Upper_Byte_Lane :
若为对齐传输(addr = aligned_addr),
Upper_Byte_Lane = Lower_Byte_Lane + num_of_bytes - 1
否则
Upper_Byte_Lane = aligned_addr + num_of_bytes - 1 - Floor(addr/data_bus_bytes) * data_bus_bytes
总结来说,单纯的原因一不会导致Lower_Byte_Lane偏移,但可能造成Upper_Byte_Lane不对齐。而单纯的原因二就会导致Upper与Lower的Byte Lane都不对齐。
Byte Lane的计算不只是针对上述原因,事实上任何Burst传输都可以计算,只是规整的传输计算出来的Byte Lane上下限一般就是data bus的最大最小byte lane。
参考文献
[1] AMBA® AXI and ACE Protocol Specification
更多推荐



所有评论(0)