ARM的NIC-400是一款通用的总线互联IP。单个NIC-400支持:
1~128个master接口(AXI3、AXI4、AHB-Lite master
、APB3、APB4等)
1~64个slave接口(AXI3、AXI4、AHB-Lite slave等)
AXI和AHB-Lite的地址位宽支持32-64 bits,数据位宽支持32、64、128和256 bits。
NIC-400的具体介绍参见:Crossbar总线互联 -- NIC-400介绍。本文主要介绍NIC-400的死锁分析和解决方法。
1. NIC-400死锁类型
NIC-400死锁分为2大类:response乱序死锁和AW-W死锁。
1. response乱序死锁
AXI事务是根据相同ID来保序的。即:相同ARID的事务必须按照请求发送的顺序来返回rdata。相同AWID的事务必须按照按照请求发送的顺序来返回响应。
因此,response乱序导致死锁需要同时满足以下条件:
- 有两个及以上的master,两个及以上的slave;slave可以乱序回响应;master可以发送多个outstanding读、或多个outstanding写;master会给不同slave发送相同AXI ID。
死锁示例如下:
有两个master和两个slave,所有的事务都是相同ID的读事务。由于NIC400会进行ID扩展来区分不同的master,因此这两个master发的请求经过NIC400后是不同ID的。访问顺序如下:
- Master 0发送一个读请求给Slave A;Master 0发送一个读请求给Slave B;Master 1发送一个读请求给Slave B;Master 1发送一个读请求给 Slave A。
死锁形成分析:
- Master 0必须先收到来自Slave A的响应;Slave A乱序回响应,先给Master 1发送响应;Master 1必须先收到来自Slave B的响应;Slave B必须先给Master 0回响应;从而形成死锁。
2. AW-W死锁
支持写数据交织(interleaving)的AXI3和不支持写数据交织的AXI4都有可能产生AW-W死锁。
产生AW-W死锁的条件为:
1)1个master和1个target之间有多条路径;
2)写outstanding大于1;
3)路径上有retiming组件,例如register slice。
下图是一个AW-W死锁示例。
访问顺序如下:
1. Master 0通过一条路径发送写请求A给Slave;
2.写请求A由于retiming组件被delay;
3.Master 0通过另一条路径发送写请求B给Slave;
4.Slave先收到写请求B,后收到写请求A;
5.根据AXI协议,Master 0必须先发送写请求A的写数据A;
6.Slave不能接收写数据A,因为它先收到的是写请求B;
7.由于写数据A没有被接收,写数据B会被阻塞,从而形成死锁。
此外,有环路也会产生AW-W死锁,如下图,图中的Slave/Master既有slave口也有Master口:
访问顺序如下:
1.Master 0发送一个写请求给Slave/Master;
2.Master 0发送一个写请求给slave A;
3.Slave/Master发送一个写请求给slave A;
4.在Slave/Master能接收来自Master 0的写数据之前,slave A必须接收写数据。
假设Master 0先把数据发送给Slave/Master,并且Slave/Master没有足够的buffer,那么会产生环路死锁:
1.Master 0必须先发送写数据给Slave/Master;
2.Slave/Master只能把写数据发给Slave A,并且不能存下来自Master 0的整个事务;
3.Slave A必须先接收来自Master 0的写数据;4.产生死锁。
在多个interconnect中也会产生AW-W死锁,如下图,有3个interconnect。
访问顺序如下:1.M0发送一个写请求到S1(请求阻塞在retiming slice中);2.M0发送一个写请求到S0,请求被接收;3.M1发送一个写请求到S0,请求被接收;4.M1发送一个写请求到S1,请求被接收;5.S1接收来自M0的写请求。
会产生以下环路死锁:
- S1必须先接收来自M1的数据;M1只能先发送数据给S0;S0必须先接收来自M0的数据;M0只能发送数据给S1;导致死锁。
2. NIC-400死锁解决方法
NIC400制定了一些规则来防止死锁。每个ASIB都可以配置不同的CDAS(Cyclic Dependency Avoidance Schemes)。对于读和写事务,采用了相同的CDAS方案,但它们是独立运行的。NIC400支持三种方法来解决死锁:Single Slave (SS)、Single Slave per ID (SSPID)、Single Active Slave (SAS)。
1. Single Slave(SS)
对于一个ASIB,所有outstanding的读事务必须是访问同一个目的地,所有outstanding的写事务必须是访问同一个目的地。
SS可以解决以上所有死锁问题,且对面积和时钟频率的影响比较小,但是对性能影响很大(当master期望outstanding访问不同的target时),需要慎重使用。
2. Single slave per ID(SSPID)
对于一个ASIB,所有相同ID的outstanding的读事务必须是访问同一个目的地,所有相同ID的outstanding的写事务必须是访问同一个目的地。
如果master想要发送同ID的访问某个target的事务,需要等之前同ID的访问其他target的事务收到响应,才能发送出去。
SSPID对面积影响较大,面积主要取决于ID位宽、outstanding大小、target数量等。
3. Single Active Slave(SAS)
如果有到其他master接口的写数据未发送完,那么到当前这个master接口的AW请求会被阻塞。可以用来避免AW-W死锁。
一般可以选择SAS+SSPID的配置,就可以解决以上死锁问题了。
除了NIC400提供的这几种死锁解决方法,用户也可以通过re-order buffer等方法来避免一些死锁依赖问题。
参考:
1. Arm CoreLink NIC-400 Network Interconnect TRM
2.https://zhuanlan.zhihu.com/p/347874698?share_code=1cXzYekHo9BMo&utm_psn=2023890831623430726
506
