AXI的burstType(Fixed/Inc/Wrap)/narrow/及地址计算

发布时间:2024年01月24日

1.AXI的几个概念

1.1 Transaction/Burst/Transfer/Beat

在手册的术语表中,与 AXI 传输相关的有三个概念,分别是 transfer(beat)、burst、transaction。用一句话串联就是:

在 AXI 传输事务(Transaction)中,数据以突发传输(Burst)的形式组织。一次突发传输中可以包含一至多个数据(Transfer)。每个 transfer 因为使用一个周期,又被称为一拍数据(Beat)。

所以可以这么理解:transaction就是一次数据burst的传输+对应的读/写命令通道交互过程。传输事务包含数据和命令的传输,burst指的是数据传输。

而一次burst传输通常包含一拍到多拍数据,每一拍称为transfer或beat

1.2 Byte lane与strobe

一个Beat(transfer)的位宽为dataW=DW Byte,则每一个Byte就对应一个Byte Lane,Byte lane常与wstrobe联系在一起,有多少byte lane就有多少bit的wstrobe

1.3?起始地址对齐

  • 起始地址与axi data width对齐。也就是dataW=DW Byte,则要求addr_start是DW的整数倍
  • 起始地址与burst width对齐。也就是burstW=DW×burstLen Byte

第一种对齐是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.4?narrow transfer

窄传输在1.2节已经做了一些描述,窄传输一般发生在两种情况下:

  1. addr_start和DW不对齐
  2. 实际传输数据位宽比DW小

但是由于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节结果一致。

2.Burst Type介绍

AXI总线中,读写地址通道AR/AW的AxBURST[1:0]信号用于定义该transaction的burst type。

AxBURST[1:0]Burst Type
2’b00FIXED
2’b01INCR
2’b10WRAP
2’b11Reserved

在这里需要突出说明的是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博客

这一段的总结很好,就直接搬过来

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读完

3.地址计算

对于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)

文章来源:https://blog.csdn.net/cy413026/article/details/135823564
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。