編 者 按
讀cocotbext-pcie源碼,有部分牽涉到數(shù)據(jù)鏈路層。雖然自工作以來接觸到PCIe還是蠻多的,但一般往往專注在TLP層,對于數(shù)據(jù)鏈路層還是接觸的比較少的。PCIe Spec洋洋灑灑數(shù)千頁,也不會從頭到尾去通讀整個協(xié)議。對于cocotbext-pcie里面牽涉到的鏈路層的ACK/NAK,牽涉到的PCIe背景,聊做記錄。
本文僅結(jié)合PCIe Spce與cocotbext-pcie做記錄。
》ACK/NAK
與TCP協(xié)議般,PCIe協(xié)議在數(shù)據(jù)鏈路層采用滑動窗口ACK/NAK協(xié)議來保證數(shù)據(jù)傳輸。對于傳輸層下發(fā)的TLP報(bào)文,數(shù)據(jù)鏈路層會做一次封裝:
ACK/NAK報(bào)文格式定義如下:
關(guān)于滑動窗口機(jī)制,往上隨便搜下還是蠻多的,不做過多啰嗦。鏈路層的滑動窗口正是基于TLP Sequence Number。
TLP Sequence Number定義為12 bits。對于發(fā)送端而言,其會維護(hù)兩個變量:
NEXT_TRANSMIT_SEQ:用于存儲下一個待發(fā)送TLP報(bào)文所使用的TLP Sequence Number。初始化時(shí)賦值為0.
ACKD_SEQ: 記錄從ACK、NAK中返回的 Sequence Number。初始化時(shí)賦值為0xfff。對于發(fā)送端,規(guī)定:(NEXT_TRANSMIT_SEQ - ACKD_SEQ) mod 4096 >= 2048
若上面的條件滿足則停止從傳輸層接收TLP,等待該條件不再成立。
也就意味著在pending中的報(bào)文不超過2048(牽涉到報(bào)文重傳)。
那么由此發(fā)送端對于收到的ACK/NAK中協(xié)議牽涉到的處理流程Spec定義為:
由于發(fā)送端窗口中pending待確認(rèn)的報(bào)文不會超過2048,故若上面1式不成立,那么則意味著用到了尚未使用到的sequence,表示為錯誤的TLP報(bào)文,同樣單次增加的ACKD也不會超過2048,否則也應(yīng)標(biāo)為錯誤的TLP。
在式3中,如果條件不成立,則意味著可以窗口前移,可以從replay buffer中移出已發(fā)送成功的數(shù)據(jù),設(shè)置ACKD_SEQ等變量。在cocotbext-pcie中關(guān)于dllp的處理也和spec保持一致:
而對于接收端,其定義了:
NEXT_RCV_SEQ:下一個待接收TLP的Sequence Number。
其處理流程為:
這里可以看到,僅當(dāng)收到的TLP報(bào)文的Sequence Number等于NEXT_REC_SEQ時(shí),才會被接收。注意紅框中,若條件滿足則認(rèn)為是重復(fù)的報(bào)文,此時(shí)則應(yīng)發(fā)送ACK DLLP報(bào)文,否則認(rèn)為是錯誤的報(bào)文,則應(yīng)發(fā)送NAK。
來看cocotbext-pcie中的處理:
這里在563行取了<而非<=,或可有誤。當(dāng)收到的是期望的報(bào)文時(shí)(555行),則會更新next_recv_seq、清除nak_scheduled,拉起ack_latency_timer(不必每個TLP均發(fā)起一個ACK,但又要確保按照Spec中規(guī)定的間隔時(shí)間來發(fā)送ACK)。而如果收到的是一個重復(fù)的TLP(563行),此時(shí)將send_ack觸發(fā)條件拉起,表示要立即發(fā)送ACK,而同時(shí)關(guān)掉ack_latency_timer,避免超時(shí)條件觸發(fā)后多發(fā)ACK。否則(567行)將會發(fā)送NAK報(bào)文。
》One More Thing
關(guān)于接收端的ack_latency,協(xié)議中有詳細(xì)的規(guī)定,其與flow control定義有相似之處,放在后面結(jié)合cocotbext-pcie進(jìn)行梳理。
審核編輯:劉清
-
接收機(jī)
+關(guān)注
關(guān)注
8文章
1181瀏覽量
53477 -
觸發(fā)器
+關(guān)注
關(guān)注
14文章
2000瀏覽量
61158 -
TLP
+關(guān)注
關(guān)注
0文章
32瀏覽量
15630 -
PCIe接口
+關(guān)注
關(guān)注
0文章
120瀏覽量
9706
原文標(biāo)題:有點(diǎn)兒東西—PCIe鏈路層里的ACK/NAK
文章出處:【微信號:Spinal FPGA,微信公眾號:Spinal FPGA】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論