前言
最近把AXI的out-of-order忘记了,惭愧惭愧。记一下笔记。参考知乎一篇文章:soc设计提升-AXI outstanding,out of order与interleaving
outstanding
outstanding其实就是先发地址,不用等上一笔的数据传输完成,先把地址发送到slave。
如何提高性能呢?
如果没有outstanding,那么master与slave之间肯定有握手信号,握手完毕后才会发送下一笔地址。这样会存在cylce上的浪费。
但如果支持outstanding的话,那么slave可以在上一笔结束前的最后一个周期就可以去拿地址。这样再下一个周期就可以发送数据到master。
outstanding能力不是越强越好。因为地址是缓存在SRAM中的;要根据上游的需求进行涉及。
Out of order
相当于不同笔burst之间进行乱序。是在transation级进行乱序;最小单位是一个burst len长度的数据。
主要应用:比如DDR中,在DDRC中A11的地址比A21的地址优先级低。那么DDRC会先处理A21,然后处理A11。返回到NOC上的数据就会先返回A21,然后是A11。
Interleaving
是不同burst 之间的拍级交互。
为啥会需要这样的现象呢?
还是拿DDR举例。在SOC中不同master的burst len不一样。有的burst len长,比如是是两个BL长度;可能一笔BL读完后。下一笔BL可能还是没有打开的行。那么下一笔BL可能优先级会降低。让其他读命令去读数据。那么从DDRC返回到AXI端口上的数据就会是先第一笔burst len的第一个BL,然后是其他读命令的读数据,然后是第一笔burst len的第二个BL。这样就是interleaving。
例子说明
1.举个例子说明outstanding
DDR控制器如果不支持outstanding的。那么master只能等这笔数据传输完成后,才能进行传输下一笔。如果只有一个AXI port的话,DDRC一次只能执行当前的命令。没有办法做命令调度。但如果一下子存了好几个地址。在执行第一笔操作的时候,DDRC就可以规划存入的这几个地址对应命令进行重新规划。这样有利于提高带宽效率。
2.举个例子说明out-of-order 和interleaving
:DDR DQ位宽32;BL=8;那么一个BL传输的数据是32*8 bit;
这里三笔burst 的数据位宽是128,burst len 分别是A= 8,B= 2,C=4;
进入到DDRMC中后,A会分成4个读命令,B是一个读命令,C是两个读命令。
在DDRC中经过命令调度,往DRAM中发送命令的顺序可能是:
A1 ; A2;B1;B2 ; C1;C2;C3;C4;A3;A4;A5;A6;A7;A8。
这样的原因可能是因为A3-A8在一个打开bank的没有激活的行;那么需要将该bank的激活行关闭,然后再进行打开。所以DDRC可能会降低A3-A8的优先级,先处理B和C。
这样如果master支持interleaving,那么AXI端口就按照上面的顺序返回。这样带宽利用率最高,没有浪费。
如果不支持interleaving的话。那么DDR MC中的AXI模块会将A1;A2缓存到一个虚拟通道中,等A3-A8存到虚拟通道后,就可以发A了。
如果有空闲的虚拟通道,让B和C存放。而且支持out-of-order;那么发送到AXI的顺序就是B;C;A。
这样的话只会浪费发送A1;A2的时间。
如果不支持out-of-order的话;就只能等到A3-A8存到虚拟通道后,按照A;B;C顺序发送。
这样的话就会浪费A1-A8整个的时间。这样会浪费居多时间。
这个例子可以说明out-of-order和interleaving的重要性。