深入理解AXI协议中的outstanding/out-of-order/interleaving(一)

乐活   2024-10-22 11:17   北京  

——————————————————————————————

版权声明:

本文作者:烓围玮未。主要从事ISP/MIPI/SOC/车规芯片设计/SOC架构设计

首发于知乎专栏:芯片设计进阶之路

微信公众号:芯片设计进阶之路(x_chip)

转发必须授权,同时保留这段声明,盗版必究!

——————————————————————————————

  1. AXI的事务ID

AXI的事务ID包含了:

  • AWID

  • WID (只有AXI3有,AXI4没有,因此不支持写交织)

  • BID

  • ARID

  • RID

AXI的每个Channel都有ID信号,用于区分transaction的身份。围绕ID引申出transaction之间的顺序问题。

  • Read transaction中,返回的读数据的RID需与相应读地址的ARID一致。

  • Write transaction中,写数据的WID及写响应的BID需与相应写地址的AWID一致。

  • Read transaction的ARID/RID与Write transaction的AWID/WID/BID即使相同也不具有相关关系。

注意:ID是transaction level的概念。也就是说每个transaction内的ID都是一致的。

  1. outstanding

  1. 定义

outstanding是指主机在没有收到response时可以发起多个读写transaction的能力。

  1. 优缺点

这里分为两种情况:

1). outstanding=1;

如果master的outstanding=1,说明master没有outstanding能力,那么master必须完成每一笔传输后才能发送下一笔传输:

暂时无法在飞书文档外展示此内容

可以看到master必须等待response收到才能发下一个request,这样在当前respone回来之前,master必须等待;

2). outstanding>1;

如果master的outstanding>1, 例如master的outstanding=3,同时slave能够支持outstanding>=3;那么上面的传输会变成下图所示:

暂时无法在飞书文档外展示此内容

可以看到,master可以连续发生3个request而不用等待slave返回前2个response;slave返回3个request的时间也减少了。

优点

这里有三个层面的收益:

  1. Master层面:Master可以一次性发完多个命令,节省命令间的等待时间;如果一个任务总共的命令小于outstanding能力,那么Master可以迅速的处理完当前任务的命令,转到下一个任务;

  2. Slave层面:Slave可以一次性准备多笔数据,而不是多次发单笔数据。如果slave是类似于DDR这种需要去存储介质中取数据的类型,那么可以减少去介质取数据的次数,提高效率,减少功耗;

  3. 总线层面:一个系统中总线是共享给多个master和slave的,支持outstanding>1能力,可以减少对总线的占用,提高系统的效率;

缺点

当然为了支持outstanding也是需要额外的系统资源:

  1. Master要能支持outstanding的发送命令和接受返回的响应;

  2. Slave要能支持接受outstanding的命令;

  3. 总线能支持通路的outstanding;

复杂的soc芯片一般都会有多个master和slave,一般都会支持outstanding来提高系统效率;

由于outstanding的支持和reorder非常相关,后面再介绍如何支持outstanding;

注意:outstanding的粒度是传输(transaction)级别的,也就是burst级别的;不会涉及到burst内部的beat传输;

  1. Out of order

  1. 乱序和保序

根据AXI 协议,transaction之间的保序要求如下:

  1. 无需保序的情况

  • 不同master发出的transaction之间没有保序要求。

  • 不同ID的transaction之间没有保序要求。

  • AWID与ARID相同的transaction之间没有保序要求。

  1. 必须保序的情况

同一ID的transcation必须保序,细分为以下三种情况:

  • 同一ARID的read transfer间需与address发出的顺序一致。

  • 同一AWID的write transfer间需与address发出的顺序一致。

  • 同一master发出的同一ID的transaction可能访问不同的slave,返回的RDATA或BRESP需与address发出的顺序一致。(ddr interleave 必须保序)

  1. 从interconnect的角度看ID

  • 为ARID/AWID/WID额外增加master标识位,表示ID的master归属,master端无需了解其他master的ID。因此slave端收到的实际ARID/AWID/WID的位宽比master端发出的更大。

  • 为RID/BID额外增加master标识位,表示RDATA或BRESP的去向。

  • 同一master发出的同一ID的transaction可能访问不同的slave(根据地址范围判断,因此每笔transaction的地址范围不能超过单个slave所占有的地址范围),返回时interconnect需保证顺序与发出的addr一致。

  1. 乱序传输(out of order)

当多个事务同时在总线上进行时,可能会有事务提前准备完毕,因此可以先行发送。这就引出了一个问题:如何识别并正确地将返回的数据归属到初始的事务?AXI总线通过使用事务ID来解决这一问题。

Out-of-order传输是一种允许响应不按照原始请求顺序返回的机制。这种机制适用于多个从设备(slave),其中较慢的事务可以先返回,而较快的事务可以稍后返回。如果一个master要求数据必须严格按照它们访问的顺序返回,那么它必须为这些事务使用相同的ID。相反,如果master不要求严格按照顺序返回数据,那么可以通过为每个事务分配不同的ID来实现Out-of-order传输。简而言之,是否保持顺序是由master通过访问ID来控制的:相同ID的事务必须按顺序处理,而不同ID的事务则可以乱序处理。

