概述

AXI是一种总线协议,由ARM公司提出,面向高性能、高带宽、低延迟的片内总线。主要的特点有:

  1. 分离的地址/控制、数据通道;
  2. 支持非对齐的数据传输;
  3. 基于Burst传输,仅需传输首地址;
  4. 分离的读写数据通道,可供DMA使用(MM2S、S2MM);
  5. 支持超前传输,可以连续发送多个突发传输的首地址而无需等待之前的突发传输完成,这有助于处理流水处理Transaction;
  6. 支持乱序传输;
  7. 易于添加寄存器级来实现时序收敛;

与AXI传输有关的三个概念:

  • Transaction:两个AXI组件为了传输一组数据而进行的所有交互称为AXI Transaction,包括所有5个通道上的交互;
  • Burst:在AXI Transaction中,数据以突发传输(Burst)的形式组织。一次突发传输中可以包含一至多个数据(Transfer)。每个Transfer因为使用一个周期,又被称为一拍数据(Beat);
  • Transfer/Beat:一次成功握手,占用一个时钟周期;

AXI读写架构

AXI协议是基于Burst的传输,共定义了以下5个独立的传输通道:读地址、读数据、写地址、写数据、写响应通道;这五个通道都只支持单向传输。

AXI使用基于VALID/READY的握手机制传输数据,发送端使用VALID表明地址/控制、数据信号是有效的,目的端使用READY表明自己能够接收信息;这是一种双向流控机制,指发送方通过置起VALID信号控制发送的时机和速度,接收方也可以通过READY信号的置起与否控制接收速度。发送方具有传输的主动权,但接收方在不具备接收能力时,也能够通过置低信号停止传输,反压发送方;

此处应注意置起VALID信号是完全主动与独立的过程,接收方的READY信号可以依赖发送方的VALID信号,主要目的是为避免死锁情况,即VALID不能等READY,READY可以等VALID;(注:协议建议将READY的默认电平设置为高电平,这样减少传输过程的时间开销)

read_transaction

读操作

读操作仅涉及两个通道,首先主机在读地址通道(AR)上写入本次传输操作待读取数据的地址以及控制信息;

从机在接收到地址后,将该地址上的数据通过读数据通道(R)传输给主机;

read_transaction

写操作

写操作涉及三个通道,主机先在写地址通道(AW)上告知从机本次写传输操作的属性,包括地址和控制信息;然后在写数据通道上(W)向从机写入数据,一次传输操作中可能包括多个数据传输;最后从机在收完写数据后,通过写响应通道将本次传输操作的响应告知主机,作为写传输操作结束的标志。此处应注意,写回复是针对整个传输(Transaction)操作的,而不是针对每个写入数据(Data Transfer)

AXI一些情况的说明

跨4K问题

单次Burst传输中的数据,其传输地址不能跨越4K边界,注意此处说的不是容量。因为底层Page的存储容量为4KB,一个Burst的数据必须在同一个Page里,否则会出错;

Response问题

Read操作每次transfer都会有一个response,而Write操作的每次Burst才有一次response。为什么AXI spec要做如此规定呢?

  1. 对于Read操作,spec明确规定必须先写addr,再读read data,那么slave返回read data时,已经能确定该transfer是否成功,因此这时的response是确知的,response就可以和read data一起回给master。
  2. 对于Write操作,addr和data均是从master到slave,而response是从slave到master,因此需要增加一个response通道。那么为什么不是每次transfer都有response?因为写地址和写数据没有先后依赖关系,因此,第n次transfer时,slave可能只收到data,而没收到addr,此时还无法判断response结果,所以write操作做不到每次transfer都给出response,而是每次burst有一次response。

能否提前结束突发传输

通信双方都不能在传输事务的所有Transfer完成前提前结束。哪怕发生错误,也需要走完传输事务的全流程。

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

No component can terminate a burst early. However, to reduce the number of data transfers in a write burst, the Manager can disable further writing by deasserting all the write strobes. In this case, the Manager must complete the remaining transfers in the burst. In a read burst, the Manager can discard read data, but it must complete all transfers in the burst.

握手间的依赖关系

双箭头表示强依赖

读Transaction

R_channel_dependency

写Transaction

W_channel_dependency

读写数据结构

