credit、Ack 和 Completion 各自在哪一步發生?

credit、Ack 和 Completion 各自在哪一步發生?

選擇步驟後,圖中對應的元件與下方解說會加上重點標示。完整圖與所有解說會持續顯示;也可用方向鍵切換步驟。

先追蹤一筆普通非 Flit 傳輸,再分別看確認訊息與空間回報。兩條回報路徑不是固定先後的時序。

傳送確認與接收額度分別回報接收空間回報與錯誤重送是兩個獨立機制;成功Ack不代表交易完成。傳送端:先確認接收資源相鄰接收端:檢查與接收接收緩衝釋放空間傳送端:保留重送資料送出 TLPAck/Nak:非 Flit留存副本資料往前處理UpdateFC:空間回報

作者依 Base 6.0 繪製的教學示意;省略與本章無關的交換。

TLP
Transaction Layer Packet,交易層封包

FC(Flow Control,流量控制)確認相鄰接收端有空間;重送機制處理 Link 上的資料傳輸錯誤;Completion(完成回覆)則回到交易本身。這一章把三者放在同一條路徑,從發送前的空間檢查,走到接收、回報與後續處理。

  1. 傳送前先確認接收空間

    圖中一條 Link 的可用空間,不代表最終目的端已接收或處理這筆交易。

    先確認該 VC 已完成 FC_INIT2,再用封包種類找出需要的 Header 與 Data credit。本章以有限額度的累積計數追蹤一筆寫入。

    VC
    Virtual Channel,虛擬通道

    Base 6.0 §2.6.1,pp.237、241;§3.4.1,p.273。

  2. 在這一條 Link 檢查完整性

    LCRC(Link Cyclic Redundancy Check,鏈結循環冗餘檢查)保護單一 Link;Flit 模式改在 Flit 層重送,不使用這組 Ack/Nak DLLP。

    DLLP
    Data Link Layer Packet,資料鏈結層封包

    收到涵蓋這筆 TLP 的有效 Ack 後,可釋放相應重送副本;這個確認不會增加可用 credit。

    TLP
    Transaction Layer Packet,交易層封包

    Base 6.0 §3.6.2.2,pp.297–298;§2.6.1.1,pp.242–246。

  3. 釋放空間後更新資源

    交易是否完成仍依要求種類與完成回覆判讀,不能由一個 Ack 或 UpdateFC 判定。

    接收端釋放空間後回報新的累積上限;傳送端收到有效 UpdateFC 才更新 CREDIT_LIMIT。同一 TLP 的 Link Replay 不重新消耗一份額度。

    Base 6.0 §2.6,p.236;§2.6.1.1、§2.6.1.2,pp.242–247。

Link 已能交換資訊,就能開始送 TLP 嗎?

還要確認該 VC 的 Flow Control 初始化已完成。沿 Figure 3-2(p.265)先辨認 Data Link 狀態:實體 Link 可用後,若條件適用,先經 DL_Feature 交換功能資訊,再進入 DL_Init,初始化基本通道 VC0。額外 VC 的軟體啟用方式已在 Chapter 16 帶讀。

VC
Virtual Channel,虛擬通道

接著讀 §3.2.1 的 DL_Init 規則(p.267),這裡有一個容易漏掉的差別:在 FC_INIT1 時回報 DL_Down;進入 FC_INIT2 後已回報 DL_Up,但仍未完成初始化。§3.4.1(p.273)明確要求,FC_INIT2 期間仍須阻止該 VC 的 TLP 傳送,直到離開這個狀態。因此,判斷傳送時機要接著查 FC 狀態,不能停在 DL_Up 這個輸出。

FC
Flow Control,流量控制

Non-Flit Mode 的 InitFC1/InitFC2 各交換 Posted、Non-Posted、Completion 三組資源資訊。先取得對方宣告的額度,再完成第二階段確認;已經初始化完成的其他 VCs,仍可依自身條件傳輸。後面的案例從 VC0 已完成初始化、雙端皆處於 DL_Active 的時點開始。

規格閱讀:§3.2 Data Link Control and Management State Machine,Figure 3-2 Data Link Control and Management State Machine,pp.264–265;§3.2.1,pp.266–267;§3.4 Flow Control Initialization Protocol、§3.4.1 Flow Control Initialization State Machine Rules,pp.270–273;§2.6.1,p.241。文件頁與 PDF 頁相同。

