天天看點

PCIE系統标準體系結構解讀(六):ACK/NAK 協定

主要解釋如何使用ACK DLLP來确認TLP的接收,如何使用NAK DLLP表示接收的TLP有錯誤,以及重發TLP的規則。

PCIE系統标準體系結構解讀(六):ACK/NAK 協定
PCIE系統标準體系結構解讀(六):ACK/NAK 協定

1.6.1 ACK/NAK協定的基本組成

PCIE系統标準體系結構解讀(六):ACK/NAK 協定

1.6.2 ACK/NAK協定中發送器的基本組成

下圖舉例說明了與出站TLP和入站ACK/NAK DLLP的處理有關的發送器資料鍊路層基本組成。

PCIE系統标準體系結構解讀(六):ACK/NAK 協定

1.6.2.1 重放緩沖區

重放緩沖區存儲TLP的所有字段,包括與資料鍊路層相關的序列号和LCRC字段。在發送之前,TLP一直按照從處理層傳送過來的順序存儲。重放緩沖區中每個TLP都含有一個序列号,該序列号比儲存在緩沖區中的前一個TLP包的序列号遞增1。

當發送器收到一個由ACK DLLP表示的TLP已經成功抵達接收器的确認時,它就會清除緩沖區中的這些TLP。另一方面,如果收到一個NAK DLLP,它就會重發緩沖區中的内容。

1.6.2.2 NEXT_TRANSMIT_SEQ計數器

該計數器為每個将發送的新TLP生成所配置設定的序列号。該計數器為12比特的計數器,在複位或資料鍊路層處于非活動狀态時,将它初始化為0。它的計數值可以一直遞增到4095,然後反轉回到0。

1.6.2.3 LCRC生成器

LCRC生成器為TLP資料包提供32比特的LCRC。此LCRC使用TLP的所有字段,包括頭、資料有效載荷、ECRC和序列号計算出來的。接收器使用TLP的LCRC字段檢查收到的TLP中的CRC錯誤。

1.6.2.4 REPLAY_NUM計數器

這個2比特的計數器儲存因收到NAK DLLP或REPLAY_TIMER逾時而嘗試重發的次數。當REPLAY_NUM計數器的計數值從11b翻轉回00b時,資料鍊路層會觸發一次實體層的鍊路重新定向。它回等到重新定向結束之後,再次嘗試重發TLP。REPLAY_NUM計數器在複位或資料鍊路層處于非活動狀态時被初始化為00b。無論何時收到ACK,也會将其複位,表示正發送的TLP正在進行轉發。

1.6.2.5 REPLAY_TIMER

REPLAY_TIMER用來度量從發出TLP到收到對應的ACK或NAK DLLP的時間。在發送任意TLP的最後一個字元時,REPLAY_TIMER開始計時。每次當重放緩沖區中有未完成的TLP且收到的ACK DLLP涉及一個仍在重放緩沖區中的TLP時,REPLAY_TIMER從0開始重新計時。當重放緩沖區中沒有未完成的TLP時,或者收到的每個NAK滿足重新開機條件,或者當REPLAY_TIMER計時已滿時,REPLAY_TIMER重新複位到0并保持。在重新定向期間,REPLAY_TIMER不再計數。

1.6.2.6 ACKD_SEQ計數器

12比特的寄存器跟蹤或儲存最近收到的ACK或NAK DLLP的序列号。在複位或資料鍊路層不活動時,它被初始化為全1。這一寄存器要用收到的ACK或NAK DLLP中的AckNak_Seq_Num字段來更新,并将ACKD_SEQ計數與NEXT_TRANSMIT_SEQ計數進行比較。

如果(NEXT_TRANSMIT_SEQ - ACKD_SEQ)除以4096的餘數大于等于2048,則資料鍊路層不再接收來自處理層的新TLP,直到此不等式不再成立。另外,報告發現一個緻命的、無法修正的資料鍊路層協定錯誤。如果NEXT_TRANSMIT_SEQ和ACKD_SEQ之間的間隔大于2047,這種錯誤就會發生。

ACKD_SEQ計數也可以用來檢查正在發送的TLP否認轉發進度。如果經過3次額外的重發嘗試之後,轉發進度沒有變化,那麼要重新定向鍊路。

1.6.2.7 DLLP CRC檢查

這一部件能夠檢查接收器傳回的DLLP中的CRC錯誤。對完好的DLLP做進一步處理。如果檢測到DLLP CRC錯誤,則丢棄該DLLP并報告錯誤,不再采取進一步的行動。

定義:當實體層報告鍊路不能使用或沒有裝置連接配接到端口時,資料鍊路層處于非活動狀态。當鍊路定向和狀況狀态機(Link Training and Status state machine,LTSSM)處于Link-Up = 0的檢測(Detect)、輪詢(Polling)、配置(Configuration)、複位(Reset)或回環(LoopBack)狀态時,實體層處于不能使用狀态。當資料鍊路層處于非活動狀态時,将資料鍊路層狀态機初始化為預設值并将重放緩沖區清空。當實體層報告Link-Up=1并且鍊路控制寄存器中的鍊路禁用(Link Disable)比特等于0時,資料鍊路層退出非活動狀态。

