[FPGA 实现及PCIe IP 核知识点] 为什么Non-Posted请求必须接受被人插队?

(本文介绍了PCIe标准中Ordering的规则A3,A4,D3和D4,即Posted Request和Completion必须能够超越Non-Posted Request)

在阅读本文之前,麻烦参考之前一篇关于Ordering的文章:

[FPGA 实现及PCIe IP 核知识点] 写为什么不能超越写?和你想象的一样吗?

让我们先看看A3,A4,D3和D5在哪里?如下图中红色标注的方格。

图片_20211108101733.jpg

注: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,如下图所示:

2.png

我们来看这个假设场景:

  1. Device A有两笔Non-Posted (NP)请求发往DeviceB,与此同时,DeviceB也有两笔NP请求发往DeviceA,分别为NP0和NP1*

  2. 从Device B的角度看,NP0已经获得对方释放的NP信用(Credit),并已经成功的被Device A接收。

  3. 假设Device A汇报给Device B它只有一个NP的信用,即只能接收一笔NP,那么在Device A释放NP0信用之前,Device B都不允许发送另外的NP,例如NP1给Device A。

  4. Device A接收到NP0后,需要准备相应的Completion(C)

  5. 如果DeviceA有大量的Posted请求等待发送,那么这些请求很有可能会充满DeviceA的发送端buffer,如图所示。

  6. 在这种情况下,Device B NP0所对应的Completion就无法进入到DeviceA的发送端buffer,如图中#1所示。

  7. 如果Completion无法进入发送队列,Device A就无法释放接收端的buffer,如图中#2所示,否则Completion肯定在某个地方会积累超出硬件限制。

  8. 于是Device A也就不能够返回NP的信用给Device B。

  9. 直接的影响就是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

编辑 重设标签(回车键确认) 标为违禁 关闭 合并 删除
匿名用户

匿名