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

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

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

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

SwM2_ChinaAET ? 來源:未知 ? 作者:胡薇 ? 2018-05-29 14:46 ? 次閱讀

Ack/Nak是一種由硬件實(shí)現(xiàn)的,完全自動(dòng)的機(jī)制,目的是保證TLP有效可靠地傳輸。Ack DLLP用于確認(rèn)TLP被成功接收,Nak DLLP則用于表明TLP傳輸中遇到了錯(cuò)誤。

如上圖所示,發(fā)送方會(huì)對(duì)每一個(gè)TLP在Replay Buffer中做備份,直到其接收到來自接收方的Ack DLLP,確認(rèn)該DLP已經(jīng)成功的被接受,才會(huì)刪除這個(gè)備份。如果接收方發(fā)現(xiàn)TLP存在錯(cuò)誤,則會(huì)向發(fā)送發(fā)發(fā)送Nak DLLP,然后發(fā)送方會(huì)從Replay Buffer中取出數(shù)據(jù),重新發(fā)送該TLP。

Ack/Nak機(jī)制內(nèi)部的詳細(xì)結(jié)構(gòu)圖如下圖所示:

下面對(duì)圖中的各個(gè)Elements分別做一個(gè)簡單地介紹。

首先是發(fā)送端的Elements:

來個(gè)大圖特寫:

NEXT_TRANSMIT_SEQ Counter

NEXT_TRANSMIT_SEQ Counter,即NTS計(jì)數(shù)器,是一個(gè)12位的計(jì)數(shù)器。當(dāng)數(shù)據(jù)鏈路層處于DL-Down狀態(tài)或者復(fù)位時(shí),該計(jì)數(shù)器會(huì)被初始化為0。該計(jì)數(shù)器只會(huì)執(zhí)行加一操作,也就是說當(dāng)其到達(dá)最大值4095時(shí),在進(jìn)行加一操作則會(huì)變成0(Roll Over)。該計(jì)數(shù)器用于產(chǎn)生下一個(gè)待發(fā)送的TLP的序列號(hào)(Sequence Number)。每一個(gè)序列號(hào)都是與一個(gè)TLP所唯一對(duì)應(yīng)的,可以說這個(gè)序列號(hào)正是整個(gè)Ack/Nak機(jī)制的關(guān)鍵。

LCRC Generator

LCRC產(chǎn)生器用于產(chǎn)生一個(gè)32位的CRC值,其作用于整個(gè)TLP和其對(duì)應(yīng)的序列號(hào)。

Replay Buffer

Replay Buffer是Mindshare書中的叫法,在PCIe Spec中,這個(gè)Buffer的名稱叫做Retry Buffer。Replay Buffer中按照傳輸順序,存儲(chǔ)了整個(gè)TLP、序列號(hào)和LCRC,如下圖所示:

當(dāng)發(fā)送端收到來自接收端的Ack DLLP時(shí),會(huì)將Buffer中相應(yīng)的TLP(包括對(duì)應(yīng)的序列號(hào)和LCRC)移除;如果接收到的是Nak DLLP,則會(huì)將Buffer中響應(yīng)的TLP(包括對(duì)應(yīng)的序列號(hào)和LCRC)重新發(fā)送給接收端。

REPLAY_TIMER Count

REPLAY_TIMER是一種看門狗定時(shí)器,當(dāng)該定時(shí)器溢出,則表明發(fā)送端已經(jīng)發(fā)送了一個(gè)或者多個(gè)TLP,但是并未收到來自接收端的應(yīng)答信號(hào)(Ack/Nak)。此時(shí),發(fā)送端會(huì)將Replay Buffer中的TLP重新發(fā)送,并將看門狗定時(shí)器重啟。

