深入AXI4总线(一)

AXI总线基本就是基于握手协议的,所以工欲善其事必先利其器,先了解一下握手协议

一、握手机制

1、VALID/READ握手机制
AXI总线共有5个独立的通道,分别为写地址、写数据、写响应、读地址、读数据通道。5条通道相互独立,有一些细小的差别,但都共有一套握手机制:VALID/READY机制,来实现信息的传递。

作为一种双向流控机制,VALID/READY机制可以使发送接收双方都有能力控制传输速率。

发送方置高VALID信号表示发送方已将数据,地址或者控制信息已经就绪,并保持于消息总线上。

接收方置高READY信号,表示接收方已经做好接收的准备。
在这里插入图片描述
当双方的VALID/READY信号同时为高,在时钟ACLK上升沿,完成一次数据传输。所有数据传输完毕后,双方同时置低自己的信号。

所谓的双向流控机制,指的是发送方通过置起VALID信号控制发送的时机与速度,接收方也可以通过READY信号置起与否控制接收速度。

发送方拥有传输的主动权,但接收方在不具备接收能力的时候,也能够置低信号,停止传输,反压发送方。

2、VALID/READY的三种情况
VALID/READY信号按照到达信号顺序可以分为3种情况:
VALID信号先到达
在这里插入图片描述
发送方VALID信号到了,这时还不到T2时刻,并带来了新的数据(数据通道),地址或者控制信号(地址通道),总之是信息(information)。

但过了T2也没见到接收方的READY信号。这时接收方被占用,可能上一次数据还没用存储完,过了T2才过来,T3时刻传输完成。

在这种情况下,接收方通过READY信号控制了传输速度,反压了发送速度。
协议规定这种情况下,VALID信号一旦置起就不能置低,直到完成握手(handshake occurs),至少传输一周期数据。

在设计接收方逻辑的时候,检测到VALID信号置起,如果系统正忙,完全可以发送方等待,发送方在完成传输之前都不会将VALID信号置低,不需要考虑发送方撤销传输的可能。

协议另外规定:发送方不能通过等待接收方READY信号来确定VALID信号的时机。

A source is not permitted to wait until READY is asserted before asserting VALID.

笔者个人理解,READY信号有可能先到,如下图,但是设计发送方逻辑时,不能将READY信号作为置高VALID逻辑的条件,比如将READY信号通过组合逻辑生成VALID信号。

换句话说,发送方准备发送,置起VALID信号完全是主动和独立的过程。接收方READY信号按照协议可以依赖发送方VALID信号,但是如果此时发送方也依赖接收方信号,就会造成锁死的情况,所以协议在这里强调了VALID信号的主动性。

module axi_src
...
//assign VALID = SRC_CONDITION && READY;//NOT permitted and may cause deadlock
assign VALID = SRC_CONDITION;//permitted
...
endmodule

module axi_dst
...
assign READY = CONDITION && VALID;//permitted
...
endmodule

READY信号先到达
在这里插入图片描述
READY信号很自由,可以等待VALID信号到来再做响应,但也完全可以在VALID信号到来前就置高,表示接收端已经做好准备了。

而且READY信号与VALID信号不同,接收方可以置起READY信号,还可以置低READY信号。只要此时VALID信号没有置起,这种操作就是完全可以的。

同时到达
在这里插入图片描述
同时到达就很简单了,等到下一个时钟上沿T2,传输就在一个时钟周期里完成了。

3、实现细节
前文讨论过,READY信号原则上由接收方自身的接收状况及VALID信号控制。(或者仅由接收方自身的接收状况决定)。协议中并没有规定READY信号的默认状态,即未进行传输时的电平状态(default value)。

协议中AW/AR READY(读写地址通道)默认电平时高电平。若默认是地电平,则每次传输至少需要2个周期才能完成,第一个周期置高VALID信号,第二个周期从机才会置高READY信号。相当于每次传输增加一个周期时间的开销。这在某些情况下对传输速率有较大的影响。