在AXI数据传输过程中,主要涉及到窄位宽数据传输(Narrow Transfer)、非对齐传输(Unaligned Transfer)以及混合大小端传输(mix_endianness)等问题。

窄位宽数据传输

当本次传输中数据位宽小于通道本身的数据位宽时,称为窄位宽数据传输。

在窄位宽数据传输中,主机需要告知从机数据通道中哪些字节是有效的,需要使用到写数据通道上的WSTRB信号。WSTRB信号中的单个bit置起,表示对应位置上的字节有效。WSTRB信号比特位宽等于数据通道位宽的字节数量,比如32bit位宽的数据通道对应WSTRB信号位宽为4bit。

narrow_transfer

非对齐传输

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

注意:此处对齐与否应当取决于突发传输的宽度,而不是总线位宽。

对于非对齐传输,主机会进行两项操作:

  • 即使起始地址非对齐,也保证所有传输地址是对齐的;
  • 在首个transfer中添加填充数据,将首次传输填充至对齐,填充数据使用WSTRB信号标记为无效。unaligned_transfer

上图是在64位宽的数据总线上传输突发传输位宽为32bit的数据,起始地址为0x07,其中阴影部分是不传输的数据(WSTRB=0)

混合大小端传输

内存中有两种大小端模式,大端认为高字节(MSB)应该存在低地址,小端认为低字节(LSB)才应该存在低地址。

为使大小端模式在存储中共存,AXI协议设计了一种字节顺序恒定的(Byte-invariant)的大小端传输方案:

  • 无论大小端模式,每个数据结构存储空间的分配方式是相同的;
  • 大小端仅决定低地址是高字节还是低字节,与数据无关;
  • 在传输过程中不考虑数据的大小端,按字节原先存储的顺序,原样传输并存放至对面

这样做的意义在于传输双方均不对数据结构的大小端进行解析,而严格按照字节的存储顺序进行传输并转存。

读写回复结构

读写传输事务(Transaction)都存在2bit位宽的回复信号RRESP/BRESP,分别存在4种回复情况,分别为:

  1. OKAY,常规访问成功;
  2. EXOKAY,独占访问成功;
  3. SLVERR,从机错误,尽管从机收到了访问请求,但因种种原因向主机返回了一个错误状态,可能包括以下错误场景:FIFO或缓冲区溢出;主机发起了不支持的传输位宽;尝试向读保护的地址写入数据;超时;
  4. DECERR,解码错误,一般由interconnect组件产生,表示主机发送的传输事务地址无效,无法将传输事务发送给某个从机。

协议转换的使用中忽视回复信号,默认都是OKAY。

AxCACHE信号,缓存相关

含义可参考深入AXI4总线

AxCACHE

Modifiable

  • 单个传输事务可以被分解为多个传输事务
  • 同理,多个传输事务也可被聚合为一个
  • 读传输事务中,可以预取相邻地址上的读数据,要求目的地址返回比主机需求更多的数据
  • 写传输事务中,可以访问比需求地址跨度更大的区域,其中使用 WSTRB 信号防止更新不相关的数据

cache-allocate

allocate

当前地址的数据可能因为前期的访问,已经分派空间并缓存于 cache 中

other allocate

当前地址的数据可缓存于 cache 中,是因为其他主机事务而分派空间缓存,或者是本机其他类型的事务而缓存。(对于读事务来说,就是先前的写事务,反之亦然)

  • 当AxCACHE的高两bit为2‘b00时,表示CPU指示该传输事务无需至CACHE中查找,必须直接从主存储中读取或写入主存储;
  • 当AxCACHE的高两bit为2’b11时,表示该传输事务必须首先在CACHE中查找,缺失的情况下再访问主存储。

Bufferable

表示该传输事务在传输至目的地的途中,可以被 interconnect 或者任意的 AXI 组件缓存,延迟若干个周期。一般应用于写传输事务。

注:Write-through访问与Write-back访问的区别,Write-through指缓存的写入策略为直写,即数据写入缓存的同时,也写入主存储器中Write-back指缓存的写入策略为写回,数据仅写入缓存,修改的缓存仅在被替换时写入主存储

超前传输

outstanding_axi

超前传输是指主机在当前传输事务完成前,就可以开始下一个传输事务。因此系统中可能存在多个进行中的传输事务。AXI从机可选地支持超前传输,假设从机不支持超前传输,只需要在接收到第一次Burst请求后置低AxREADY信号就可以阻止主机超前传输