只要發(fā)送端發(fā)送了任何TLP,該定時(shí)器便會(huì)啟動(dòng),在接收到來自接收端的應(yīng)答信號(hào)之前都會(huì)持續(xù)地運(yùn)行。當(dāng)收到應(yīng)答信號(hào)之后,定時(shí)器會(huì)立即被清零。此時(shí)如果Replay Buffer仍然有TLP(表明還有TLP被發(fā)送,但是仍未得到應(yīng)答),定時(shí)器又會(huì)被立即被重新啟動(dòng)。如果Buffer中是空的,則定時(shí)器不會(huì)被重新啟動(dòng),直到新的TLP被發(fā)送。

REPLAY_NUM Count

這是一個(gè)2位的計(jì)數(shù)器,用于記錄同一個(gè)TLP發(fā)送失敗的次數(shù),當(dāng)其值從11b變?yōu)?0b時(shí)(溢出了,表示嘗試發(fā)送某個(gè)TLP失敗了4次),數(shù)據(jù)鏈路層會(huì)自動(dòng)地強(qiáng)制物理層重新進(jìn)行鏈路訓(xùn)練(即LTSSM進(jìn)入Recovery狀態(tài))。當(dāng)完成鏈路訓(xùn)練之后,便會(huì)重新發(fā)送之前發(fā)送失敗的TLP。

當(dāng)發(fā)送端接收到來自接收端的Nak DLLP或者發(fā)送端的看門狗定時(shí)器(REPLAY_TIMER)溢出時(shí),該計(jì)數(shù)器都會(huì)被加一;當(dāng)接收到Ack DLLP時(shí),該計(jì)數(shù)器則會(huì)被清零。

ACKD_SEQ

ACKD_SEQ寄存器用于存儲(chǔ)最近接收到的Ack或者Nak DLLP中的序列號(hào)。當(dāng)復(fù)位或者數(shù)據(jù)鏈路層處于無效狀態(tài)時(shí),該寄存器會(huì)被初始化為全1。關(guān)于ACKD_SEQ寄存器的具體用法會(huì)在后續(xù)的文章中,用例子的形式詳細(xì)說明。

DLLP CRC Check

接收端在接收到來自發(fā)送端的DLLP后,首先會(huì)檢查其DLLP CRC,如果發(fā)現(xiàn)有錯(cuò)誤,則會(huì)直接將其丟棄,認(rèn)為其實(shí)無效的DLLP。

然后是接收端的Elements:

首先來一張大圖特寫:

LCRC Error Check

顧名思義,LCRC Error Check用于檢查接收到的TLP是否存在錯(cuò)誤。如果存在錯(cuò)誤,則將對(duì)應(yīng)的TLP直接丟棄,然后產(chǎn)生一個(gè)Nak DLLP發(fā)送給發(fā)送端,讓其重新發(fā)送該TLP。

NEXT_RCV_SEQ

NEXT_RCV_SEQ是一個(gè)12位的計(jì)數(shù)器,即Next Receive Sequence Number,其值為已經(jīng)成功接收的TLP的序列號(hào)加1。主要用于檢查當(dāng)前接收到的TLP是不是應(yīng)該接收到的TLP。

如果NEXT_RCV_SEQ和當(dāng)前接收到的TLP中的序列號(hào)的值相等,則認(rèn)為這是一個(gè)有效的TLP,但是接收端并不會(huì)立即向發(fā)送端發(fā)送Ack DLLP,而是等到AckNak_LATENCY_TIMER溢出時(shí)才向發(fā)送端發(fā)送Ack DLLP。也就是說,一個(gè)Ack DLLP可能會(huì)對(duì)應(yīng)多個(gè)TLP,接收端不會(huì)每成功接收到一個(gè)TLP便向發(fā)送端發(fā)送Ack DLLP。

如果當(dāng)前接收到的TLP中的序列號(hào)小于NEXT_RCV_SEQ(且差值不超過2048),則認(rèn)為該TLP之前已經(jīng)成功發(fā)送過了,此次是重復(fù)發(fā)送。需要注意的是,PCIe Spec認(rèn)為重復(fù)發(fā)送并不是一個(gè)錯(cuò)誤,只是直接將該TLP丟棄,并沒有Nak或者Error Reporting,但是會(huì)返回一個(gè)包含有上一次成功接收的TLP的序列號(hào)(NRS-1)的Ack DLLP給發(fā)送端。