二、架构

五个独立通道
AXI4总线的一大特征是它有5个独立的传输通道,这些通道都只支持单向传输。

单向传输的通道意味着两端的终端节点是有身份差距的。在AXI总线传输中,通道两端分为Master主机与Slave从机,主机总是发起读写请求的一方。常见的主机有CPU、DMA,而存储介质控制器(比如DDR控制器)则是典型的从机。主机可能通过从机读取或者写入存储介质。而显然从机不能主动向CPU写入数据。

通道的读写定义都是根据主机来定义的,那么五个通道都有:
(1)读地址(AR) read address
(2)读数据(R)read data
(3)写地址(AW) write address
(4)写数据(W) write address
(5)写回复(R)write response

读回复借用了读数据通道。至于为什么有独立的写回复,而无读回复通道,之后再讲。

1、读写传输操作中的通道
首先是写传输操作(Write transaction):
如下图所示,主机首先在写地址通道(AWC)上告知从机本次传输操作(transaction,对应后文中的“传输操作”)的特性,包括地址和控制信息
然后,在写数据通道(WDC)向从机写入数据,一次传输操作中可能包含多个数据传输(data transfer)。

最后从机在接收到写数据之后,通过写回复通道(RC)将本次传输操作的响应告知主机。主机以收到从机的响应信号,作为本次传输操作的结束标志。手册中提到,写回复是针对整个传输操作(transaction)的,而不是针对每个写入数据(data transfer)。

在这里插入图片描述
所有传输操作中,RC和WDC的关系如上图所示,写回复必然是在收到传输操作中最后一个写数据之后触发。

但是在AWC(写地址通道)与WDC(写数据通道)的关系并不局限于一种情况。一般来说,写数据都发生在写地址操作之后,但也不是绝对的,在有些情况下,可以先写数据,或者在同一个周期内写入数据和地址,都是允许的。这也表现了AXI通道之间的独立性。(例外:写回复通道和写数据通道之间的独立性较弱)。

接下来看读操作(Read transaction):
读操作只涉及两个通道,首先主机在读地址通道(ARC)上写入本次传输操作(Transaction)待读取数据的地址以及控制信息。

从机在接收到地址后,将该地址上的数据通过读数据通道传输给主机。
在这里插入图片描述
读地址通道实际上仍由主机写入地址,只不过是写入要读取数据的地址。
读地址通道与读数据通道完全独立,当然从机发出读数据一定是发生在主机写入读地址之后。

无论是读还是写操作,AXI总线支持,或者说基于突发传输(Burst Transaction)。简单来说,主机可以写入起始地址以及突发传输的长度等信息,从机将从起始地址开始,依次接收主机传输的写数据,或者读取连续地址上的数据,作为读数据传输给主机。
上面两张图中,一次传输操作中包括了一次地址与控制信息、多个数据。

2、通道定义
五个通道有一些共同的定义:
每个通道都使用VALID/READY握手机制。
在读写数据两条数据通道中,传输突发传输中的最后一个数据,必须要给出LAST信号, 来标识这是此次突发传输中的最后一个数据。

读&写地址通道(ARC&AWC)
写入本次传输操作所需的地址和控制信息,读写操作都拥有各自的地址通道。

读数据通道(RDC)
读数据通道上包括从机发送给主机的读数据,以及从机对于本次传输操作的回复,具体的读操作状态回复情况会在之后讨论。总线数据位宽可以是8、16、64、128、256、512或者是1024bit。

写数据通道(WDC)
写数据通道用于将主机的写数据传输至从机,位宽和读数据通道位宽相同。写数据通道有一点读数据通道所不具有的特性是STROBE信号,用于标识写数据中有效的传输字节。即有些无效的数据,处于减少工作量的目的,或者读写宽度不对称时,被放到写数据通道上和有效数据一起发送。而STROBE的信号的作用就是标识出这些无用的数据,告知从机不需要接收无用数据。