1.6.3 ACK/NAK協定中接收器的基本組成

下圖展示了與進站TLP和出站ACK/NAK DLLP處理有關的接收器資料鍊路層的基本組成。

PCIE系統标準體系結構解讀(六):ACK/NAK 協定

1.6.3.1 接收緩沖區

在進行TLP CRC和序列号檢查時,接收緩沖區臨時存放接收的TLP。如果沒有錯誤,TLP會被處理并且發送至接收器的處理層。如果有和TLP相關的錯誤,則丢棄該TLP并且安排一個NAK DLLP。如果此TLP是重複的TLP,則丢棄該TLP并且安排一個ACK TLLP。如果該TLP是一個無效的TLP,則丢棄它并且不再采取進一步的行動。

1.6.3.2 LCRC錯誤檢查

使用TLP的32比特LCRC字段來檢查收到的TLP中的LCRC錯誤。

1.6.3.3 NEXT_RCV_SEQ計數器

12比特的NEXT_RCV_SEQ計數器跟蹤預計的下一個TLP的序列号。複位或資料鍊路層處于非活動狀态時,将此計數器初始化為0.對接收到的每個轉發至處理層的、完好的TLP,此計數器自動加1。當計數器的值達到4095時,計數器翻轉回0。當接收到的TLP有CRC錯誤、或是無效的TLP、或是序列号不正确的TLP時,計數器的值不變。

1.6.3.4 序列号檢查

CRC錯誤檢查後,這一部件驗證收到的TLP的序列号與NEXT_RCV_SEQ計數器的值是否比對。

如果TLP的序列号等于NEXT_RCV_SEQ計數器的值,則接收、處理并且轉發該TLP至處理層。NEXT_RCV_SEQ的值加1。接收器繼續處理入站的TLP,在ACKNAK_LATENCY_TIMER沒有計滿或超出其設定值之前,接收器不必翻譯ACK DLLP。

如果TLP的序列号是比NEXT_RCV_SEQ的值早的一個序列号,并且與NEXT_RCV_SEQ值之間的間隔小于2048,那麼該TLP為一重複的TLP。丢棄它并安排一個ACK DLLP傳回發送器。

如果TLP的序列号是比NEXT_RCV_SEQ值晚的一個序列号,或者任何其他不同于以上兩種情況的情況,則丢棄該TLP,并可能安排一個NAK DLLP傳回發送器。

1.6.3.5 NEXT_SCHEDULED标志

當接收器安排一個NAK DLLP傳回遠端發送器時,将設定NAK_SCHEDULED标志。當接收器見到與之前NAK要求重發的TLP有關的第一個TLP時,它将清除NAK_SCHEDULED标志。對于在NAK_SCHEDULED标志置位期間收到的壞TLP,接收器是否應該設計另外一個NAK DLLP方面,規範沒有明确規定。

1.6.3.6 ACKNAK_LATENCY_TIMER定時器

ACKNAK_LATENCY_TIMER監控從安排最後一個ACK或NAK DLLP傳回遠端發送器開始所經曆的時間。接收器接收器使用此定時器確定當定時器期滿或超出其設定值時,它能夠迅速處理TLP并傳回一個ACK或NAK DLLP。

1.6.3.7 ACK/NAK DLLP生成器

這一部件根據LCRC或序列号校驗部分的指令生成ACK或NAK DLLP。ACK或NAK DLLP包含一個由NEXT_RCV_SEQ計數器獲得的AckNak_Seq_Num[11:0]字段。ACK或NAK DLLP含有的AckNak_Seq_Num[11:0]的值等于NEXT_RCV_SEQ的值減1。

1.6.4 ACK/NAK DLLP的格式

下圖展示了一個ACK或NAK的DLLP的格式。

PCIE系統标準體系結構解讀(六):ACK/NAK 協定
字段名 頭位元組/比特 DLLP的功能
AckNak_Seq_Num[11:0]

位元組3的比特7:0

位元組2的比特3:0

對于ACK DLLP:對于接受的序列号等于早于NEXT_RCV_SEQ計數值的TLP,使用NEXT_RCV_SEQ-1

對于NAK DLLP:與CRC校驗失敗有關的TLP,使用NEXT_RCV_SEQ-1;對于接收的序列号晚于NEXT_RCV_SEQ計數值的TLP,使用NEXT_RCV_SEQ-1

類型[7:0] 位元組0的比特7:0

指出DLLP的類型,對于Ack/Nak DLLP:

0000 0000b = ACK DLLP

0001 0000b = NAK DLLP

16比特的CRC

位元組5的比特7:0

位元組4的比特7:0

用來保護DLLP内容的16比特CRC,根據ACK/NAK的位元組0~3的内容計算的
PCIE系統标準體系結構解讀(六):ACK/NAK 協定