如果當(dāng)前接收到的TLP的序列號(hào)大于NEXT_RCV_SEQ,表明傳輸過程中漏掉了一些TLP。此時(shí),接收端會(huì)返回Nak DLLP,并直接丟棄該TLP。

一個(gè)簡單的例子如下圖所示:

NAK_SCHEDULED Flag

NAK_SCHEDULED是一個(gè)標(biāo)志位,當(dāng)接收端產(chǎn)生Nak DLLP時(shí),該標(biāo)志位會(huì)被置位。當(dāng)接收端成功接收到有效的TLP時(shí),該標(biāo)志位會(huì)被清零。需要特別注意的是,當(dāng)該標(biāo)志位處于置位狀態(tài)時(shí),接收端不應(yīng)產(chǎn)生其他的Nak DLLP。

AckNak_LATENCY_TIMER

AckNak_LATENCY_TIMER定時(shí)器會(huì)在接收端成功接收到有效的TLP,且并未向發(fā)送端返回Ack DLLP之前運(yùn)行。當(dāng)AckNak_LATENCY_TIMER定時(shí)器溢出時(shí),接收端會(huì)立即向發(fā)送端返回Ack DLLP(攜帶的序列號(hào)為NRS-1,即一個(gè)Ack對(duì)應(yīng)多個(gè)有效的TLP)。無論接收端返回Ack還是Nak,該定時(shí)器都會(huì)被復(fù)位,但是只有當(dāng)接收端再次收到有效的TLP時(shí),該定時(shí)器才會(huì)被重新啟動(dòng)。

該定時(shí)器(REPLAY_TIMER)的值是由PCIe Spec規(guī)定的和Lane的數(shù)量與Max_Payload有關(guān),Gen1的值如下圖所示:

Gen2(5GT/s)如下圖所示:

注:該定時(shí)器(REPLAY_TIMER)的值是AckNak_LATENCY_TIMER定時(shí)器值的三倍。

Ack/Nak Generator

顯然,Ack/Nak Generator的功能是產(chǎn)生Ack或者Nak DLLP。其格式如下:

最后,介紹一下PCIe Spec中推薦的包優(yōu)先級(jí)順序。我們知道,PCIe總線通信中,存在多種類型的包,包括TLP、DLLP和Ordered Sets等。為了能夠是總線達(dá)到最優(yōu)的傳輸效率,PCIe Spec推薦對(duì)這些包的優(yōu)先級(jí)做如下的設(shè)置:(當(dāng)然這只是推薦,并沒有強(qiáng)制廠商一定要這要去實(shí)現(xiàn))。

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

    關(guān)注

    0

    文章

    28

    瀏覽量

    11341
  • PCIe
    +關(guān)注

    關(guān)注

    16

    文章

    1324

    瀏覽量

    84717
  • NAK
    NAK
    +關(guān)注

    關(guān)注

    0

    文章

    4

    瀏覽量

    3803

原文標(biāo)題:【博文連載】PCIe掃盲——Ack/Nak 機(jī)制詳解(一)

