AXI协议中Outstanding|Out of order|Interleave的区别和联系
1.前言
只要提到AXI总线协议,这就是一个绕不过去的话题,虽然这个话题有点老生常谈,但确实非常重要,其实很多面试官特别喜欢问这个知识点。
2. AXI总线上正常的Burst传输
AXI总线的Transaction是Burst-based的,下图是一个正常的Burst传输示意图。
正常情况下的主机Master和从机Slave的操作是:
读操作:主机发送读地址,从机返回数据,然后依次进行下去
写操作:主机发送写地址和写数据,从机返回响应信号,依次进行。
3. Outstanding(超前传输)
3.1 Outstanding概述
AMBA的AXI总线中,控制和数据的传输通道是分离的,这就使得数据的传输相较于AHB总线变得灵活多变,地址的请求可以不等上一次的数据回来就可以继续发送,这使得AXI总线的传输效率大大提升,这样的数据传输就是Outstanding操作。
具体一点来说,当Master访问Slave时,可以不等待上一笔操作完成,就发下一个操作,这样Slave在控制流的处理上就可以流水起来,提高了传输速度,这就叫Outstanding。
3.2 Outstanding的含义
从字面理解,Outstanding表示正在进行中的,未完成的意思,形象地说就是“在路上”或者叫“超前传输”。
Outstanding的意思是master不用等上一次传输完成就开始发送新的传输地址的能力,因此系统可以实现并行传输从而使得系统性能得以提升。从这个意义上来说,Outstanding表示AXI超前传输的特性。即使这笔transaction还没完成,也可以先提起别的事务。即在W/R channel数据还没发完或者还没发的情况下,AR/AW channel可以提起多个事务。
3.3 如果slave不支持Outstanding,应该如何响应
超前传输需要master和slave都支持超前传输,其中Outstanding depth表示了主机超前传输的性能,表示同一时刻最多支持多少个AXI事务在途。AXI从机可选地支持超前传输,假设从机不支持超前传输,只需要在接收到Trans0后,置低AxREADY信号,以阻止主机超前传输。在返回读数据后,再置高 AxREADY 信号,接收下一事务。
3.4 Outstanding功能是如何实现的
在不考虑其他两个特性(乱序和交织)的情况下,AXI事务都是顺序完成的,这时多事务在途不需要其他信号来实现,直接根据write channel或者read channel的LAST信号或者response channel的信号来判断分割事务就可以了。可以认为是一种队列或FIFO结构,AR/AW channel发起事务就是顺序压入队列或FIFO,当这些对应的事务完成时,最先提起的事务就先弹出队列,表示结束,然后接收完成后面的事务。
如下图所示, A11地址发出后,没有等D11~D14传输完成,便发出了A21地址请求,这种操作就叫Outstanding,如果只能等当前数据传输完成才能发送下一笔传输地址,则Outstanding能力为1。
AXI4的总线规范中提到的AXI4的特性之一,就是支持处理多Outstanding地址(Support for issuing multiple outstanding addresses)。
3.4.1 当Outstanding能力为1时
如果Outstanding能力为1(即没有Outstanding)的话,总线Master的行为如下(AHB总线就没有Outstanding能力):
1)读操作:读地址命令 -> 等待读数据返回 -> 读地址命令 -> 等待读数据返回 ->循环往复。。。
2)写操作:写地址命令->写数据->等待写响应返回->写地址命令->写数据->等待写响应返回->循环往复。。。。。(如果支持Out-of-Order,对于AXI3,写命令和写数据不一定有先后顺序且ID顺序不一定相同,AXI4因为已经没有WID信号,所以写数据的顺序要和写地址的顺序一样)
3.4.2 当Outstanding能力大于1时
如果Outstanding能力为N>1的话,则:
读操作:可以连续发N个读地址命令,这期间如果读数据没有返回,则需要等待读数据返回,如果有读数据返回,则返回了几个,那么仍然可以接着发几个读操作。也就是说,“在路上” 的读命令(或者读数据)最多可以是N。多说一点,可以看出,如果数据返回得比较慢,那么IP需要等待,效率就会比较低,因此,为了提高效率,有必要提高Outstanding能力,以弥补”路上“(总线)引入的延时。但是也不能无限制地发,否则有可能会引起总线拥塞,把其他IP给堵住。下图为一个Outstanding读的时序图例子。
2)写操作:可以连续发出N组写地址(写数据)命令,这期间如果写响应没有返回,则必须等待写响应返回才能接着发写地址(写数据)命令,如果有写响应返回,则返回了几个,那么仍然可以接着发几组写地址(写数据)命令。也就是说,“在路上” 的写响应最多可以是N。
- Out of order(乱序)
4.1 Out of Order概述
当Master访问Slave时,可以不等待上一笔操作完成,就发下一个操作,这样Slave在控制流的处理上就可以流水起来,提高了传输速度,这叫outstanding。同时,Master也许需要访问不同的Slave地址,由于Slave针对不同地址的响应时间可能不同,其返回给Master的数据或响应也有先后,可能并不是按照Master发出控制的先后顺序返回的,这种现象就是乱序(Out of order)操作。
如上所述,当有多个事务在途的时候,有的事务可能先准备好,因此可以先发送在总线上。那就需要面对一个问题,如何判断返回的是哪个事务的数据?这就与AXI的事务ID有关。AXI的事务ID包含了:AWID/WID/BID/ARID/RID,其中关于WID,只有AXI3有,AXI4没有,因此AXI4不支持写交织。
4.2 Out of Order的含义
out of order:当主机发送一组读地址,从机返回的数据并不是和读地址一一顺序对应的,有可能后发的地址对应的数据先返回。Out of order的应用场景之一是传向快的存储区域的传输数据不需要等待之前传向慢的存储区域的传输完成,就提前完成传输的操作。由于减少了传输的latency,系统的传输性能也得以提升。如果下图所示,地址的顺序为A11、A12、A13,而数据顺序则是D2、D3、D1~,这个操作就是out of order。
4.2.1 到达乱序
如上图所示,对于写传输,同一Master发出的写地址可以和写数据乱序,如Master1按顺序发出两个写命令CMD1、CMD2和CMD3分别访问Slave1、Slave2和Slave3,此时可以先向Slave2发送写数据,然后向Slave3发送写数据,最后再向Slave1发送写数据。这叫到达乱序
对于读传输,同一Slave接收到的读地址可以和返回的读数据乱序,情况和上面的写传输类似。
4.2.2 响应乱序
当Slave接收到了多个事务(可能是多个Master传输来的事务),那么Slave返回BID的顺序与发送过来的AWID顺序可能是不同的,这也叫做乱序,实际上指的是写响应乱序,或者叫响应乱序。详情请参考4.4节。
4.3 Out of Order的实现模型与思路
AXI乱序的特性是由地址channel和数据channel上的ID信号AWID/ARID和WID/RID来实现的,根据ID不同来标识事务不同。但是并不代表不同事务传输的AWID/ARID就一定要不同,即不同事务传输的AWID/ARID也可以相同。
1)不同事务的AxID如果一致,那么这些事务就不能实现Out of order,只能进行顺序完成。(因此需要重排序模型,重排序模型包括了事务缓冲区和数据缓冲区,事务缓冲区存放Outstanding需要完成的事务,对于slave来说,其可能对于不同事务完成的时间不同,因此事务准备好了与事务缓冲区的首个事务比较,如果匹配就输出,如果不匹配就进入数据缓冲区)。
2)如果不同事务AxID不同,那么这些事务之间可以乱序。那么不同AxID事务的数据,对于AXI读来说,如何判断返回的数据属于哪个事务呢,是通过RID来进行匹配的,也就是说,在完成乱序传输的时候,需要RID和ARID保持一致,以标识不同事务的数据。
3)那么对于实际情况来说,在实际传输中,可能有的事务的AxID是不同的,有的事务的AxID是相同的,这是如何解决的?答:对于ID相同的就顺序完成,对于ID不同的可以乱序。
4)在实际应用中,在slave的实现中,为每个ARID准备了一个事务缓冲区和数据缓冲区,以支持相同ID和不同ID的数据顺序传输和乱序传输。
4.4 另一种写乱序(写响应乱序)
另外还有一个重要的观点,写乱序不是针对Master来说的,而是针对Slave来说的,Slave接收到了多个事务(可能是多个Master传输来的事务),那么Slave返回BID的顺序与发送过来的AWID顺序可能是不同的,这才叫做写乱序,如下图所示,Slave对于写事务的完成(响应)可以是乱序的,称之为写乱序,实际上指的是写响应乱序,或者叫响应乱序。
对应这种写事务乱序,读事务的乱序也是类似的,通过返回BID的顺序和AWID发送的顺序不同来表示读乱序。
- Interleaving(交织,AXI3有/AXI4无)
5.1什么是交织?
interleaving表示不同事务的数据可以被打散混合排列(但是注意,这里说的混合排列是不同事务间的,同一个数据是不循序被打乱的)。例如事务1数据是0a 0b,事务2数据是1a 1b,如果不支持交织,那么总线上数据的传输需要是0a0b1a1b或者1a1b0a0b,如果支持交织的话那么就可以是0a1a0b1b(或者别的插入顺序)。
写数据交织(interleaving)是指slave接口能够接收来自不同AWID的交错数据。slave接口声明写数据交织的深度,该深度指示slave接口是否可以接受来自具有不同AWID的源的交错数据写入。注意下图中,D11和D12之间插入D23。即data可以交错。
5.2 交织的实现
对于读交织来说,读数据的方向和读事务的response方向是相同的,不同事务交织是通过RID来进行识别的,也就是说RID在AXI传输中即起到了out of order乱序的不同事务识别,也起到了interleaving交织中不同事务数据的识别。
对于写交织来说,由于写数据的方向和写response的方向是相反的,WID提供了写交织的不同事务的识别,BID提供了乱序不同事务的识别。使用与 AWID 匹配的 BID 标识写回复所属的事务 ID。实际上从机给出写回复可以类比读事务中给出读数据的过程。
- Outstanding|Out of Orde|Interleave之间的区别与联系
outsatanding是对地址而言,一次burst还没结束,就可以发送下一项的地址。而out-of-order和interleaving则是相对于 transaction而言,out-of-order说的是发送的transaction和发送或接收的cmd之间的顺序没有关系,例如先发送或先接收A的cmd,再发送或再接收B的cmd,则可以先发B的data,再发A的data;interleaving指的是A的data和B的data可以交错,如A1 B1 A2 B2 B3……(同一个事务内的不同数据要按顺序,例如不能出现A1 B2 A2 B1...,即Transaction B内的数据不能颠倒顺序,B2不能在B1之前发送)。
先看Master写操作。如果分别发出WCMD1和WCMD2两个写命令给两个不同的slave,假设这两个写命令都是四拍的数据分别记为WDATA1_0,WDATA1_1,WDATA1_2,WDATA1_3,以及WDATA2_0,WDATA2_1,WDATA2_2,WDATA2_3。如果master在自己的写数据总线上,依次发出WDATA2_0,WDATA2_1,WDATA2_2,WDATA2_3,WDATA1_0,WDATA1_1,WDATA1_2,WDATA1_3,这就叫写out of order;如果Master在自己的写数据总线上,依次发出WDATA2_0,WDATA1_0,WDATA2_1,WDATA1_1,WDATA2_2,WDATA2_3,WDATA1_2,WDATA1_3,这就叫写out of order且interleave;注意,不论是out of order还是interleave,同一个命令对应的四拍数据在Transaction内部必须是顺序的,不能乱序。比如,不允许出现WDATA2_1,WDATA1_0,WDATA2_0,WDATA1_1,WDATA2_2,WDATA2_3,WDATA1_2,WDATA1_3这样的。
显然,你自己设计master时,如果是写操作,你不会主动发出out of order和interleave的操作,因为这个明显增加了复杂度且没带来master自己的效率提高。
再看Master读操作,同样发出RCMD1和RCMD2两个读命令给不同的Slave,由于不同Slave的响应速度不同,就可能出现RCMD2对应的读数据先返回到master的情况;再考虑到复杂系统的总线设计,Master依次接收到RDATA2_0,RDATA1_0,RDATA1_1,RDATA1_2,RDATA2_1,RDATA2_2,RDATA1_3,RDATA2_3这样的数据是有可能的,这就是读的out of order且interleave。
所以,对于Master,不建议发出out of order与interleave的写数据,但是必须支持out of order与interleave的读操作!同理,可以分析,对于slave,必须支持out of order与interleave的写操作,不建议返回out of order与interleave的读数据。在一个系统中,interleave会明显增加设计复杂度,其实可以约定Master/Slave以及连接总线都不要使用interleave,(另外可以配置depth ==1,达到不支持interleaving的目的)这样可以降低复杂度,但out of order是AXI特性,这个功能必须支持。
由此可见,乱序和交织(间插)是两个完全不同的概念。笼统的说,乱序指的是burst这个粒度,而交织(间插)指的是beat这个粒度。简单说了,乱序是Salve返回Master请求的out of order特性,但这个Slave可以是广义上的,一般总线会完成这个功能;而交织(间插)是指写数据,或是读返回数据,按照不同ID交织出现。比如:ID0 ID1 ID0 ID1....。乱序和交织(间插)都有深度,一般乱序深度比交织(间插)大的多。
参考文献--
[1] https://blog.csdn.net/tbzj_2000/article/details/88042890
[2] https://zhaishuangdong.blog.csdn.net/article/details/122386328
[3]https://blog.csdn.net/weixin_32775841/article/details/120605122
[4]https://blog.csdn.net/l471094842/article/details/92798620
[5]https://blog.csdn.net/qiuzhongyu123/article/details/121217249
[6]https://blog.csdn.net/qiuzhongyu123/article/details/118943373
[7]https://www.zhihu.com/column/c_1663245806869291008
[8]https://zhuanlan.zhihu.com/p/643863702
[9]https://www.cnblogs.com/pu1se/p/16635666.html
[10]https://it.cha138.com/shida/show-131359.html