写数据通道设计有缓存,可超前于从机响应本次传输操作,发起下一次写传输操作。

写回复通道(RC)
用于从机将写操作响应回复给主机。所有写传输操作都需要以写回复通道上接收写响应作为完成信号。(写回复是针对一次传输操作的,而不是针对每一次数据)

为什么有写回复通道,而没有读回复通道呢?
这个问题从数据流向看出来,主机在读取数据时,数据在读通道上传输,从从机流向到主机。而读回复由从机向主机报告读操作情况,信号的数据流向也是从从机到主机,所以读回复可以合并在读数据通道中。

但写回复通道的数据流向和写数据相反。写数据是从主机到从机,而写回复为从机报告写操作的完成情况,流向为从从机到主机,无法合并到数据通道中,另一方面,写回复又是不可或缺的,所以就有了一条独立的写回复通道。

3、通道上的信号
全局信号
AXI总线中两个全局信号:ACLK,全局的时钟信号,所有的传输操作都发生在ACLK的上升沿。
ARESETn,全局复位信号,低电平有效。在复位问题上,AXI规定了一些细节,在后续讨论。在这里插入图片描述
注意:ARESETn一般是一个同步复位信号,A代表AXI,而不是Async。

写地址通道
在这里插入图片描述
写地址通道的信号可以分为3个部分:经常用到的基础信号、突发传输的控制信号、内存访问相关以及其他的在基础阶段不是很常用的信号。

基础信号即AWADDR:传输操作的起始地址
AWVALID、AWREAD:所有通道都使用的握手信号

突发传输指的是传输一次起始地址后,进行多次地址上的连续的读写操作。突发传输有关的操作包括:AWLEN:突发传输的长度,即在一次突发传输中数据传输的个数。
AWSIZE:每次突发传输中数据传输的位宽。
AWBURST:突发传输的类型。

其他信号包括和内存操作原子有关的AWLOCK、AWCACHE、AWPROT以及用于用户自定义的AWUSER信号,都将会在后面涉及到。

读地址通道
与写地址通道十分类似

写数据通道
在这里插入图片描述
值得注意的是AXI4不再支持WID信号,这和AXI4的乱序机制有关,AXI4规定所有数据通道的数据必须顺序发送。
WDATA与常见的握手信号不再赘述,WDATA的可使用位宽可以见上文。WSTRB信号用于标记传输数据中有效的字节,每个WSTRB位对应一个字节的位宽,比如数据位宽为64位,那么WSTRB信号的位宽就是1个字节,共8位。

WLAST标识一次突发传输中最后一次数据传输,如果没有正确的WLAST的信号,就会造成写入地址的混乱,导致从机无法正确接收写数据,从而造成从机不再拉高READY信号的现象。

写回复通道
在这里插入图片描述
与写数据通道不同,写回复通道支持BID,即支持乱序的写回复,关于乱序的问题,后面再讨论。
BRESP回复上一次的写状态。

读数据通道
在这里插入图片描述
读数据通道与写数据通道类似,区别有两点:一、支持RID信号,二、因为读回复消息在读数据通道上传输,所以集成了RRESP信号,用于返回读状态,值得注意的是读回复信号和读数据一样,发送方(source)为从机(slave)。

4、通道间的关系
一般情况下AXI的五个通道之间是独立的,但是AXI的通道之间需要保证以下三种联系:
(1)写回复必须在其所属传输的最后一个写数据完成后(write response must follow the last write transfer in the transaction)
(2)读数据必须在接收到读地址信号后产生
(3)通道间的握手需要满足通道间的握手依赖性(handshake dependencies)

5、握手依赖关系
协议规定握手依赖的目的是为了防止死锁(deadlock)。
(1)发送方VALID一定不能依赖接收方的READY信号
(2)接收方READY信号可以检测到VALID置起后再置起有效,换句话说,可以依赖VALID信号

