这篇blog把outstanding/out-of-order 说的很清晰
深入理解AXI协议中的outstanding/out-of-order/interleaving(二)
——————————————————————————————
版权声明:
本文作者:烓围玮未。主要从事ISP/MIPI/SOC/车规芯片设计/SOC架构设计
首发于知乎专栏:芯片设计进阶之路
微信公众号:芯片设计进阶之路(x_chip)
转发必须授权,同时保留这段声明,盗版必究!
——————————————————————————————
为了详细了解,outstanding,out-of-order,interleaving对传输的影响,下面用枚举法,把各种情况进行分析。
- 一个master访问一个salve
规则:同一个ID:可以发送多个outstanding(OST),但是必须按照顺序回来;不同ID: 可以发送多个OST,不同ID的transaction可以乱序返回;如果不支持outstanding,那么必须等到response返回才能发下一笔命令。
如果支持outstanding,那么master可以不必等到response返回,连续发送命令。
2.一个master访问两个salve
一个master访问多个slave,必须有中间的BUS/NOC/仲裁器来进行仲裁,SOC中一般使用NOC, 通过不同地址区分访问的是slave0还是slave1。这里slave0和slave1的地址不能重叠,否则会导致系统出错。
2.1 Master写
规则:
同一个ID:可以发送多个OST,但是必须按照顺序回来;
不同ID:可以发送多个OST, 返回可以乱序;
读和写是独立通道,没有关系;
2.1.1 Master不支持outstanding
如果master不支持outstanding,那么master必须等待response回来后才能继续发下一个transaction,如下图所示:
发给slave0和slave1的transaction通过绿色和蓝色来区分;
由于命令和响应通道(ADDR 和RESP)占的带宽和时间都非常小,总线主要关心数据通路的效率,目标是让数据通道效率能到达最大。如上图可以看到,在master不支持outstanding情况下,DATA通路会产生很多空的“气泡”,使得总线的效率降低。
2.1.2 Master支持outstanding
如果master支持outstanding,这里假设OST=4, 那么master可以在第一个response返回前,连续发送4个命令(ADDR), 如下图所示:
master发给slave0和slave1总共的OST=4,所以必须在master发了ADDR2到slave0后,必须等待BRESP0返回后,才能继续发送下一个地址(ADDR1),如图中红色所示;
由于master能支持OST,可以看到数据通路的“气泡”消失了,总线利用率大大提高,而且对每个命令来说,从发送到收到BRESP的总时间也减少了。所以至少有以下三个优点:
提高了总线利用率;
减少了单个命令的延时;(前提是master能及时发送命令)
减少了对系统总线的占用时间;
2.1.3 Master不支持out-of-order
如果master不支持outstanding,那么必须等待当前命令的response返回,才能发送下一个命令,所以不存在多个response的out-of-order返回的情况。
所以支持out-of-order的前提是支持outstanding。如果master不支持out-of-order,假设一种情况如下所示:
这里虽然发给slave1的ADDR0(蓝色)命令比master发给slave0的ADDR1(绿色)命令晚,但是由于slave1相应比较快,所以蓝色的BRESP0比绿色的BRESP1早返回。如图中两个箭头所示。
由于master不支持接受response的out-of-order返回,master只能按照发送命令的顺序来处理
所以slave1的BRESP0返回后,master其实在等待slave0的BRESP1,在没有处理完slave0的BRESP1前,master是无法处理slave1的BRESP0,所以只能丢掉slave1的BRESP0,或者根据设计不同,可能会卡死master。
所以,如果master支持写outstanding,但是不支持写response的out-of-order返回,其实是有问题的,要么数据丢失,要么master卡死。其实对照AXI协议我们知道,写response通道的位宽比较小,只有2~3bit的数据,支持写response的out-of-order的代价其实非常小。
所以,如果AXI master支持写outstanding,那么必须支持写response的out-of-order。如果你碰到的master不支持写response的out-of-order,那这就是一个很差的设计,你有足够的理由要求设计人员重新修改设计。
顺便提一句,有很多设计人员,甚至是十几年二十年工作经验的设计人员,在设计AXI的master的时候,往往忽略写response的处理,也就是只要发送了命令和数据,不等写response返回就认为这笔传输已经完成了。这是一个非常严重的设计bug,会导致整个系统不能确实写数据是不是真的写到了最后的目的地,比如DDR。对软件使用造成了很多困扰,这里重点提醒一下。写response的处理是一个代价非常小的逻辑,在设计的时候,请务必考虑到。
2.1.4 Master支持out-of-order
Master支持outstanding和out-of-order情况下,上面的传输变成如下图所示:
正常传输没有任何影响,只是master需要增加一个BRESP的缓存,把乱序返回的BRESP暂存。
注意:由于AXI4去掉了写交织,而且写交织基本没有设计会使用,所以这里不讨论写交织的支持情况。
2.2 Master读
2.2.1 Master不支持outstanding
如果master不支持outstanding,那么master必须等待rdata和response回来后才能继续发下一个transaction,如下图所示:
2.2.2 Master支持outstanding
如果master支持outstanding,这里假设OST=4, 那么master可以在第一个response返回前,连续发送4个命令(ADDR), 如下图所示:
由于第一个transaction的数据在D03处已经完成,这时就可以直接发下一个命令ADDR1(蓝色)了。
2.2.3 Master不支持out-of-order
如果master不支持outstanding,那么必须等待当前命令的rdata和response返回,才能发送下一个命令,所以不存在多个response的out-of-order返回的情况。
所以支持out-of-order的前提是支持outstanding。如果master读不支持out-of-order,假设一种情况如下所示:
由于master不支持out-of-order,所以必须先处理slave0的D10~D13, master无法处理先从slave1返回的D00~D03数据,master要么丢掉这些数据,要么master被卡死。
所以master AXI read如果支持outstanding,一般都需要支持读数据返回out-of-order;如果实在碰到master只支持读outstanding而不支持读out-of-order,那就需要系统总线或者额外设计,把送回给master的数据进行排序,实现复杂性比较大,实际中确实也会碰到这种情况。对这种有问题的IP最好的方式还是修改IP。
2.2.4 Master支持out-of-order
Master支持outstanding和out-of-order情况下,上面的传输变成如下图所示:
对传输和带宽都没有影响,代价是需要master对返回的数据进行重排序或者重新分发。由于这里有可能需要对rdata进行重排,所以会增加master的开销。但是相对于系统性能,这个代价是值得的。
2.2.5 Master不支持interleaving
interleaving是一个burst内的概念,AXI的rdata可以选择支持rdata的interleaving,进一步提高性能。如果不支持interleaving,那么一个burst的数据必须按照第一个到最后一个为一个整体来返回,如下所示:
一个burst之内的数据,必须按照0,1,2,3这样的顺序返回。interleaving主要看slave的返回顺序,是否支持主要是slave的能力,但是也需要master支持。
2.2.6 Master支持interleaving
如果在进行AXI Read的时候支持interleaving,那么slave可以把一个burst打乱,只要其他burst的一笔数据ready了就可以返回,如下:
可以看到,burst间插入了其他burst的数据,这样transfer粒度的数据就被利用起来了,进一步提高了总线利用率。
但是需要slave和master都要能支持,会增加slave和master的复杂性,而且会拉长传输对系统总线的占用时间。所以个人认为AXI read支持interleaving的优势并不明显,更好的方式是slave能缓存一个burst的数据,一旦开始响应master的读,就连续的返回一个burst的数据。这样既能提高总线利用率,又能减少对系统总线的占用时间。实际中是否支持AXI read interleaving主要和IP设计相关。
到这里,我们并没有分析中间的BUS,其实实际中,连接master和slave的bus才是关键,下一篇文章会通过分析两个master访问两个slave的情况来进行详细分析。