0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

PCIe鏈路層里的ACK/NAK介紹

Spinal FPGA ? 來源:Spinal FPGA ? 作者:玉騏 ? 2023-06-25 10:31 ? 次閱讀

編 者 按

讀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ù)鏈路層會做一次封裝:

47234cbc-1181-11ee-962d-dac502259ad0.jpg

ACK/NAK報(bào)文格式定義如下:

474c2cf4-1181-11ee-962d-dac502259ad0.jpg

關(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定義為:

47654b94-1181-11ee-962d-dac502259ad0.jpg

由于發(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保持一致:

4785ba50-1181-11ee-962d-dac502259ad0.png

而對于接收端,其定義了:

NEXT_RCV_SEQ:下一個待接收TLP的Sequence Number。

其處理流程為:

47a54046-1181-11ee-962d-dac502259ad0.jpg

這里可以看到,僅當(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中的處理:

47c7a32a-1181-11ee-962d-dac502259ad0.png

這里在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)行梳理。




審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 接收機(jī)
    +關(guān)注

    關(guān)注

    8

    文章

    1181

    瀏覽量

    53477
  • 觸發(fā)器
    +關(guān)注

    關(guān)注

    14

    文章

    2000

    瀏覽量

    61158
  • TLP
    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)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    PCIe引腳定義和PCIe協(xié)議層介紹

    本文我們將向大家介紹PCIe引腳定義以及PCIe協(xié)議層。
    發(fā)表于 09-26 11:39 ?1.7w次閱讀
    <b class='flag-5'>PCIe</b>引腳定義和<b class='flag-5'>PCIe</b>協(xié)議層<b class='flag-5'>介紹</b>

    CY7C65215A作為從站,在主站寫入時(shí)響應(yīng)NAK是怎么回事?

    設(shè)備寫入數(shù)據(jù)時(shí),總是在主設(shè)備向從設(shè)備寫入的每個字節(jié)上響應(yīng) ACK。 我遇到的問題是,當(dāng)我的微控制器作為主站向作為從站的賽普拉斯寫入數(shù)據(jù)時(shí),賽普拉斯對最后一個字節(jié)的響應(yīng)是 NAK,而不是 ACK
    發(fā)表于 07-04 06:30

    BLE中的ACK機(jī)制

    ACK
    橙群微電子
    發(fā)布于 :2023年03月31日 09:52:36

    TLP的數(shù)據(jù)鏈路層組成與操作

    、 Vendor_Defined DLLPs:廠商自定義DLLP?! ?b class='flag-5'>ACK/NAK協(xié)議  ACK/NAK是一種滑動窗口協(xié)議,PCIe設(shè)備數(shù)
    發(fā)表于 01-08 17:25

    【每日一知識點(diǎn)】在STM32F4上OTG 主機(jī)庫在 BULK 傳輸上對 NAK 的處理

    數(shù)據(jù)后,不再回復(fù) NAK 握手,而是回復(fù)主機(jī)要獲取的數(shù)據(jù),然后主機(jī)硬件回復(fù) ACK 來結(jié)束本次 transfer。BULK IN通道對 NAK的處理和 CTRL IN通道對 NAK的處
    發(fā)表于 06-02 15:22

    介紹車用CAN通訊的基礎(chǔ)知識,數(shù)據(jù)鏈路層部分

    本博文主要介紹了車用CAN通訊的基礎(chǔ)知識,數(shù)據(jù)鏈路層部分,主要包括幀類型、幀起始&幀結(jié)束、仲裁段、控制段、數(shù)據(jù)段、CRC段&ACK段和錯誤幀等。
    發(fā)表于 01-07 06:16

    一文詳解CXL鏈路層格式的定義

    4.1 CXL.io鏈路層CXL.io鏈路層充當(dāng)CXL.io事務(wù)層和Flex Bus物理層之間的中間層。其主要職責(zé)是提供可靠的機(jī)制,用于在鏈路上的兩個組件之間交換事務(wù)層數(shù)據(jù)包(TLP)。PCIe
    發(fā)表于 02-21 14:27

    什么是ACK (ACKnowledge Character)

    什么是ACK (ACKnowledge Character)  英文縮寫: ACK (ACKnowledge Character) 中文譯名: 確認(rèn)字符 分  類: 傳輸與接入
    發(fā)表于 02-22 10:12 ?1834次閱讀

    數(shù)據(jù)鏈路層到底是什么_數(shù)據(jù)鏈路層工作原理是怎樣的

    本文開始闡述了什么是數(shù)據(jù)鏈路層,其次闡述了數(shù)據(jù)鏈路層的分類和數(shù)據(jù)鏈路層的工作原理,最后介紹了常用的數(shù)據(jù)鏈路層。
    發(fā)表于 03-14 14:10 ?3.1w次閱讀
    數(shù)據(jù)<b class='flag-5'>鏈路層</b>到底是什么_數(shù)據(jù)<b class='flag-5'>鏈路層</b>工作原理是怎樣的

    PCIe總線的通信機(jī)制

    那么為什么要分為Non-Posted和Posted兩種類型呢?對于Memory Writes來說,對效率要求較高,因此采用了Posted的方式。但是這并不意味著Posted類型的操作不需要Completer進(jìn)行應(yīng)答,只是此時(shí)Completer采用了另一種應(yīng)答機(jī)制——Ack/Nak
    的頭像 發(fā)表于 04-24 09:41 ?1.2w次閱讀
    <b class='flag-5'>PCIe</b>總線的通信機(jī)制

    Ack/Nak機(jī)制詳細(xì)介紹

    Ack/Nak是一種由硬件實(shí)現(xiàn)的,完全自動的機(jī)制,目的是保證TLP有效可靠地傳輸。Ack DLLP用于確認(rèn)TLP被成功接收,Nak DLLP則用于表明TLP傳輸中遇到了錯誤。
    的頭像 發(fā)表于 05-29 14:46 ?1.5w次閱讀
    <b class='flag-5'>Ack</b>/<b class='flag-5'>Nak</b>機(jī)制詳細(xì)<b class='flag-5'>介紹</b>

    簡單地分析幾個Ack/Nak機(jī)制的例子

    設(shè)備B接收到了TLP4095,但是該TLP并未通過CRC校檢(即存在錯誤)。此時(shí)無論AckNak_LATENCY_TIMER處于何種狀態(tài),設(shè)備B都會立即向設(shè)備A返回Ack4094(注意返回的Ack
    的頭像 發(fā)表于 05-30 09:16 ?6398次閱讀
    簡單地分析幾個<b class='flag-5'>Ack</b>/<b class='flag-5'>Nak</b>機(jī)制的例子

    ack文本查找工具

    ./oschina_soft/ack3.zip
    發(fā)表于 05-25 09:24 ?0次下載
    <b class='flag-5'>ack</b>文本查找工具

    什么是PCIe?

    PCIe是一種高速串行計(jì)算機(jī)擴(kuò)展總線標(biāo)準(zhǔn),自2003年推出以來,已經(jīng)成為服務(wù)器(Server)和PC上的重要接口。今天為大家簡單介紹一下PCIe的發(fā)展歷史以及它的工作原理。 一、PCIe
    的頭像 發(fā)表于 07-04 18:15 ?2w次閱讀

    PCIE數(shù)據(jù)鏈路層架構(gòu)解析

    數(shù)據(jù)傳輸?shù)耐暾院鸵恢滦裕═LP ACK/NAK),此外數(shù)據(jù)鏈路層還需要對PCIe鏈路進(jìn)行管理(電源管理)和監(jiān)控(流量控制)。
    的頭像 發(fā)表于 11-05 17:06 ?358次閱讀
    <b class='flag-5'>PCIE</b>數(shù)據(jù)<b class='flag-5'>鏈路層</b>架構(gòu)解析