先分清楚:這筆封包要用哪一類 credit?

先用 Table 2-44(p.237)把資源分成 Posted、Non-Posted、Completion,每一類再分 Header 與 Data,形成六種 credit。PH 是 Posted Header Credit,PD 是 Posted Data Credit;Non-Posted 與 Completion 則分別使用 NPH/NPD、CplH/CplD。

再用同頁的 Table 2-45 找封包種類,不要只看它有沒有 Data。例如 I/O Write 與一般 Memory Write 都帶資料,前者是 Non-Posted,後者是 Posted,需要的 credit 類別不同。

本次要傳的封包所需資源與回覆的關係
Memory Write Request1 PH + n PD沒有一般 Completion
Memory Read Request1 NPH返回的資料另由 Completion 承載
Completion with Data1 CplH + n CplD在反方向檢查這個封包所需的額度

Data credit 的基本單位是 4 DW,也就是 16 bytes;n 按本筆 TLP 的資料長度向上取整。後面的 20-byte 寫入因此需要 1 PH 與 2 PD。這些單位是協定帳目,不等同於硬體內部必定以相同大小切割緩衝。

DW
Double Word,4 bytes的資料單位

規格閱讀:§2.6 Ordering and Receive Buffer Flow Control,pp.235–236;§2.6.1 Flow Control (FC) Rules,Table 2-44 Flow Control Credit Types、Table 2-45 TLP Flow Control Credit Consumption,p.237。這裡使用一般 Non-Flit Mode 計算;Flit Shared FC 另有計帳粒度。

UpdateFC 的數字變小,為什麼可用額度反而增加?

CREDIT_LIMIT 是接收端累積宣告的額度上限,CREDITS_CONSUMED 是傳送端累積使用的額度;兩者都會按欄位寬度回繞。單看最新一個 UpdateFC 的數字,還不知道目前能傳多少。

【模擬資料】以下資料為教學用途建立,不代表特定硬體或平台。Root Port 00:01.0 正要向 Endpoint 01:00.0 傳送一筆 20-byte Memory Write,使用 TC0/VC0。Link 為 8.0 GT/s、Non-Flit Mode;雙端不支援 Scaled Flow Control。地址、BAR、Memory Space Enable 與其他傳送條件均已確認,接收端的 Rx_MPS_Limit 為 128 bytes。

BAR
Base Address Register,基底位址暫存器

初始化時,Endpoint 對此方向的 Posted 類別宣告 HdrFC=08h、DataFC=008h,兩者都是有限額度。其他必要類別也已完成初始化。下面從 Link 已經傳輸許多封包後開始,假設這段期間沒有其他 Posted 封包干擾計數。這些是規格用來說明行為的概念計數,可由完整 Trace 重建;它們不是 Configuration Space 中規定可讀取的寄存器。

先選欄位寬度,再讀更新值

Table 2-47(p.241)在「不支援 Scaled Flow Control」這一列,指定 Header 計數為 8 bits、Data 為 12 bits,分別以 100h 與 1000h 為模數。再到 Figure 3-11(p.284)找到 UpdateFC 的 VC、HdrFC 與 DataFC,確認這是回報本次 VC0、Posted 資源的 UpdateFC-P,而非另一個 VC 或反方向的帳目。

接著依 §2.6.1.1 追蹤兩組數值。下表的「已消耗計數」為 CREDITS_CONSUMED;「最新宣告上限」為 CREDIT_LIMIT。可用額度是兩者之差按相同欄位寬度取模,並須遵守規格對未使用額度的範圍限制。

觀察時點已消耗計數最新宣告上限目前可用 credit
準備傳送,先等待PH=FEh; PD=FFEhPH=FFh; PD=FFEh1 PH / 0 PD
收到 Update APH=FEh; PD=FFEhPH=00h; PD=000h2 PH / 2 PD
新 TLP 通過 FC 檢查PH=FFh; PD=000hPH=00h; PD=000h1 PH / 0 PD
收到涵蓋本 TLP 的有效 AckPH=FFh; PD=000hPH=00h; PD=000h1 PH / 0 PD
收到 Update BPH=FFh; PD=000hPH=01h; PD=002h2 PH / 2 PD