我们首先看看读传输的情况,读地址通道中主机为发送方、从机为接收方;读数据通道中主机为接收方、从机为发送方。其中:
图中的单头箭头表示:其指向的信号可以在箭头起始信号置起之前或之后置起(无依赖)。
图中的双头箭头表示:其指向信号必须在箭头起始信号置起之后在置起(指向信号依赖起始信号)
在这里插入图片描述
其具体的依赖可以表述为:
(1)主机的ARVALID信号不能等待从机的ARREADY信号置起后才置起,反之可以
(2)从机的ARREADY信号可以先与主机的ARVALID信号置起(如单头箭头所示)
(3)从机的RVALID信号必须等到ARREADY和ARVALID信号均置起后置起(如两个双箭头所示)
(4)从机的RVALID信号不能等待主机的RREADY信号置起后才置起,反之可以
(5)主机的RREADY信号可以在RVALID置起前置起,换句话说无依赖关系(如单头箭头所示)

接下来是写传输的情况,在写数据以及写地址通道中,主机作为发送方;在写回复通道中从机作为发送方。
在这里插入图片描述
从图中看到,只有两组代表着依赖关系的双向箭头指向了BVALID,这代表着从机首先等到WVALID和WREADY置高,此时此时写传输启动。再等待WLAST置起,此时传输完成。只有在传输完成之后才能根据情况生成写回复信号中BRESP信号。此时置高BVALID信号表示从机的写回复已经就绪。

此外另外三组单头箭头表示AWREADY、WREADY信号可以根据AWVALID、WVALID
信号生成,但不存在依赖关系。同样的关系还存在于BREADY与BVALID信号之间。

在AXI4中,写传输相较此前增加了从机置起BVALID信号所需的依赖。
在这里插入图片描述
从上图中增加的依赖可以看出,从机 BVALID 信号有效需要等待 AWVALID 以及 AWREADY 信号置起,完成地址传输作为前提条件之一。这在某种程度上是自然的,肯定需要等待从机获取本次操作的地址以及数据之后才能回复写入情况。一般而言地址会在数据之前传输完毕,不过协议并没有要求这点,所以从机需要等待地址写入后再产生写回复,作为本次传输完成的标志。

拓扑连接
从上述信号我们可以发现,原生的AXI总线为单对单的拓扑结构,主机与从机间对应信号直接相连,比如下图中的VALID/READY信号。
在这里插入图片描述
在一个系统中,显然不可能只有单个主机和从机。AXI总线需要借助总线互联IP(Interconnect)来实现多对的拓扑,结构如下图。Interconnect拥有多个Master/Slave接口,并在内部基于轮询或者优先级策略对多路数据进行路由转换,这在后续文章中详细讨论。
在这里插入图片描述
6、实现细节
AXI协议并没有对写数据以及写地址通道中的握手信号先后顺序做出规定。因此,实现中数据可以先于地址完成握手。这适用一些情况,比如写地址通道为了满足时序,触发器的级数与写数据通道不同,这样一来两通道握手的先后顺序可能不同。

这反映了AXI通道之间的独立性,利用该特性可调整路径中的触发器,满足时序约束。

三、传输事务结构

Burst-based的AXI协议
在数据传输的范畴中,就使用burst来表示一种传输模式:在一段时间中,连续地传输多个(地址相邻的)数据。此时可译为突发传输。

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

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

再展开一层,两个AXI组件为了传输一组数据而进行的所有交互称为AXI Transaction,而AXI传输事务,包含所有5个通道上的交互。

AXI是一个burst-based协议,AXI传输事务中的数据以burst形式组织,称为AXI Burst。每个传输事务包括一到多个Burst。每个Burst中传输一到多个数据,每个数据传输称为AXI Transfer。双方握手信号就绪后,每个周期完成一次数据传输,因此AXI Transfer又被称为AXI Beat,一拍数据。

