Flit、編碼與錯誤更正,怎麼放在同一張圖裡?
Flit、編碼與錯誤更正,怎麼放在同一張圖裡?
選擇步驟後,圖中對應的元件與下方解說會加上重點標示。完整圖與所有解說會持續顯示;也可用方向鍵切換步驟。
由上往下看資料包裝層次;這張圖不是接收端逐時脈實作,也不指定一個封包必須佔幾個 Flit。
作者繪製的分層總覽。DLP 是 Data Link Layer Payload(鏈結管理負載),CRC 是 Cyclic Redundancy Check(循環冗餘檢查),ECC 是 Error Correcting Code(錯誤更正碼)。
- TLP
- Transaction Layer Packet,交易層封包
- PAM4
- Pulse Amplitude Modulation with 4 levels,四階脈衝振幅調變
前章已分清 credit、Ack 與交易完成。本章把 TLP(交易層封包)放進 Flit(固定大小的傳輸單元),再沿 Lane 追到接收端。先看正常的配置與檢查,再用 Selective Replay 案例說明 DLP 與 TLP 的不同處理。
先確認速率與模式
較低速率也能使用 Flit 模式,所以不能把 Flit 模式直接當成 64 GT/s 的同義詞。
8b/10b 用於 2.5、5.0 GT/s;128b/130b 用於 8.0、16.0、32.0 GT/s。64.0 GT/s 使用 Flit 模式與 PAM4 訊號。
- PAM4
- Pulse Amplitude Modulation with 4 levels,四階脈衝振幅調變
Base 6.0 §4.2.1、§4.2.2、§4.2.3.1,pp.309、318、340。
拆開固定單元的用途
236 bytes 是 TLP 區域,仍包括交易標頭等開銷,不能全部當成應用資料。
Flit(256-byte 固定傳輸單元)內的 236 bytes 用於 TLP,另有 6 bytes DLP(Data Link Layer Payload,鏈結管理資訊)、8 bytes CRC 與 6 bytes ECC。先讀 §4.2.3.3 的區域,再選符合 Link 寬度的配置表。
Base 6.0 §4.2.3.3,pp.351–356;本章 x4 案例使用 Table 4-12,p.354。
沿編碼與保護規則追到線路
更正能力有限;不能把存在 FEC 解讀成任何損壞都能修好。
- FEC
- Forward Error Correction,前向錯誤更正
PAM4(四階脈衝振幅調變)在 64.0 GT/s 每個訊號間隔表示 2 bits。FEC(Forward Error Correction,前向錯誤更正)先處理可更正錯誤,再以 CRC 檢查;無效 Flit 的後續處理由接收與重送規則決定。
Base 6.0 Figures 4-22、4-23,p.342;§4.2.3.1.1,pp.342–343;§4.2.3.4.2,p.359。
先認出模式,再選線路編碼
64.0 GT/s 使用 PAM4(Pulse Amplitude Modulation 4-levels,四階脈衝振幅調變)及 Flit Mode;較低速率也可以使用 Flit Mode。讀 Trace 時,先確認觀察的是哪條 Link、哪個方向、當時的速率和模式,再選對應的解碼方式。
p.309 的模式識別說明可以連回三個位置:PCI Express Capabilities Register 的 Flit Mode Supported 表示支援能力;Link Control Register 的 Flit Mode Disable 是控制;Link Status 2 Register 的 Flit Mode Status 表示 Link 正在或將以 Flit Mode 運作。訓練期間的宣告與成功協商的變數 Flit_Mode_Enabled 也在這裡說明;它們不是同一項資訊。
| 目前速率 | 線路怎麼承載資料 | Flit Mode 下的閱讀重點 |
|---|---|---|
| 2.5、5.0 GT/s | 8b/10b:將 8-bit 資料字元編成 10-bit Symbol | 仍使用此編碼,但不使用傳統 STP、SDP、END、EDB 封包標記 |
| 8.0、16.0、32.0 GT/s | 128b/130b:128-bit 負載加 2-bit 同步標頭 | 保留每 Lane 的 Block 編碼;不使用 Non-Flit Mode 的 Framing Tokens |
| 64.0 GT/s | 1b/1b 與 PAM4,每個訊號間隔表示 2 bits | 使用 Flit Mode;依 Figures 4-22、4-23 追蹤傳送與接收處理 |
這張表把「包成什麼單元」與「線路用什麼方式送」分開。1b/1b 也不表示完全沒有傳輸開銷;Flit 內仍有鏈結管理、檢查碼與更正碼。
Base 6.0 §4.2.1(p.309)、§4.2.2(p.318)、§4.2.3、§4.2.3.1(p.340),Figures 4-22、4-23(p.342)。
從 Flit 的 byte,找到對應的 Lane
先到 §4.2.3.3 讀四個固定區域,再依 Link 寬度選表。以下位移從同一個 Flit 的 byte 0 開始計算;TLP 區域可放多筆 TLP,也可能只有某筆 TLP 的一部分。
| Flit byte 範圍 | 大小 | 用途 |
|---|---|---|
| 0–235 | 236 bytes | TLP 內容,包含標頭、資料及必要的 NOP TLP(空操作封包) |
| 236–241 | 6 bytes | DLP(Data Link Layer Payload,承載鏈結管理資訊),編號 DLP0–DLP5 |
| 242–249 | 8 bytes | CRC(Cyclic Redundancy Check,完整性檢查碼),保護前 242 bytes,不包含 ECC |
| 250–255 | 6 bytes | ECC(Error Correcting Code,更正碼);整個 Flit,包括 CRC,都在 ECC 保護範圍內 |
【模擬資料】以下資料為教學用途建立,不代表特定硬體或平台。觀察一條已建立的 64.0 GT/s x4 Link,Lane 編號採規格中的 Logical Lane,並假設工具已完成 Lane 對齊及解碼。
這次選 Table 4-12,不選 x16 的 Table 4-10。從左到右看 Lane 0–3,再往下一列看後續資料:byte 0–3 分別在 Lane 0–3,byte 4 回到 Lane 0。下表挑出幾個位置,示範如何一路找到管理與保護區域。
| Flit byte | 內容 | Logical Lane | 同組位置如何確認 |
|---|---|---|---|
| 236 | DLP0 | 0 | 236–239 這一組依序放 DLP0–DLP3 |
| 237 | DLP1 | 1 | 緊接在 DLP0 的相鄰 Lane |
| 242 | CRC0 | 2 | 240、241 仍是 DLP4、DLP5 |
| 250 | ECC1[0] | 2 | 248、249 先放 CRC6、CRC7 |
| 252 | ECC0[0] | 0 | 最後一組依序為 ECC0[0]、ECC1[1]、ECC2[1]、ECC0[1] |
查表時同時保留「內容名稱」和「位置」。例如最後 6 bytes 是 ECC 區域,但它們依 ECC1、ECC2、ECC0 的順序交錯放置,不能把 byte 250 直接叫作 ECC0[0]。這裡只追資料位置,沒有用表格列數推算訓練或協定等待時間。
接著翻到 Table 4-15,從表內第一段延續的 TLP 19 開始,依 Hdr 與 Data 標示追到後續 TLP,再找 NOP。這張表用具體配置說明:一個 Flit 可以承接前一個 Flit 的 TLP,後面再放新的 TLP。沒有 TLP 可送時,§4.2.3.4.1 規定使用 NOP TLP(不承載交易內容的空操作封包),且有對齊與 Packing 限制;不能把未使用位置當成任意填充。
作者算例:TLP 區域比例為 236/256=92.1875%,但其中還有 TLP 標頭與 NOP,並非應用資料比例。效能估算另見 Chapter 37;本章先把傳輸單元看清楚。
Base 6.0 §4.2.3.3(pp.351–352);Table 4-12 Flit interleaving in a x4 Link(p.354);§4.2.3.4.1(p.357)、Table 4-15 Example TLP Placement in Flit Mode on a x16 Link(pp.358–359)。
正常接收時,FEC 與 CRC 怎麼接力?
PAM4(每個訊號間隔以四階電壓表示 2 bits)提高每個訊號間隔可表達的資訊量,但較小的眼高與眼寬使錯誤更容易發生。FEC(Forward Error Correction,前向錯誤更正)先嘗試更正,再用 Flit CRC 檢查;兩者負責的工作不同。
把 Figure 4-22 與 Figure 4-23 放在一起讀:傳送端先對 236-byte TLP 區域加 6-byte DLP 產生 8-byte CRC,再產生 ECC,然後分配到各 Lane。接收端先完成適用的 Lane 解碼與解擾,把資料合回 Flit,接著做 FEC 解碼/更正,最後檢查 CRC。圖中的寬度是概念示意,並沒有要求硬體使用相同內部資料寬度。
沿用前面的 x4 情境,假設某次接收出現一個可更正的 byte 錯誤;FEC 更正後沒有 ECC group 回報不可更正,CRC 也通過,Flit Usage 與 Flit_Status 均為合法值。依 §4.2.3.4.2,這是有效 Flit。接收端仍須依序號、重送狀態與 TLP 格式處理,才能把適當的 TLP 內容交給上層;CRC 通過本身沒有證明 Request 已完成。
Table 4-12 的顏色代表三個 ECC groups,不是三條 Lane。每個 group 可更正一個 byte 錯誤;錯誤分布到哪個 group,會影響能否更正。因此,不能只數整個 Flit 有幾個錯誤 byte,就宣稱都在更正能力內。若 CRC 失敗或某個 group 回報不可更正,Flit 不符合有效條件,後續要依接收與 Replay 規則處理。
Base 6.0 §4.2.3.1、Figures 4-22 Transmit side at 64.0 GT/s、4-23 Receive side at 64.0 GT/s(pp.341–342);§4.2.3.1.1(pp.342–343);§4.2.3.4.2(p.359)、§4.2.3.4.3–4.2.3.4.4(pp.384–385)。
收到 Nak 後,重送的 Flit 要逐 byte 相同嗎?
TLP 內容會重送,DLP 則使用當下的管理資訊。§4.2.3.3 明確說明,DLP 不進入 Link Layer Retry Buffer;重送時重新帶入最新 DLP。由於 CRC 包含 DLP,傳送端也要對這次的內容重新產生 CRC 與 ECC。
【模擬資料】以下資料為教學用途建立,不代表特定硬體或平台。同一條 64.0 GT/s x4 Link 的兩端為 Root Port 00:01.0 與 Endpoint 01:00.0,已進入 Normal Flit Exchange Phase,Data Link 與 Flow Control 初始化均已完成。以下只摘錄幾個事件,不是連續的完整 Trace。
先讀送出的 DLP,確認序號在說哪個方向
Root Port 送出 Payload Flit,Explicit Sequence Number 為 12Ah。Root Port 在資料進入通道前,保存的 DLP0–DLP5 為 51 2A 80 00 00 00;假設此前送出的是 NOP Flit,因此 Prior Flit was Payload 為零。這是傳送端原始內容,後續若接收 CRC 失敗,不能改拿接收端受損的 DLP 作可靠依據。
| 依 Table 4-17/4-19 查的欄位 | 從本例讀到的值 | 對本次解讀的用途 |
|---|---|---|
| DLP0[7:6]:Flit Usage | 01b | Payload Flit,TLP 區域含至少一部分非 NOP TLP |
| DLP0[4]:Type of DLLP Payload | 1b | 繼續看 DLP2[7],判斷是 Optimized_Update_FC 或 Flit_Marker |
| DLP0[3:2]:Replay Command | 00b | 這次序號明確識別正在傳送的 Flit |
| {DLP0[1:0], DLP1[7:0]}:Flit Sequence Number | (1h << 8) | 2Ah = 12Ah | 要接合高 2 bits 與低 8 bits,不能只讀 DLP1 |
| DLP2–DLP5:Flit_Marker | 80000000h | bit31=1 選 Flit_Marker;Flit_Status=00b,本例沒有以此標示 Nullified 或 Poisoned |
- DLLP
- Data Link Layer Packet,資料鏈結層封包
再讀反方向的 Selective Nak
Endpoint 收到該 Flit 時,FEC 處理後的 CRC 仍失敗。假設後續接收資訊足以確認受損者為 Payload Flit,Endpoint 有足夠的 RX Retry Buffer 保存後續資料,並選用 Selective Nak(只要求重送指定 Flit 的通知)。其中一個有效的反方向 NOP Flit 帶有 1D 29 80 00 00 00;本例該方向前一個 Flit 也是 NOP,因此 Prior Flit was Payload 為零。
同樣從 DLP0[3:2] 開始讀,這次是 Replay Command=11b,所以序號 129h 表示最後有效接收的 Flit,要求重送的是 129h + 1 = 12Ah。這個值指向 Root Port → Endpoint 的資料,不是反方向 NOP Flit 自己新取得的序號。若 Replay Command 為 10b,則是 Standard Nak,要求重送所有尚未確認的 Flit;不能將兩者套成相同的單筆重送。
| 方向與擷取位置 | DLP0–DLP5 | Replay Command | 序號欄位 | 序號在本列的意義 |
|---|---|---|---|---|
| Root Port → Endpoint,傳送前 | 51 2A 80 00 00 00 | 00b | 12Ah | 目前送出的 Payload Flit |
| Endpoint → Root Port,有效接收 | 1D 29 80 00 00 00 | 11b | 129h | 要求重送 12Ah |
最後比對重送內容與接收結果
Root Port 依 Replay 排程重送 12Ah,TLP 內容取自 TX Retry Buffer,DLP 則反映目前資訊。當重送以 Explicit Sequence Number 送出時,仍使用 Retry Buffer 內的 12Ah。Endpoint 通過有效性與序號檢查後,再按接收順序處理暫存與重送的內容,避免把重送當成新交易交付。
這段摘錄省略了排程等待、其他 Flit,以及連續的 Nak。§4.2.3.4.2.1.3 對 Normal Flit Exchange Phase 的 Nak 有至少連續送三個的要求及例外;不能把圖中的單支 Nak 箭頭理解成完整線路時序。Figure 4-33 的完整範例可接著帶讀:先看單一 Payload Flit 受損時選擇性重送的路徑,再看後段多個連續無效 Flit 轉用 Standard Nak 的情境。
若本例重送成功,Endpoint 就能取得原先需要重送的 TLP 內容;是否還需要 Completion,以及整筆 Transaction 的結果,則要依該 TLP 的種類繼續分析。TLP 格式與 Request/Completion 判讀分別連回 Chapter 14、Chapter 5,本章不重複解釋整筆交易。
Base 6.0 §4.2.3.3(p.352);Figure 4-29 DLP Byte to Bit Number Assignment(p.359)、Figure 4-30 DLP Bit usage、Tables 4-16 Flit Types、4-17 DLP Bytes in the Flit(pp.360–361)、Table 4-19 Flit_Marker(p.362);§4.2.3.4.2.1.3–4.2.3.4.2.1.7(pp.370–383),Figure 4-33 Flit Ack/Nak/Replay Example(p.383)。
需要核對演算法時,才往附錄走
如果目前只要解讀上面的 Flit,讀完配置、DLP 與接收規則即可。需要核對編碼器、解碼器或檢查碼的輸出時,再依目的找附錄,避免一次把不同層的演算法混在一起。
| 現在要核對什麼 | 查哪裡 | 要保留的條件 |
|---|---|---|
| 2.5/5.0 GT/s 的資料字元編碼 | Appendix B,Table B-1 8b/10b Data Symbol Codes(p.1531 起) | 先確認 byte,再依 Running Disparity(逐 Lane 累積的不平衡狀態)選代碼;這不是 64.0 GT/s 的編碼表 |
| 8b/10b 的擾碼輸出 | §C.1 8b/10b Data Scrambling Example(p.1541) | 範例實作可替換,但輸出須相同;不能套用成所有速率的擾碼器 |
| Flit 的 ECC 編解碼 | §4.2.3.4.4 與 Appendix J(p.1595);§J.2 84 Byte to 86 Byte Encoder(p.1607) | 先依 interleaving 分組,再核對 check/parity;可以使用不同內部管線,結果仍須符合參考輸出 |
| Flit 的 8-byte CRC | §4.2.3.4.3 與 Appendix K MATLAB created generator matrix for CRC code(p.1619) | 輸入是 TLP 與 DLP 合計 242 bytes;矩陣與位元排列必須一致 |
版本與來源
本章以 PCI Express Base Specification Revision 6.0(6.0-1.0-PUB)為準;上述引用的文件印刷頁碼與 PDF 檢視器頁碼相同。自行建立的讀值、拓撲與事件摘錄已在案例旁標示。
本章完整閱讀位置
- §4.2.1 8b/10b Encoding for 2.5 GT/s and 5.0 GT/s Data Rates(p.309);§4.2.2 128b/130b Encoding for 8.0 GT/s, 16.0 GT/s, and 32.0 GT/s Data Rates(p.318);§4.2.3 Flit Mode Operation、§4.2.3.1 1b/1b Encoding for 64.0 GT/s and higher Data Rates(p.340)。
- Figures 4-22、4-23(p.342)帶讀先後處理;§4.2.3.1.1 PAM4 Signaling 與 Figure 4-24(pp.342–343)說明訊號與錯誤背景。
- §4.2.3.3 Data Stream in Flit Mode(pp.351–352);Tables 4-10–4-14(pp.352–356)依 x16/x8/x4/x2/x1 分別排列;本例主要讀 Table 4-12(p.354)。
- §4.2.3.4.1 TLP Bytes in Flit、Table 4-15(pp.357–359);§4.2.3.4.2 DLP Bytes in Flit、Figures 4-29–4-30、Tables 4-16–4-17、4-19(pp.359–362)。
- §4.2.3.4.2.1.3 Normal Flit Exchange Phase(pp.370–372)、§4.2.3.4.2.1.4 Received Ack and Nak Processing(p.372)、§4.2.3.4.2.1.5 Ack, Nak, and Discard Rules(pp.373–378)、§4.2.3.4.2.1.6 Flit Replay Scheduling(pp.378–379)、§4.2.3.4.2.1.7 Flit Replay Transmit Rules(pp.380–383,含 Figure 4-33 範例)。
- §4.2.3.4.3 CRC Bytes in Flit(pp.384–385)、§4.2.3.4.4 ECC Bytes in Flit(p.385 起);附錄 B、C.1、J、J.2、K 的用途見前節對照表。