第一列只有 1 PH、0 PD,這筆寫入還不能送。收到 Update A 後,PD 的差值變成 (000h − FFEh) mod 1000h = 002h,所以有 2 PD;PH 則由 (00h − FEh) mod 100h = 02h 得到 2 PH。更新欄位由較大的值變成零,是累積計數回繞,沒有撤回先前宣告的空間。

正常傳送後,Ack 與 UpdateFC 各改變什麼?

這筆新 TLP 通過 FC 檢查時,只消耗一次 1 PH、2 PD。PH 的已消耗計數成為 FFh,PD 從 FFEh 加 2 後回繞成 000h,可用額度剩 1 PH、0 PD。稍後收到有效 Ack,傳送端可釋放被確認的重送副本,但 FC 計數不會因此改變。

Ack 與 UpdateFC 各自更新不同的傳送端狀態Update A 提供額度後送出一筆 Memory Write;Ack 確認該筆傳輸,Update B 再回報新接收空間。這是示範順序,不規定 Ack 和 UpdateFC 的普遍先後。Root Port00:01.0Endpoint01:00.0Update A: HdrFC=00h / DataFC=000h20-byte Memory Write: 1 PH + 2 PD涵蓋這筆 TLP 的有效 Ack可釋放這筆重送副本FC 計數保持不變接收端釋放對應空間回報新增 1 PH + 2 PDUpdate B: HdrFC=01h / DataFC=002h傳送端可用額度恢復為 2 PH / 2 PD
作者建立的正常傳輸時序,縱向距離不代表時間長度。本例選擇先收到 Ack、後收到 Update B;兩種回報機制沒有這項固定先後要求。Posted Memory Write 沒有一般 Completion。

接收端處理資料並釋放對應空間後,先增加自己的 CREDITS_ALLOCATED,再以 Update B 回報。傳送端收到有效更新,才把最新上限換成 PH=01h、PD=002h,重新得到 2 PH、2 PD。這仍只證明接收緩衝的額度已回報;§2.6.1.1 明確禁止把 credit 返回解讀為交易已完成或已達到系統可見。

UpdateFC 為零,和 Infinite Credit 如何區分?

本例的有限額度,已由初始化時的 08h/008h 確立;後來的零值按累積計數解讀。Infinite Credit 則是在初始化時用特定編碼宣告的另一種狀態。傳送端對已宣告為 Infinite 的那一類資源,不再因該類 credit 不足而阻擋;它仍須遵守其他傳送條件,也不代表接收端真的有無限實體緩衝。

規格串接:Table 2-46 Minimum Initial Flow Control Advertisements,pp.238–239;§2.6.1,pp.240–241;§2.6.1.1 FC Information Tracked by Transmitter,pp.242–246,Equation 2-1 CREDITS_CONSUMED、Equations 2-10/2-11 的傳送檢查;§2.6.1.2 FC Information Tracked by Receiver,pp.246–247;§3.5,pp.280–281,Figure 3-11 Data Link Layer Packet Format for UpdateFC,p.284。文件頁與 PDF 頁相同。

如果中間發生 Replay,要再扣一次 credit 嗎?

不需要。若把前面的正常流程改成「第一次傳送未通過 LCRC 檢查,收到 Nak 後重送」,重送的是 Retry Buffer 中同一筆 TLP。它已經通過一次 FC 檢查;§2.6 說明,流量控制計帳不會因 Data Link Layer 重複傳送而再記一次。

LCRC
Link Cyclic Redundancy Check,鏈結循環冗餘檢查

因此,在這個額外情境中,重送本身不會改變 CREDITS_CONSUMED,仍為 PH=FFh、PD=000h;如果同時收到有效 UpdateFC,CREDIT_LIMIT 仍依回報更新。不會因為重送而多扣第二份 1 PH、2 PD。§3.6.2.1 也說明,Retry Buffer 的內容都已由傳送端的 FC 邏輯配置接收空間,不需要再次同步額度。若上層重新產生一筆新的寫入,那才是另一筆 TLP,須重新檢查並消耗額度。

Ack 與 UpdateFC 同樣不能代替 Completion。前例是 Posted Memory Write,原本就沒有一般 Completion;若改追蹤 Memory Read,要求使用 NPH,回程 Completion 則在反方向檢查 CplH/CplD,並由 Requester 依 Requester ID、Tag、Status 與資料範圍確認交易結果。配對與完整回覆的帶讀見 Chapter 5;Replay 的詳細規則見 Chapter 8。