在这里插入图片描述
传输事务结构
1、读地址结构
在整个传输事务过程中,主机首先将接下来的burst传输的控制信息以及数据首个字节的地址传输给从机,这个地址被称为起始地址。在本次burst后续传输期间,从机将根据控制信息计算后续数据的地址。

控制信息以及起始地址在读/写地址通道(AWC/ARC)传输。
注意:单次burst传输中的数据,其地址不能跨越4KB边界。

协议中之所以规定一个burst不能跨越4K边界是为了避免一笔burst交易访问两个slave(每个slave的地址空间是4k/1k对齐的)。4K对齐最大原因是系统中定义一个page大小是4k,而所谓的4k边界是指低12bit为0的地址。

地址通道中传输的控制信息中包括三项突发传输相关的信号(AR/AW均一致,下图以AR为例):
在这里插入图片描述
(1)突发传输长度(burst length),指一次突发传输中包含的数据传输(transfer)数量,在协议中使用AxLen信号控制。
在AXI4中,INCR类型最大支持长度为256,其他类型最大长度为16,。而AXI3中这一数字无论何种模式均为16。因此在AXI4中AxLen信号位宽为8bit,AXI3中的AxLen则仅需要4bit。

当然突发长度至少为1,不然也就没有传输发升了。协议中的AxLen信号从零开始表示,实际的长度值为AxLen+1.

突发传输长度在不同的模式(burst type)下有一些限制,包括:
①对于WRAP模式,突发传输长度仅能为2,4,8,16
②在一次突发传输中,地址不能跨越4KB分区
③一次突发传输不能在完成所有数据传输前提前结束(early termination)。

协议中多次强调,通信双方都不能在传输事务的所有Transfer完成前提前结束。哪怕发生错误,也要走完整个传输事务的流程。

但是主机有办法减少传输的数据。在写传输事务中,发送方可以通过置低所有的写有效位,使写数据无效。在读传输事务中,主机可以直接丢弃读取到的数据。

(2)突发传输宽度(burst size),指传输中的数据位宽,具体地,是每周期传输数据的字节数量,在协议中使用AXSIZE信号控制。
自然地,突发传输数据宽度不能超过数据本身的位宽。而当数据总线位宽大于突发传输宽度,将根据协议的相关规定,将数据在部分数据线上传输。
突发传输宽度信号AXSIZE位宽为3bit,表示为:
在这里插入图片描述

在这里插入图片描述
(3)突发传输类型(AxBURST),类型共有三种,分别为FIXED、INCR以及WRAP。使用2位二进制数表示。

在这里插入图片描述
FIXED类型中,burst中所有数据都使用起始地址。该模式适合对某个固定地址进行多次数据更新,比如读写一个fifo时,读写地址就是固定的。

INCR类型最为常用,后续数据的地址在初始地址的基础上进行递增,递增幅度与传输宽度相同。适合对于RAM等通过地址映射(mapped memory)的存储介质进行读写操作。

下面这段解释为什么会递增幅度与传输宽度相同?
对于一次burst传输,只给出首地址,burst内部的地址按照2^ size累加,也就是按每个数据字节数累加,协议之所以这么做,原因是计算机底层存储是按字节存储的。假设传输的数据是32bit,也就是4个字节,那么实际上会分配4个地址给这个32bit数据,所以按照标准的axi协议,相邻的burst首地址按照(awlen+1)* 2^ awsize累加,master发送首地址时要遵循这种方式,slave收到地址后,按照标准协议,解析出的burst内部的地址就是按2^size累加的。这样一来,除非size为0,也就是数据为1个字节,地址才是连续的,否则,解析出的地址不连续,不过可以根据用户侧需求,对标准协议地址进行处理,使之连续。上面说的有点混乱,举个例子:假如awlen为3,也就是一次突发传输4个数据。awsize为2,也就是每个数据4字节,32bit,第一次突发传输首地址awaddr为0。那么,根据标准axi协议,slave解析出的第一个burst四个数对应的地址为0,4,8,12,即按字节数累加。master发送第二个burst时,awaddr必须为16,slave解析第二个burst四个点得到的地址为16,20,24,28。这样就相当于给每个32bit分了四个地址,在底层每个地址存一个字节。应用时,有时不涉及底层的存储,假如只完成一个memory的读写,希望使用连续地址,那么用户可以讲按照标准协议解析出的地址除以4之后使用,则0,4,8,12就变成了0,1,2,3。另外,同一个burst的地址不能跨4K边界,而不是4KB,4KB讲的是容量。这是因为底层page的存储容量为4KB。一个burst内部地址按字节数累加,地址跨4K,也就是操作一个burst的数据时跨了4KB,跨page了,这是不允许的,一个 burst的数据必须在同一个page里,否则容易出现错误。

