credit、Ack 和 Completion 各自在哪一步發生?
credit、Ack 和 Completion 各自在哪一步發生?
選擇步驟後,圖中對應的元件與下方解說會加上重點標示。完整圖與所有解說會持續顯示;也可用方向鍵切換步驟。
先追蹤一筆普通非 Flit 傳輸,再分別看確認訊息與空間回報。兩條回報路徑不是固定先後的時序。
作者依 Base 6.0 繪製的教學示意;省略與本章無關的交換。
- TLP
- Transaction Layer Packet,交易層封包
FC(Flow Control,流量控制)確認相鄰接收端有空間;重送機制處理 Link 上的資料傳輸錯誤;Completion(完成回覆)則回到交易本身。這一章把三者放在同一條路徑,從發送前的空間檢查,走到接收、回報與後續處理。
傳送前先確認接收空間
圖中一條 Link 的可用空間,不代表最終目的端已接收或處理這筆交易。
先確認該 VC 已完成 FC_INIT2,再用封包種類找出需要的 Header 與 Data credit。本章以有限額度的累積計數追蹤一筆寫入。
- VC
- Virtual Channel,虛擬通道
Base 6.0 §2.6.1,pp.237、241;§3.4.1,p.273。
在這一條 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。
釋放空間後更新資源
交易是否完成仍依要求種類與完成回覆判讀,不能由一個 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 Request | 1 PH + n PD | 沒有一般 Completion |
| Memory Read Request | 1 NPH | 返回的資料另由 Completion 承載 |
| Completion with Data | 1 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=FFEh | PH=FFh; PD=FFEh | 1 PH / 0 PD |
| 收到 Update A | PH=FEh; PD=FFEh | PH=00h; PD=000h | 2 PH / 2 PD |
| 新 TLP 通過 FC 檢查 | PH=FFh; PD=000h | PH=00h; PD=000h | 1 PH / 0 PD |
| 收到涵蓋本 TLP 的有效 Ack | PH=FFh; PD=000h | PH=00h; PD=000h | 1 PH / 0 PD |
| 收到 Update B | PH=FFh; PD=000h | PH=01h; PD=002h | 2 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 計數不會因此改變。
接收端處理資料並釋放對應空間後,先增加自己的 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 Prefix | bit 7 | 此 TLP 使用的額度 |
|---|---|---|
8D 80 00 00 | 1 | 專用 credit |
8D 00 00 00 | 0 | 共享 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:資訊性推導的範圍。