前面的文章簡單的介紹了一些關於PCIe匯流排事務層(Transaction Layer)和資料連結層(Data Link Layer)的一些基本概念。 這篇文章來繼續聊一聊PCIe匯流排的最底層——實體層(Physical Layer)。 在PCIe Spec中, 實體層是被分為兩個部分單獨介紹的, 分別是實體層邏輯子層和實體層電氣子層, 其中後者一般都是採用SerDes來實現的。 本篇文章只是簡單地介紹一些PCIe實體層的基本概念, 關於實體層詳細、深入地介紹, 請關注我後續的連載博文。
由於實體層處於PCIe體系結構中的最底層, 所以無論是TLP還是DLLP都必須通過實體層完成收發操作。 來自資料連結層的TLP和DLLP都會被臨時放入實體層的Buffer中,
注:這裡所說的TLP和DLLP指的是包的原始發送者發的包, 即TLP表示這個包的原始發送者為事務層, 而DLLP則為資料連結層。 但是TLP仍然會被資料連結層轉發, 並添加Sequence和LCRC。
實體層完成的一個重要的功能就是8b/10b編碼和解碼(Gen1 & Gen2),
實體層的另一個重要的功能時進行鏈路(Link)的初始化和訓練(Initialization & Training), 且是完全自動的操作, 並不需要人為的干預。 完成鏈路的初始化和訓練之後, 便可以確定當前PCIe設備的一些基本屬性:
· 鏈路的寬度(Link Width, x1還是x2, x4……)
· 鏈路的速率(Link Data Rate)
· Lane Reversal - Lanes connected in reverse order
· Polarity Inversion – Lane polarity connected backward
· Bit Lock Per Lane – Recovering the transmitter clock
· Symbol Lock Per Lane – Finding a recognizable position in the bit-stream
· Lane-to-Lane De-skew Within a Multi-Lane Link
實體層的電氣子層主要實現了差分收發對, 如下圖所示:
由於其速度很高, 因此採用的是交流耦合的方式(AC-Coupled), 說白了就是在信號線上加了電容Ctx, 此時低頻信號和直流信號都會被抑制。
需要注意的是, PCIe實體層處理可以轉發LTP和DLLP之外, 還可以直接發送命令集(Ordered Sets)。 之所以稱其為命令集, 是因為它並不是真正意義上的包(Packet), 因為實體層不會為其添加起始字元(Start & End Characters)。 並且命令集始於發送端的實體層, 結束語接收端的實體層。 雖然命令集沒有起始字元, 但是對於Gen1&Gen2版本的PCIe實體層來說, 會為其添加一個叫做COM的字元作為開始字元,
注:PCIe Gen3及之後的版本處理方式有所不同, 但是Gen3是向前相容Gen1 & Gen2的。 由於本文主要還是基於Gen2來介紹的, 所以關於Gen3的更多資訊, 大家可以自行參考PCIe Gen3 的Spec。
命令集(Ordered Sets)的收發示意圖, 如下圖所示:
命令集(Ordered Sets)的結構圖如下圖所示:
命令集主要用於鏈路的訓練操作(Link Training Process)。 此外, 命令集還用於鏈路進入或者退出低功耗模式的操作。