WRAP类型比较特殊,首先根据起始地址得到绕回边界地址(wrap boundary)与最高地址。当前地址小于最高地址时,WRAP与INCR类型完全相同,地址递增。但是递增到地址到达最高地址后,地址直接回到绕回边界地址,再进行递增,就这样循环往复。最高地址由绕回边界地址计算得到:wrap boundary + (N_bytes x burst_len)

根据协议手册上表示,WRAP适合对cache的访问。

2、读写数据结构
在AXI数据传输过程中,主要涉及到窄位宽数据传输(Narrow Transfer)、非对其传输(Unaligned Transfer)以及混合大小端传输(max-endianness)等问题。
(1)Narrow Transfer
在窄位宽写传输中,主机需要告知从机数据数据通道中哪些字节是有效的,需要使用到写数据通道中的WSTRB信号,WSBRT信号中的单个bit置起,表示对应位置上的字节有效,对应关系为:
WSTRB[n] 对应WDATA[8n+7,8n],也就是:当WSTRB[n]为1时,WDATA[8n+7:8n]有效。

WSTRB信号比特位宽等于数据通道位宽的字节数量,比如32比特位宽的数据通道,对应的WSTRB信号宽度为4bit。

对应于下图的情况中,灰色的部分代表数据无效,第一次的传输中,低地址第一字节有效,其他数据无效的,WSTRB的信号为0x01,WSTRB[0]为1,即WDATA[7:0]有效。
在这里插入图片描述
接着上图继续说,上图的窄位宽传输有以下特点:
①burst传输长度为5
②burst传输宽度为8bit
③起始地址为0x0
④数据总线宽度为32bit
⑤突发类型为INCR

在图中我们发现,在每次数据传输中使用的数据总线字节位置(byte line)不同,尽管数据以字节为单位,分为多个周期传输,但是数据的位置仍与其地址对应。D[7:0]将写入起始地址0x0,故位于最低字节。D[15:8]将写入地址0x1,故位于次低字节。

个人理解该设计的意义在于,当主机是因为从机或者其他客观条件限制,需要进行窄传输时,可以一次性将数据放置于数据总线上,只需在每次传输期间改变WSTRB信号即可。以上图为例,主机将D[31:0]放置与总线,在接下来的四个周期,仅需要对WSTRB进行移位,即可依次完成4个字节的传输。

该结构有利于memory类型的从机进行写入处理。结合下图讲解,在64bit位宽的总线上进行32bit位宽传输,起始地址为0x4,此时假设存储介质位宽与总线位宽一致为64bit。

在transfer 1st中,从机获取整个总线上的64bit数据存储至存储介质中,比如DDR,并利用WSTRB作为mask信号屏蔽无效的低32bit(比如DDR的DQM信号)。这时候存储介质的写入地址为0x0,但实际只从地址0x4开始写入了32bit数据。在后续的transfer继续按以上模式工作。

