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’b00FIXED
2’b01INCR
2’b10WRAP
2’b11Reserved
  • FIXED

    1. 同一个burst内每个transfer的地址保持一致。
    2. 同一个burst内byte lanes保持一致,但可以通过WSTRB选择每个transfer的有效bytes。
    3. 常用于对同一位置的重复访问,例如读或清空FIFO。
  • INCR

    1. 同一个burst内地址随transfer递增。
    2. 地址递增量为一个transfer的大小。
    3. 常用于对normal sequential memory的访问。
  • WRAP

    1. start address需按照transfer的大小进行对齐(Align)。

    2. burst length只能从2,4,8,16中取值。

    3. 地址递增达到upper boundary时回卷到lower boundary。upper boundary与lower boundary的地址计算在后文介绍。

    4. 通常用于从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

  • 39
    点赞
  • 236
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值