文章出處:【微信號(hào):ChinaAET,微信公眾號(hào):電子技術(shù)應(yīng)用ChinaAET】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 1人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

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

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

    BLE中的ACK機(jī)制

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

    請(qǐng)問CC2530如何實(shí)現(xiàn)指定節(jié)點(diǎn)的ACK回復(fù)功能?

    ,節(jié)點(diǎn)和接收器都出在一個(gè)頻點(diǎn)下。CC2530的相關(guān)機(jī)制是否能實(shí)現(xiàn)這點(diǎn)呢?麻煩在于auto ack是自動(dòng)回復(fù)的,似乎不能規(guī)定目標(biāo)地址!
    發(fā)表于 04-24 08:58

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

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

    ACK電路圖

    ACK電路圖
    發(fā)表于 01-01 05:36 ?1383次閱讀
    <b class='flag-5'>ACK</b>電路圖

    什么是ACK (ACKnowledge Character)

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

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

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

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

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

    發(fā)動(dòng)機(jī)制造工藝的詳細(xì)資料說明

    本文檔的主要內(nèi)容詳細(xì)介紹的是拖拉機(jī)的發(fā)動(dòng)機(jī)制造工藝詳細(xì)資料說明。
    發(fā)表于 04-09 08:00 ?0次下載
    發(fā)動(dòng)<b class='flag-5'>機(jī)制</b>造工藝的<b class='flag-5'>詳細(xì)</b>資料說明

    C0603X5R226M6R3NAK 片式高容多層陶瓷電容器

    電子發(fā)燒友網(wǎng)為你提供EYANG(EYANG)C0603X5R226M6R3NAK相關(guān)產(chǎn)品參數(shù)、數(shù)據(jù)手冊(cè),更有C0603X5R226M6R3NAK的引腳圖、接線圖、封裝手冊(cè)、中文資料、英文資料,C0603X5R226M6R3NAK
    發(fā)表于 01-29 11:04

    C0603X5R226X6R3NAK 片式高容多層陶瓷電容器

    電子發(fā)燒友網(wǎng)為你提供EYANG(EYANG)C0603X5R226X6R3NAK相關(guān)產(chǎn)品參數(shù)、數(shù)據(jù)手冊(cè),更有C0603X5R226X6R3NAK的引腳圖、接線圖、封裝手冊(cè)、中文資料、英文資料,C0603X5R226X6R3NAK
    發(fā)表于 03-17 19:41

    ack文本查找工具

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

    PCIe鏈路層里的ACK/NAK介紹

    Spec洋洋灑灑數(shù)千頁,也不會(huì)從頭到尾去通讀整個(gè)協(xié)議。對(duì)于cocotbext-pcie里面牽涉到的鏈路層的ACK/NAK,牽涉到的PCIe背景,聊做記錄。 ????本文僅結(jié)合PCIe Spce
    的頭像 發(fā)表于 06-25 10:31 ?3597次閱讀
    PCIe鏈路層里的<b class='flag-5'>ACK</b>/<b class='flag-5'>NAK</b><b class='flag-5'>介紹</b>

    詳細(xì)介紹?注意力機(jī)制中的掩碼

    注意力機(jī)制的掩碼允許我們發(fā)送不同長度的批次數(shù)據(jù)一次性的發(fā)送到transformer中。在代碼中是通過將所有序列填充到相同的長度,然后使用“attention_mask”張量來識(shí)別哪些令牌是填充的來做到這一點(diǎn),本文將詳細(xì)介紹這個(gè)掩
    的頭像 發(fā)表于 07-17 16:46 ?1019次閱讀
    <b class='flag-5'>詳細(xì)</b><b class='flag-5'>介紹</b>?注意力<b class='flag-5'>機(jī)制</b>中的掩碼

    CAN總線波形中為什么ACK電平偏高?

    在觀察CAN通信波形時(shí),我們會(huì)發(fā)現(xiàn)差分電平在ACK段突然增高,這是什么原因?qū)е碌哪??本文結(jié)合測(cè)試實(shí)例對(duì)ACK電平偏高的原因做簡單分析。ACK簡介ACK的作用:確認(rèn)一幀報(bào)文是否正常接收。
    的頭像 發(fā)表于 03-28 08:23 ?1677次閱讀
    CAN總線波形中為什么<b class='flag-5'>ACK</b>電平偏高?

    電子發(fā)燒友

    中國電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會(huì)員交流學(xué)習(xí)
    • 獲取您個(gè)性化的科技前沿技術(shù)信息
    • 參加活動(dòng)獲取豐厚的禮品