备注:图中没有画出接收端的receive buffer。

A. NEXT_RCV_SEQ Count
12位的NEXT_RCV_SEQ计数器保存期望接收的下一个TLP的序列号。 每收到一个正确的TLP报文,此计数器+1。到达4095后翻转为0。如果TLP报文错误(CRC错误、无效的TLP或者是序列号错误),计数器不变。

B. Sequence Number Checker
如果LCRC检测通过,接下来会检测接收到的TLP报文的序列号是否和上述NEXT_RCV_SEQ count 值相等。如果匹配,则接收这个报文,NEXT_RCV_SEQ 计数器+1。
注意:这个时候,并不会直接返回ACK报文给发送端,而是等待ACKNAK_LATENCY_TIMER超时后再发送,此时发送ACK带有最后一个收到的完好的TLP的序列号,表示此序列号之前的TLP报文都是正确接收完成的。还记得前面讲的不是每一个TLP报文都有一个ACK对应么?这就是原因。

C. NAK_SCHEDULED Flag
当准备计划返回一个NAK给发送端时,NAK_SCHEDULED flag标志被置位。当接收到第一个被要求重发的TLP时,此标志位清零。在NAK_SCHEDULED flag置位的时候,如果继续收到错误的TLP,是否需要继续再发送一个NAK?Spec并没有讲。只有if,没有else。如下:
 

 实际上,当NAK_SCHEDULED flag置位的时候,NEXT_RCV_SEQ Count并没有增加,所以后续到来的TLP一定是序列号不匹配的。在当前NAK掉的TLP报文没有被发送端重新发送且在接收端正确接收之前,没有必要做其他任何事情,等着就好。
 
D. ACKNAK_LATENCY_TIMER
ACKNAK_LATENCY_TIMER定时器溢出时,接收端会向发送端返回一个ACK或者NAK。这个时间大约是发送器REPLAY_TIMER值得1/3,以确保在发送端重发REPLAY_TIMER超时之前,发送端能够及时接收到接收端得ACK/NAK响应。
ACKNAK_LATENCY_TIMER的值和REPLAY_TIMER类似,也跟链路速率、宽度即MPS有关,Spec定义了一套计算公式,Gen3情况下的值如下:
 

E. ACK/NAK DLLP Generator
即生成返回给发送端的ACK/NAK DLLP报文。报文包含NEXT_RCV_SEQ counte计数器-1的值,即最后一个校验正确的TLP报文的序列号。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注