Ack/Nak协议是PCIe Data Link layer中最重要的内容。它用来保证TLP的可靠传输。它是基于Retry buffer实现的,Tx发出TLP后,将原始的TLP存到Retry buffer里面,当RX通过Ack DLLP告知已经正确收到TLP后才会将TLP中相应的TLP移除。当Rx通过Nak DLLP告知Tx有TLP出现错误后,Tx可以将Retry buffer中的相应TLP resent出去。
Tx和Rx的逻辑框图如下:

TX端
1)SEQ Num分配
DL层从TL层收到TLP后,要为其分配SEQ Num, 这个SEQ Num来自一个12bits的NEXT_TRANSMIT_SEQ(NTS), NTS从0开始每次加1,到4095后又rollover到0.
2)Ack/Nak DLLP

在Ack DLLP中,AckNak_Seq_Num的含义是Rx成功接收的最后一个TLP的SEQ_NUM。在Nak DLLP的含义也是Rx成功接收的最后一个TLP的SEQ_NUM,而不是失败的TLP的SEQ_NUM. 也就是说,当Tx收到Ack/Nak后,等于或者小于SEQ_NUM的TLP都可以从Retry buffer中移除了。
2)AckD_SEQ(AS)
含义是最近一次被成功接收了的SEQ_NUM, AckD应该是Acknowledged的意思??
3)Retry Timer
当Tx方向发出了TLP而没有收到Ack/Nak,则这个timer就处于running. 当收到Ack后,reset timer, 将retry buffer里面等于或者小于SEQ_NUM的T

本文详细介绍了PCIe数据链路层中的Ack/Nak协议,该协议确保TLP的可靠传输。当Tx发送TLP后,会将其存入Retrybuffer,Rx通过AckDLLP或NakDLLP确认接收状态。AckDLLP表示已成功接收,NakDLLP指示错误。RetryTimer、RetryNumCount和SEQ_NUM比较逻辑用于管理重传过程。在Rx端,NEXT_RCV_SEQ(NRS)跟踪预期接收的TLP序列号,并通过LCRC和SEQ_NUM检查来处理TLP。当收到错误TLP时,会发送NakDLLP,并使用AckNak_Latency_Timer来控制Ack的延迟发送。
最低0.47元/天 解锁文章
653

被折叠的 条评论
为什么被折叠?