从应用角度来思考这个问题,如传输一段数据,假设没有outstanding,必须要等到地址握手成功了才可以传输数据,而每一次握手过程中都不能保证主从机此刻都准备好,那这样在数据传输过程中就难免会有气泡,难以实现真正的全流水和高性能;所以从设计的角度,我们就有多发几个地址的需求,比如我们可以发出去10个地址,尽管我们还没给数据,但是可以让从机知道,我们接下来要向这些地址写数据,这样就可以不用刻板地遵循,每次都要写地址握手成功再写数据。

所以,outstanding就是发出去的地址数量,未处理的地址可以先存放在AXI总线的缓存里,等完成一次传输事物之后,无需再握手传输地址,即可立即进行下一次的数据传输,所以outstanding本质上是为了实现数据传输的pipeline。

使用超前传输深度(outstanding depth)这一指标,衡量一个主机超前传输的能力,表示主机正在进行中的事务数量。更大的超前传输深度需要更大的缓冲区用于保存在途事务的信息,并接受缓存读数据。通过较大的超前传输深度能够提高系统的性能。

在超前传输**且支持交织功能的情况中,事务到达顺序与数据就绪顺序是可能不一致的,所以超前传输需要相应的机制来标识数据所属的事务。**AXI协议在各通道设计了ID信号。

  • 主机制定并发送:AWID、ARID用于标识传输事务;
  • 从机制定并发送:RID、BID用于标识数据或者回复,代表传输事务已完成;

读事务为例,协议规定:

1、对于ARID一致的多个事务,从机必须按照接收事务的顺序返回其读取的数据

实现中可以为每个ARID维护一个缓冲区用于维护读数据的顺序;

outstanding_exp1

上图就是先读出RDATA1,再读出RDATA0,与接收事务的顺序不一致,需要数据缓冲区与事务缓冲区的地址匹配后才能进行输出。

2、具有不同ARID的事务之间可以乱序,从机只需要维护各个ARID所属事务的返回顺序。注意RID要与其对应事务的ARID保持一致。

对于支持不同ARID的从机来说,实现上为每个ARID准备了一个事务与数据缓冲区,就绪数据可以根据RID分配至匹配的处理模块。

outstanding_exp2

写事务与读事务类似:1、对于相同AWID的写事务,从机必须按照主机发出的顺序完成,包括发送的写回复(BID)信号;2、对于不同的AWID的写事务,从机完成的顺序没有限制;

tips:面试问题

ID信号对于Outstanding是必须的吗?答:非必须,当没有乱序传输功能时可以省略ID信号,slave端依序即可。

多主机场景(Interconnect)

在多主机场景下,如何将多主机的事务独立开是个大问题,有两种办法:

  • 各主机保证自己的ID与其他主机不同;
  • 中间节点对不同主机的ID进行调整,即使主机发出的ID一致,也能使从机看到的ID不同;

第一种方法看起来容易,一旦ID不同事务自然独立,但协议并没有在主机间设立消息共享机制,因此各主机无法知道其他主机所使用的ID,也就无法保证ID不同。

第二种方法是AXI协议采用的方法,中间的节点指AXI Interconnect组件或者AXI Smartconnect组件。对于Interconnect组件而言:

  • 任何主机事务前往任何从机必定经过Interconnect;
  • Interconnect可以从事务的来源端口,判断事务来自哪台主机;
  • 当接收到从机返回的数据后,Interconnect根据其附加在其RID/BID上的主机端口信息,转发至发起事务的主机;

Interconnect的另一个功能是仲裁决定当前从哪个非空的缓冲区读取事务,输入交换结构。Interconnect的仲裁共有两种策略:1、轮询:轮流从各个主机的缓存通道读取事务;2、优先级仲裁:优先读取高优先级缓存通道中的事务。

此外,Interconnect还负责数据的重排序功能,由Interconnect负责保证数据返回主机的顺序,与主机发出事务的顺序一致,这要求Interconnect具有同从机类似的缓存功能以实现重排序。


Interconnect功能小总结

  • 转发:ID
  • 仲裁:轮询、优先级
  • 重排序:事务、数据缓冲区

参考文献

AMBA Learning Hub

AMBA AXI Spec

跨4K问题

AXI中模棱两可的概念