LCRC(Link Cyclic Redundancy Check,鏈結循環冗餘檢查)與序號保護相鄰 Link。ECRC(End-to-End CRC,端到端循環冗餘檢查)則補上經過中間元件時的完整性檢查;其產生與檢查仍有支援、啟用條件。Data Poisoning 是標示資料已知不可靠的資訊,並不修復資料。這些機制與接收端緩衝額度各有責任,不能互相代替。

規格閱讀:§2.6,p.236;§3.6.2 LCRC, Sequence Number, and Retry Management (TLP Transmitter),p.288;§3.6.2.1,pp.293–294;§3.6.2.2 Handling of Received DLLPs (Non-Flit Mode),pp.297–298;§3.6.3 LCRC and Sequence Number (TLP Receiver) (Non-Flit Mode),pp.300–301;§2.7 End-to-End Data Integrity,p.252。

換成 Scaled FC 或 Flit Mode,要重新選哪些規則?

Scaled FC(Scaled Flow Control,以比例擴充額度表示的流量控制)先經 Data Link Feature Exchange 判斷是否啟用,再用初始化取得的 HdrScale/DataScale 解讀。Table 2-47 會隨比例改變有效計數寬度,不能繼續固定使用本例的 8-bit/12-bit 取模。

Flit Mode 還加入 Shared FC 與專用 credit,Shared Credit 是否與 Completion 合併、連續 TLP 的計帳粒度,以及使用哪組傳送檢查,都有額外規則。傳送一個 Flit,不等同於固定消耗一個 credit。

傳輸保護也要換成 Flit 層的 CRC、FEC(Forward Error Correction,前向錯誤更正)與 Replay。§3.1 將 Flit 的鏈結 CRC 稱為 LCRC;§3.6.2.3(p.300)明確說明 Flit Mode 不使用 Ack/Nak DLLP。因此本例兩條回報箭頭的封包格式,不能原樣搬進 Flit Trace。完整 Flit 承載與保護方式接到 Chapter 18。

DLLP
Data Link Layer Packet,資料鏈結層封包

規格閱讀:§3.3 Data Link Feature Exchange,pp.268–269;Table 2-47,p.241;§2.6,pp.235–236;§2.6.1,pp.241–242;§3.1 Data Link Layer Overview,pp.263–264;§3.6.2.3,p.300。

Flit Mode 怎麼指出這筆 TLP 使用哪一類 credit?

先確認 Link 正以 Flit Mode 運作,再看 §2.2.10.3 的 Figure 2-77。Flit Mode Local TLP Prefix 是附在 TLP 前面的 4-byte 欄位;它的 byte 0 是 8Dh,byte 1 的 bit 7 是 TLP Uses Dedicated Credits(此 TLP 使用專用額度)。這個 Prefix 只允許用在 Flit Mode。

【模擬資料】以下資料為教學用途建立,不代表特定硬體或平台。假設這條 Link 已啟用 Shared FC(共享流量控制),下列是三筆獨立 TLP 的不同狀況;每筆仍要依自身類型、長度與當時可用額度通過 Flow Control 檢查。

手機閱讀時,表格可以左右滑動。

Local Prefixbit 7此 TLP 使用的額度
8D 80 00 001專用 credit
8D 00 00 000共享 credit
沒有這個 Prefix無共享 credit

這兩個 Prefix 範例中的其他位元均為 0,並非指定所有 TLP 都要附上 Prefix。規格容許在 Flit Mode 的 TLP 使用它,但強烈建議只附在明確需要它的 TLP 上。§2.6.1 另外容許傳送端即使有足夠共享 credit,仍選擇使用專用 credit;選用時應以 Prefix 的 bit 7 表示。

若這個 Prefix 被加到 Non-Flit TLP,便是錯誤。對支援 Flit Mode 的元件,規格要求視為 Malformed TLP;對不支援 Flit Mode 的元件,這項處理是強烈建議。這裡的條件是元件是否支援 Flit Mode,與觀察當下 Link 是否處於該模式是兩個不同問題。

規格閱讀:Base 6.0 §2.2.10.3、Figure 2-77,文件頁/PDF 頁 200–201;§2.6.1,p.236;MUST@FLIT 的定義見 Terms and Acronyms,p.88。Non-Flit Prefix 的判讀另見 Chapter 14。

接收端空間已釋放,發送端為什麼仍在等待?