在不需要保持顺序的情况下,如果从设备支持,可以实现Out-of-order传输:

  • 不同master发起的事务之间没有顺序要求。

  • 拥有不同ID的事务之间没有顺序要求。

  • AWID(写地址ID)与ARID(读地址ID)相同的事务之间也没有顺序要求。

  1. 读乱序

在AXI总线协议中,"读乱序"(Out-of-Order Read)是指读数据的返回可以不按照读请求的原始顺序。这样,可以提高总线效率,因为不同的读事务可以根据各自的完成时间返回数据,而不是等待所有事务按顺序完成。返回的数据通过事务ID(ARID)与原始请求关联,确保数据正确归属。

由上图的例子可见(略去握手信号),当slave连续收到ARID分别为ID0和ID1的读请求,由于某些原因,对ID1的响应速度比对ID0更快,slave可以先返回RID为ID1的读数据,再返回RID为ID0的读数据。读乱序机制可以提高总线的性能。如果严格保序,RID为ID1的读数据需等到ID0的读数据都返回之后才可返回,明显造成了性能的浪费。

其中读乱序的深度由master中read data reordering fifo depth决定,当read data reordering fifo depth = 1时代表不允许读乱序。

  1. 写乱序

在AXI总线协议中,“写乱序”(Out-of-Order Write)是指写事务完成的顺序可以与它们被发起的顺序不同。这样,总线可以根据各个写操作的完成时间灵活地处理它们,从而提高性能。主设备通过事务ID来追踪和匹配每个写操作的响应,确保数据的正确处理,即使它们的完成是乱序的。

注意:

  1. Out of order的粒度是传输(transaction)级别的;

  2. 乱序机制主要针对的是slave端,而与master的行为无关,但是仍然需要master端支持;

  3. Out of order可以是对一个slave也可以是对多个slave;

  1. interleaving

数据交织(interleaving)是指slave接口能够接收来自不同ID的交错数据。

那么怎么区分这些数据呢?仍然是WID和RID。绝大多数master和slave都是不支持写交织,但是读交织是必须支持的。

注意:与前outstanding和out of order的transaction粒度不同,interleaving的粒度是transfer级别的

  1. 读交织

简单来说,读交织是out of order乱序的更小粒度的实现形式,但是out of order是transaction级别的乱序,读交织进一步允许transfer粒度的乱序。是否支持读交织只与slave的设计有关。

如图所示,slave在返回了一个RID为ID2的读数据后,中间间插返回了ID0与ID1的读数据,最后才返回一个的ID2的读数据。但同一RID的读数据之间需要保序。由此可见,在读交织机制下,同一个transaction中间插了来自其他transaction的transfer,所以乱序的粒度是transfer级的。

  1. 写交织

类似于读交织,每个transaction的写数据也会有一个WID,不同WID的写数据transfer可以间插发送。但同一WID的写数据之间需要保序。此时,乱序的粒度也精确到了transfer级。值得注意的是,相比于读交织,写交织还有两点额外的要求:

  • 虽然允许不同WID的写交织,但是每笔transaction的第一个transfer需与写数据发送的顺序严格一致。

  • 为了避免死锁dead lock,支持写交织的slave必须一直支持写交织,不能某些时候支持,而某些时候不支持。

AXI4协议去掉了WID信号,因此不再支持write interleaving。这是AXI4和AXI3的很重要和很大的一个改变。

Write interleaving的去除使得在WID信号上传递的信息是多余的。所有写入数据必须与相关的写入地址顺序相同,任何需要WID信息都可以从写入地址通道信号AWID中获得这些信息。

为什么AXI4不支持写交织呢?

比如,如果在AWID=0的数据还未发送完后,允许AWID=1的数据先发送;这样带来的代价是发送端必须要缓存多个ID的wdata,不管是maser还是总线interconnection都必须要增加大量的缓存,所以增加了面积;

另外,Write interleaving增加了系统总线设计的复杂度,而且很容易造成死锁,所以虽然AXI3支持Write interleaving,但是大家在设计的时候,master基本都没支持Write interleaving。

所以AXI4就把Write interleaving的支持去掉了。可以不关注AXI的写交织,这个功能基本上大家都不会用。

AXI3和AXI4区别参考文章:https://zhuanlan.zhihu.com/p/193006656

后记

技术很重要,技术背后的思想更重要!

技术背后的某些思想就是你解决以后问题的钥匙。我的文章可能一篇中知识点不太多,但是力求让你能深入理解,为你进阶打下基础。如果有一点点收获,也算是我对中国芯片行业的一点点小贡献吧。

赠人玫瑰,手有余香。如果你有所收获,麻烦花一秒时间帮我点个赞吧,谢谢!

知乎专栏:芯片设计进阶之路

微信公众号:芯片设计进阶之路 x_chip

——————————————————————————————


芯时代青年
专心数字前端全流程,芯时代有为青年的自我修养
 最新文章