(本文介绍了PCIe标准中Ordering的规则A3,A4,D3和D4,即Posted Request和Completion必须能够超越Non-Posted Request)
在阅读本文之前,麻烦参考之前一篇关于Ordering的文章:
[FPGA 实现及PCIe IP 核知识点] 写为什么不能超越写?和你想象的一样吗?
让我们先看看A3,A4,D3和D5在哪里?如下图中红色标注的方格。
注:col x代表第一笔transaction,row x代表第二笔transaction,a和b代表两种情况,可以是No,Yes,Y/N.No表示第二笔transaction必须不允许超越第一笔,Yes代表第二笔transaction必须允许超越第一笔,Y/N代表无要求。
A3代表Row A – Col 3,A4代表Row A-Col 4,D3代表Row D – Col 3,D4代表Row D-Col 4,PCIe标准中的原话是:
A Posted Request must be able to pass Non-Posted Requests to avoid deadlocks
A Completion must be able to pass Non-Posted Requests to avoid deadlocks
所以这里涉及到三个概念,分别是:
Posted Request
Non-Posted Request
Completion
Deadlocks
前面两个概念我们在Ordering的第一篇分享中介绍过了,这里不再赘述。
Completion是指Non-Posted Request从请求者发出,完成者处理后必须返回完成报文(Completion)用来通知请求者,请求已经完成,如果有数据的,还要附上数据。
Deadlocks直译过来是死锁的意思,这和死机(system hang)的概念还不太一样,Deadlock通常指通讯的多方相互依赖,从而导致大家都没有办法继续发送报文的情况。本文后面会有实际的例子进行解释。
Example:
假设我们有两个设备,Device A和Device B,如下图所示:
我们来看这个假设场景:
-
Device A有两笔Non-Posted (NP)请求发往DeviceB,与此同时,DeviceB也有两笔NP请求发往DeviceA,分别为NP0和NP1*
-
从Device B的角度看,NP0已经获得对方释放的NP信用(Credit),并已经成功的被Device A接收。
-
假设Device A汇报给Device B它只有一个NP的信用,即只能接收一笔NP,那么在Device A释放NP0信用之前,Device B都不允许发送另外的NP,例如NP1给Device A。
-
Device A接收到NP0后,需要准备相应的Completion(C)
-
如果DeviceA有大量的Posted请求等待发送,那么这些请求很有可能会充满DeviceA的发送端buffer,如图所示。
-
在这种情况下,Device B NP0所对应的Completion就无法进入到DeviceA的发送端buffer,如图中#1所示。
-
如果Completion无法进入发送队列,Device A就无法释放接收端的buffer,如图中#2所示,否则Completion肯定在某个地方会积累超出硬件限制。
-
于是Device A也就不能够返回NP的信用给Device B。
-
直接的影响就是Device B无法继续发送NP给Device A。
如果换成Device A的角度看,你可以得到相同的结果。于是deadlock产生了,Device A和Device B都没有办法继续后面的工作,因为大家互为依赖关系。这个时候如果有一方的P可以超越前面的NP1(Rule A3/A4),那么在发送端buffer中,P就不会累计,而使得Completion有机会进入到发送端,当然这个时候,Completion还需要有能力超越前面的NP1(Rule D3/D4),才能彻底解决这个死锁问题,而这个超越,就是
NP0和NP1* :这里包括Non-Posted带或者不带数据的请求
Reference:
PCI Local Bus Specification Revision 3.0
PCI Express® Base Specification Revision 5.0 Version 1.0
没有回复内容