窄传输中通过主机来调整有效数据的字节位置,以及给出字节有效信号WSTRB,能够使从机无需进行数据重组等工作。
在这里插入图片描述
注意:协议未规定窄传输中从机的具体实现,这里举了一个设想的例子,后续需要结合窄传输的用途再研究考证。
在读传输中,从机的操作逻辑与写传输中的主机相同,但是从机没有类似WSTRB的信号。所以需要主机根据突发传输宽度与总线位宽,计算当前总线中有效数据所在字节位置,读取数据。

协议规定在INCR和WRAP模式中每次使用byte line必须不同,即数据位置与地址对应。而在FIXED模式中,整个传输过程中使用相同的byte line(地址反正不会变)

(2)Unaligned Transfer(非对齐传输)

AXI协议支持地址非对齐传输,允许突发传输的首字节地址,即起始地址和突发传输位宽不对齐。举个例子,总线位宽为32bit,如果起始地址为0x1002,则产生了非对齐现象。与32bit位宽总线对齐的地址需要能被4整除,即ADDR[1:0]=2’b00。

注意:此处对齐与否应该取决于突发传输的宽度,而不是总线位宽。
对于非对齐传输,主机会进行两项操作:
①即使起始地址非对齐,也保证所有传输是对齐的
②在首个transfer中增加填充数据,将首次传输填充至对齐,填充数据使用WSTRB信号标记为无效。

我们通过几个例子来说明主机具体的工作:
在这里插入图片描述
起始地址是0x1,非对齐,但是主机通过添加一字节的填充数据将transfer 1st的实际地址调整为对齐的0x0,并用WSTRB信号为4’b1110标识出最低字节上无效的填充数据。

在读传输中,从机也按照同样的原则,在读数据中填充无效数据实现对齐,由主机自行分离。

在这里插入图片描述

这个例子是窄传输+非对齐传输,但是问题不大,根据之前的经验来看。首先起始地址为不对齐的0x07,所以首先将首个传输填充至与突发传输位宽32bit对齐。
在这里插入图片描述
至此非对齐问题就解决了,接下来就是简化为窄传输。上图中32bit数据在64bit总线上传输,在 transfer 1st 中 再填充 4 个字节。后续的 transfer 中则遵从窄传输的原则即可。

(3)Byte Invarience
混合的大小端模式,首先知道内存中有2种大小端模式:在这里插入图片描述
大端认为:高字节(MSB)应该存在低地址
小端认为:低字节(LSB)应该存在低地址
为了能够使大小端模式在存储中共存,AXI协议设计了一种字节顺序恒定(Byte Invarience)的大小端传输方案。对于存储中包括多个字节的数据结构(单字节自然不存在大小端问题):
①无论大小端模式,每个数据结构存储空间的分配方式是相同的
②该数据结构按照大小端模式决定字节存储的地址顺序
③在传输过程中不考虑数据结构的大小端,按照字节原先存储的顺序,原样传输并存放至对端。

该模式的意义在传输双方均不对数据结构的大小端进行解析转换,而严格按照字节的存储顺序进行传输并转存,防止大小端共存产生数据覆盖。

4、读写回复结构
读写传输事务(Transaction)都存在2bit位宽的回复信号RRESP/BRESP,分别存在4种回复情况,分别为:
(1)OKEY:常规访问成功
(2)EXOKEY:独占访问成功
(3)SLVERR:从机错误,尽管从机接收到了访问请求,但是因为种种原因向主机返回了一个错误的状态,AXI传输事务的回复由应用具体决定,可能包括以下错误场景:
①FIFO或者缓冲区溢出
②主机发起了不支持的传输位宽
③尝试向读保护的地址写入数据
④超时
(4)DECERR:解码错误,一般由interconnect组件产生,表示主机发送的传输事务地址无效,无法将整传输事务发送给某个从机。

注意:在写传输事务中,单个写回复针对的是整个burst,而不是burst中的单个transfer。但是在读传输事务中,从机可以为突发传输中每一个读传输数据产生不同的读回复信号。

猜你喜欢

转载自blog.csdn.net/weixin_43727437/article/details/107521783