先把時間線拆成三段:接收端處理 TLP 並增加 CREDITS_ALLOCATED、安排並送出 UpdateFC、傳送端收到有效更新並改變 CREDIT_LIMIT。第一段已完成時,後兩段可能還在進行;如果 DLLP 的完整性檢查失敗,這次更新也不會生效。

讀 §2.6.1.2 的 Non-Flit Mode Flow Control Update Latency 說明時,留意量測起訖:從接收端釋放緩衝,到對應 UpdateFC 的第一個 Symbol 送出。Tables 2-48–2-50 給的是建議延遲,不包含之後跨 Link 傳輸及對端處理的全部時間。另有必須安排更新的條件與週期性更新規則,要分開查閱。

Appendix H 解釋這些延遲值的推導,但明確標為資訊性。若本例的 PD 長時間維持零,先沿這三段確認更新停在哪裡;如果其實是 Replay、排序或仲裁在等待,就回到相應機制,不把所有停頓都歸給 credit。

規格閱讀:§2.6.1.2 FC Information Tracked by Receiver,pp.246–249;Non-Flit Mode Flow Control Update Latency 的 Implementation Note,pp.251–252;§3.5,p.281;Appendix H Flow Control Update Latency and ACK Update Latency Calculations、§H.1 Flow Control Update Latency,pp.1581–1582。

版本與來源

本章依 PCI Express Base Specification Revision 6.0(6.0-1.0-PUB)撰寫,文件印刷頁與 PDF 檢視器頁碼相同。計數、配置與時序圖由作者依規則建立,不是實機量測。本輪集中帶讀有限、未縮放的 Non-Flit Posted credit;完整 Scaled/Shared FC、全部 Replay 規則及 Appendix H 公式仍須深入。

完整來源定位與用途
  • §3.2 Data Link Control and Management State Machine、§3.2.1 Data Link Control and Management State Machine Rules,pp.264–267;Figure 3-2,p.265;§3.4 Flow Control Initialization Protocol、§3.4.1 Flow Control Initialization State Machine Rules,pp.270–273:DL_Up 與 FC 初始化完成的差別。
  • §2.6 Ordering and Receive Buffer Flow Control,pp.235–236;Figure 2-89 Relationship Between Requester and Ultimate Completer,p.235;§2.6.1 Flow Control (FC) Rules,Tables 2-44 Flow Control Credit Types/2-45 TLP Flow Control Credit Consumption,p.237;Table 2-46 Minimum Initial Flow Control Advertisements,pp.238–240:分類、單位、最小初始額度與逐 Link 範圍。
  • §2.6.1,pp.240–241;Table 2-47 [Field Size] Values,p.241;§2.6.1.1 FC Information Tracked by Transmitter,pp.242–246;Equation 2-1 CREDITS_CONSUMED,p.242;Equation 2-10 CUMULATIVE_CREDITS_REQUIRED,p.245;Equation 2-11 Transmitter Gate,p.246:計數寬度、回繞、有限與 Infinite 額度、傳送條件。
  • §2.6.1.2 FC Information Tracked by Receiver,pp.246–249;Equation 2-12 CREDITS_ALLOCATED,p.247:釋放與回報;Non-Flit Mode Flow Control Update Latency 的 Implementation Note 及 Tables 2-48–2-50,pp.251–252:更新延遲的起訖與建議值。
  • §3.5 Data Link Layer Packets (DLLPs),pp.280–281;Figure 3-11 Data Link Layer Packet Format for UpdateFC,p.284:VC、HdrFC、DataFC 與更新有效性。
  • §3.6.2 LCRC, Sequence Number, and Retry Management (TLP Transmitter),p.288;§3.6.2.1,pp.293–294;§3.6.2.2 Handling of Received DLLPs (Non-Flit Mode),pp.297–298;§3.6.3 LCRC and Sequence Number (TLP Receiver) (Non-Flit Mode),pp.300–301:重送緩衝、Ack 與不重複消耗 credit。
  • §2.7 End-to-End Data Integrity,p.252;§3.1 Data Link Layer Overview,pp.263–264;§3.3 Data Link Feature Exchange,pp.268–269;§3.6.2.3,p.300:完整性、功能與模式邊界。
  • Appendix H Flow Control Update Latency and ACK Update Latency Calculations、§H.1 Flow Control Update Latency,pp.1581–1582:資訊性推導的範圍。