在手册的术语表中,与 AXI 传输相关的有三个概念,分别是 transfer(beat)、burst、transaction。用一句话串联就是:
在 AXI 传输事务(Transaction)中,数据以突发传输(Burst)的形式组织。一次突发传输中可以包含一至多个数据(Transfer)。每个 transfer 因为使用一个周期,又被称为一拍数据(Beat)。
所以可以这么理解:transaction就是一次数据burst的传输+对应的读/写命令通道交互过程。传输事务包含数据和命令的传输,burst指的是数据传输。
而一次burst传输通常包含一拍到多拍数据,每一拍称为transfer或beat
一个Beat(transfer)的位宽为dataW=DW Byte,则每一个Byte就对应一个Byte Lane,Byte lane常与wstrobe联系在一起,有多少byte lane就有多少bit的wstrobe
第一种对齐是axi总线上必然的要求,但是往往master在访问slave时,并不能保证addr_start一定与dataW对齐,这时在发送请求时就要master做特殊处理
首先假设
addr_start=0x3
dataW=4 B
transW=5B----实际需要读取数据量
在读数据时,AXI读的实际情况是
addr_start_align=0x0
burstLen=2
此时读回的是0-7地址的8byte数据,实际需要的是3-7地址的数据,所以其他数据被master丢掉
在写数据时,AXI写的实际情况是
addr_start_align=0x0
burstLen=2
第一拍wstrb=0'b1000,第二拍wstrb=0'b1111
出现了narrow写trans。
对于第二种对齐并不是AXI总线本身的强制要求,但是一旦满足该种对齐,此时无论是wrapBurst还是INC burst,AXI的行为是一致的,下文会详细解释。
窄传输在1.2节已经做了一些描述,窄传输一般发生在两种情况下:
但是由于AXI只有写数据有strb信号,读数据没有,所以窄传输情况下读写是不同的处理方式。
这里在介绍一下发生narrow传输的时候,怎么计算有效byte lane的位置,其中Floor表示向下取整。
low_byte_lane = addr_start - Floor(addr_start/DW)*DW
up_byte_lane? =low_byte_lane+transW-1
上面的计算是只在一个beat内的位置,如果up_byte_lane超过一个Beat,就要在第二个beat中计算,超过一个trans,则需要在另一个trans内计算。
带入1.3节的数据
low_byte_lane=3-Floor(3/4)*4=3
up_byte_lane=3+5-1=7
和1.3节结果一致。
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 |
在这里需要突出说明的是Burst Type只和当前Burst有关,Burst之间不会互相影响。举个例子,对于wrap类型,前后两个trans如果都是wrap类型,那么每个trans都有addr_start,每个trans只在本trans的addr_low_bound和addr_up_bound之间wrap,和其他trans没有关系。INCR和FIXED也是一样的,每一个trans都有自己的addr_start,只是常用的INCR多个trans的addr_start是连续的,给人的感觉地址在两个trans之间incr,实际这种incr是master计算的和AXI总线本身没有关系。
下面一段摘自AXI总线的Burst Type以及地址计算 | WRAP到底是怎么一回事?_axi wrap-CSDN博客
这一段的总结很好,就直接搬过来
通常用于从memory中读取cache line。
因为master对cache的访问通常是cache line中的某些bytes,但当发生cache miss时,从memory读回来的是整个cache line。而此时master发送的地址却不一定是cache line的起始地址,而可能位于中间,因此递增到upper boundary时需要回卷到lower boundary,才能将该cache line读完。
对于FIXED和INCR类型的Burst,其地址计算就不在这里展开,比较简单。本节只介绍Wrap Burst的地址计算。
addr_low_bound=Floor(addr_start/BurstW)*BurstW
addr_up_bound? = addr_low_bound + BurstW
可以看到虽然有wrap,但是BurstW是不变的。另外addr_low_bound就是trans的burstW向下对齐的地址,所以如果addr_start=addr_low_bound,该trans的最后一个beat地址肯定是addr_low_bound+BurstW-1,所以永远达不到addr_up_bound,就不存在wrap,此trans的处理过程和INCR完全一致。下面举个例子来说明:
wrap trans只支持起始地址DW对齐
addr_start=0x4,AxLEN = 3, AxSIZE = 2, AxBURST = 3
DW=4
transW=DW×(AxLEN+1)=16
则
addr_low_bound=Floor(0x4/16)*16=0
addr_up_bound=0+transW=16
所以4个beat的地址分别为:
beat0:0x4
beat1:0x8
beat2:0xc
beat3:0x0(0x10到达上界,所以wrap到0)