在之前的文章中,我们着重介绍了关于AXI4的握手协议它可以使得传输的双方都可以自如地控制传输的速率,我们主要介绍了握手协议出现的3种可能情况。然后对于AXI4交易通信的握手信号的关系做出了介绍:(1)在AXI4互联中 ,VALID信号不依赖交易中其他元件的READY信号(2)READY信号能够等待确认VALID信号;之后介绍了读交易和写交易种握手信号的依赖关系。在本文中,我们将介绍AXI4的猝发传输相关内容。
对于传输而言,我们首先考虑最基本的情况,我们在传输开始的时候,主机首先给出传输相关的控制信息和传输的地址,然后进行传输。这样做就实现了一个最基本的传输过程。但是,在实际应用的过程中,我们经常需要面临的情况是,需要对于一片连续空间的数据进行传输,通过之前的方式就显得有点效率低了,我们完全可以只在第一次传输的时候给出相应的控制信息和第一次传输所使用的地址,之后的地址通过自增就能实现,我们把这样的传输方式就称为猝发(突发)(Burst)传输。
AXI协议是基于猝发的,主机通过将控制信息和传输中第一个字节的地址驱动到从机,开始每一次猝发传输。随着猝发的进行,从机必须计算突发中后续传输的地址。一次猝发不能跨越4KB的地址边界。
猝发的长度被指定为:ARLEN[7:0](对于读传输来说)和AWLEN[7:0](对于写传输来说)。
AXI3支持1到16个突发长度,用于所有猝发类型。AXI4将对INCR突发类型的猝发长度支持扩展到1到256次传输。AXI4中所有其他猝发类型的支持仍然保持在1到16次传输。
任何元件都不能提前终止猝发。但是,为了减少写猝发中的数据传输数量,主机可以通过失效所有的写掩码来禁用进一步的写操作。在这种情况下,主机必须完成猝发中的剩余传输。在读猝发事件中,主机可以丢弃读取数据,但它必须完成猝发事件中的所有传输。
在每个数据传输中传输的最大字节数由ARSIZE[2:0](对于读传输来说)和AWSIZE[2:0](对于写传输来说)指定。其具体的编码方式如下:
如果AXI总线宽度大于猝发大小,则AXI接口必须通过传输地址确定每次传输使用数据总线的哪个字节道。任何传输的大小不得超过事务中任何一个代理的数据总线宽度。
AXI4协议定义了3种猝发类型:
(1)固定猝发(FIXED)
(2)递增猝发(INCR)
(3)回卷猝发(WRAP)
AXI的猝发类型通过ARBURST信号(表示读猝发操作类型,属于读地址通道)和AWBURST(表示写猝发操作类型,属于写地址通道)信号进行体现,具体的表示形式和含义如下:
ARBURST[1:0] AWBURST[1:0] |
猝发类型 | 描述 | 访问 |
00 | 固定 | 固定地址猝发 | FIFO类型 |
01 | 递增 | 递增地址猝发 | 普通顺序存储器 |
10 | 回卷 | 递增地址猝发,但在边界处,返回到低地址 | 高速缓存行 |
11 | 保留 | ------ | ------ |
对于回卷式的猝发方式,有2个限制:
(1)起始地址必须对齐传输大小。
(2)猝发的长度必须是2,4,8,16。大于16拍的猝发传输只支持递增类型。回卷和固定类型只限于小于16拍的猝发传输。
为了说明猝发交易中地址的计算方法,首先给出计算过程中需要用到的术语:
(1)Start_Address :主机给出的开始地址
(2)Number_Bytes : 每个数据传输过程中的最大的字节个数
(3)Data_Bus_Bytes :数据总线上字节通道的个数
(4)Aligned_Address : 起始地址的对齐版本
(5)Burst_Length : 在一个猝发中数据传输的总个数
(6)Address_N :在一个猝发中传输N个的地址
(7)Wrap_Boundary :在一个回卷猝发方式的低地址
(8)Lower_Byte_Lane : 一个传输中最低寻址字节的字节通道
(9)Upper_Byte_Lane : 一个传输中最高寻址字节的字节通道
(10)INT(x):x取整操作
下面是计算公式:
对下列的术语进行赋值操作:
- Start_Address = ADDR
- Number_Bytes =
- Burst_Length = LEN + 1
- Aligned_Address = (INT(Start_Address / Number_Bytes) ) x Number_Bytes
在一个猝发中,第一个传输的地址表示为:
- Address_1 = Start_Address
在一个传输中,传输N个数据后的地址表示为:
- Address_N = Aligned_Address + (N – 1) x Number_Bytes
对于WARP的猝发方式,其边界由下式确定
- Wrap_Boundary = (INT(Start_Address / (Number_Bytes x Burst_Length))) x (Number_Bytes x Burst_Length)
如果有
- Address_N = Wrap_Boundary + (Number_Bytes x Burst_Length)
则使用这个公式
- Address_N = Wrap_Boundary。
在边界后,使用这个公式
Address_N = Start_Address + ((N – 1) × Number_Bytes) – (Number_Bytes × Burst_Length).
使用下面的等式确定第一个传输中使用哪个字节通道:
- Lower_Byte_Lane = Start_Address - (INT(Start_Address / Data_Bus_Bytes)) x Data_Bus_Bytes
- Upper_Byte_Lane = Aligned_Address + (Number_Bytes - 1) - (INT(Start_Address / Data_Bus_Bytes)) x Data_Bus_Bytes
使用下面的等式确定一个猝发中第一个传输后用于所有传输中哪个字节通道:
- Lower_Byte_Lane = Address_N – (INT(Address_N / Data_Bus_Bytes)) x Data_Bus_Bytes
- Upper_Byte_Lane = Lower_Byte_Lane + Number_Bytes – 1
传输数据的范围在:
- DATA[(8 x Upper_Byte_Lane) + 7 : (8 x Lower_Byte_Lane)]
AXI协议是基于猝发的,主机通过将控制信息和传输中第一个字节的地址驱动到从机,开始每一次猝发传输。随着猝发的进行,从机必须计算突发中后续传输的地址。本文介绍了猝发的长度,大小和猝发类型,最后介绍了AXI猝发地址的计算过程。