2022年4月10日 星期日

原理PCI Express - LTSSM Equalization狀態機推演

在之前,我撰寫了一篇簡介PCI Express: Link Training and Status State Machine( LTSSM 狀態 )介紹有關LTSSM中各個state的作用和另外一篇原理PCI Express - LTSSM 狀態機推演 "Detect -> Polling -> Configuration -> L0推演了LTSSM如何從Detect state轉移到L0 state。接下來這篇文章,將會介紹Equalization的作用、規則、升速和LTSSM的推演。


■ 前言

PCIe spec當中有幾個名詞需要特別解釋一下,如Figure 1Upstream Component為上游的deviceDownstream Component為下游的device,而在Upstream Component下面所連接出去的port稱之為Downstream Port(DP)Downstream Component上面所連接出去的port稱之為Upstream Port(UP),所以在spec中提到的Downstream Port所指的是Upstream ComponentUpstream Port所指的是Downstream Component這點要特別注意。

Figure 1


■ PCIe傳輸原理

在說明Equalization之前,要先提到Physical Layer的傳輸原理,PCIe使用D+D-兩根訊號線來傳輸,也就是所謂的差分信號(Differential Signal),如下圖所示,紅色線為D+,藍色線為D-,當D+電壓大於D-時表示為1,當D+小D-表示為0


Figure 2

由於PCIe通道傳輸的特性,會有所謂的碼間干擾(Inter-Symbol InterferenceISI),舉圖3例子來說,當傳輸端的Tx傳送了一組111101111的資料,由於電容充放電的特性會致使這個1->0無法快速的達到該有的準位,因此接收端的Rx無法辨識這個"0"的訊號,也就是眼圖縮小(eye closed)。

Figure 3


隨著PCIe頻率越來越高,這個問題會更加明顯,因此可以用De-emphasis來解決這個問題,如圖4所示,可以透過在連續的1之中,降低電壓位階,目的是為了讓1->0時的極性反轉,可以達到該有的準位,達到eye open的狀態,才能使"0"被正常辨識。

Figure 4


上述所提到De-emphasis,主要是應用相同連續符號的第一個bit,例如0111 or 1000的紅色部分,但是如果在連續符號的De-emphasis情況下遇到符號反轉(1->0 or 0->1),必須在連續符號的最後一個bit增強訊號,以至於之後的De-emphasis電壓不會越來越低,這個方法稱作Pre-shoot,例如0001 or 11110的紅色部分。

根據spec的定義(如圖5):
  • De-emphasis的程度為Vb/Va取log,單位為db,由於Vb小於Va,所以db值會是負數,所以是衰減。
  • Pre-shoot則是Vc/Vb取log,單位為db,由於Vc大於Vb所以db值會是正數,所以是增強。
  • Boost的技術是為了處理符號快速變化的情況,例如010 or 101這種資料,會在中間紅色的符號增強訊號,如圖5,Boost的定義為Vd/Vb取log。
Figure 5


接下來進入正題,Equalization基本上就是調節各種情況的電壓,來避免碼間干擾,以至於可以得到一個好的眼圖。Spec中提到Tx端的Equalization會使用FIR Filter,Rx端則是使用CTLEDFE

■ Tx Equalization
Tx端的FIR(Finite Impulse Response) filter,主要有三個可調的參數,分別為Pre-cursor(C-1)、Cursor(C0)和Post-cursor(C+1),如圖6所示,這三個cursor參數會影響電壓的輸出 v_out,因而達到校正的目的。Pre-cursor (Vc)主要影響Pre-shootPost-cursor (Vb) 主要影響 De-emphasis

Figure 6

接著spec定義了兩種調整Tx Equalization的方式,分別是PresetCursor coefficient,Preset為粗略調整,可以透過圖7中的table得知Preset和Preshoot、De-emphasis、Pre-curosr、Post-cursor之間的關係。
Figure 7

如果是透過Cursor的方法,則必須符合圖8中的公式。FS為Full Swing,其值介於24到63之間,LF為Low Frequency,意指Tx可以產生的最小differential voltage,其值為Vmin=Vmax * (LF/FS)

Figure 8

■ Rx Equalization

Rx端的Equalization則是使用CTLE(Continuous Time Linear Equalizer)和DFE(Decision Feedback Equalizer)(圖9),但由於LTSSM Equalization中並不會使用到CTLE和DFE的參數,因此不做介紹。

Figure 9

■ Link Equalization介紹

根據上述的描述Equalization(EQ)主要就是為了調整Tx和Rx的設置來改善信號品質,如果是Gen3以上的速度則必須執行EQ程序。

EQ主要可以分為兩種方式
  1. Autonomous mechanism: 如果雙方(DP & UP)在link negotiation過程中,透過Training Sequence(TS1/TS2)宣稱自己有support Gen3以上的link speed,則會自動的執行EQ的流程
  2. Software based mechanism: 可以透過以下三個步驟來retrain link,但software必須確保沒有side-effect,例如NVME SSD沒有在執行I/O read/write
    (1) Write 1b to the Perform Equalization bit in the Link Control 3 register
    (2) Write 8 GT/s target speed to the Target Link Speed field in the Link Control 2 register
    (3) Write 1b to the Retrain Link bit in the Link Control register

EQ Procedure主要有4個Phase(圖9),且會使用Training Sequence裡的Symbol6中的Equalization Control(EC)欄位來告知對方目前自己處於哪一個Phase。

● Phase 0:
在進入Phase0之前,DP會在Recovery.RcvrCfg以8b/10b(2.5G/5GT/s)的方式傳送EQ TS2給UP,且在EQ TS2中會包含兩個值,分別為Transmitter(Tx) Preset值和Receiver(Rx) Preset Hint,而這兩個值是從DP本身的Equalization Control Register中的"Upstream Port Transmitter Preset"和"Upstream Port Receiver Preset Hint"欄位取得,意思就是說DP擁有主導權決定UP在Phase0使用什麼preset值
一開始UP會處於Phase0並開始使用上述DP所給的Tx Preset和Rx Preset Hint發出TS1。


● Phase 1:
雙方會以8.0 GT/s data rate開始交換TS1,並且要保證Bit Error Rate(BER)低於10-4 ,才能進入Phase2。DP會開始傳送EC=01b的TS1,和Phase0有點不相同的是,TS1中會帶有Equalization Control register中的Downstream Port Transmitter PresetDownstream Port Receiver Preset Hint欄位的值,同時DP也會確保可以接收到來自UP的TS order sets後才會進入Phase2。
UP會開始傳送EC=01b的TS1,並且調整自己的Rx來確保EQ process可以順利進行,接收到一定數量的TS1後,隨即進入Phase2


● Phase 2:
在此Phase,UP會開始使用不同的Preset值(或Coefficient)的TS1微調DP的Tx,也就是強迫DP使用UP所給予的語調說話,其實UP暗地裡也同時也在調整自己的Rx,並且確保自己的Rx BER小於10-12 ,並且會由UP傳送EC=11b的TS1來領導進入Phase3。


● Phase 3:
在Phase3,相反於Phase2,DP會開始使用不同的Preset值(或Coefficient)的TS1微調UP的Tx,並且確保自己的Rx BER小於10-12 ,並且由DP傳送EC=00b的TS1來結束整個Equalization Procedure。

Figure 9


■ Equalization Procedure LTSSM推演

根據上次原理PCI Express - LTSSM 狀態機推演 "Detect -> Polling -> Configuration -> L0"這篇文章,推演了雙方如何從Detect state轉移到L0 state,接下來將會推演,當雙方都支援Gen3 link speed的時候,如何進入L0之後馬上進入Recovery state進行升速和EQ的狀態轉移。

註: 由於以下會描述到一些內部register的設定,因此標註為紫紅色代表內部register(not visible to Software)。


=== 動畫1 ======

● Entry to Recovery.RcvrLock

當雙方以Gen1 speed順利轉移到L0之後,如果雙方都支援大於2.5GT/s的data rate,雙方都會將directed_speed_change(內部register)設為1,並隨即進入Recovery.RcvrLock

DP:
當進入Recovery.RcvrLock,由於directed_speed_change為1,所以DP會開始傳送speed_change(Symbol4[7])為 1 的TS1,並且標記8GT/s data rate(TS1/2中的Symbol4[3:1], Data Rate Identfier)。

UP:
如果在L0期間接收到8個連續的speed_change為1的TS1,將自己的directed_speed_change設為1並隨即進入Recovery.RcvrLock,且和DP相同,開始傳送speed_change為1的TS1,並且標記8GT/s data rate。


=== 動畫2 ======

● Entry to Recovery.RcvrCfg

DP:
當處於Recovery.RcvrLock時,接收到8個連續的TS1 or TS2,且speed_change = DP's directed_speed_change 時,則進入Recovery.RcvrCfg。進入RcvrCfg後,DP會開始傳送EQ TS2,在EQ TS2包含Tx PresetRx Preset Hint(來至於DP's Equalization Control register的"Upstream Port Transmitter Preset"和"Upstream Port Transmitter Preset"欄位),目的是為了讓UP在EQ Phase0的時候使用此Preset值傳送TS1。

UP:
如果UP接收到8個連續的TS1 or TS2speed_change = UP's directed_speed_change時,則進入Recovery.RcvrCfg。進入RcvrCfg後,UP開始傳送TS2。


=== 動畫3 ======

● Entry to Recovery.Speed

DP:
如果在處於RcvrCfg時,收到8個連續的TS2,且(1) 都標記相同的8GT/s Data Rate(2) TS中的Symbol6值都相等(3) speed_change欄位都為1,這時DP會檢查equalization_done_8GT_data_rate 是否為0,如果為0,則將start_equalization_w_preset設置為1表示DP將要開始EQ的行程,然後進入Recovery.Speed。進入Recovery.Speed之後DP會進入Electrical Idle並開始發送EIOS等待UP進入Recovery.Speed


UP:
如果在處於RcvrCfg時,收到8個連續的EQ TS2,且(1) 都標記相同的8GT/s Data Rate,(2) TS中的Symbol6值都相等(3) speed_change欄位都為1,則start_equalization_w_preset設置為1,然後進入Recovery.Speed。進入Recovery.Speed之後UP會進入Electrical Idle並開始發送EIOS

當雙方都進入Electrical Idle,馬上會進入升速8GT/s的過程,且時間為800 ns,當雙方成功升速到8GT/s之後,會設置successful_speed_negotiation為1,並清除directed_speed_change為0。接著會回到RcvrLock state。



=== 動畫4 ======

● Entry to Recovery.Equalization

在進入RcvrLock之後,雙方會馬上進入Recovery.Equalization state,並將
(1)Link Status 2 Register中的"Equalization Phase 1 Successful""Equalization Phase 2 Successful"、"Equalization Phase 3 Successful""Link Equalization Request""Equalization Complete" 清除為0,
(2)Link Control 3 register中的Perform Equalization清除為0,
(3)start_equalization_w_preset 清除為0,
(4)equalization_done_8GT_data_rate設置為1。

DP:
當進入Equalization state後,一開始為Phase1,並且開始傳送TS1,且包含 (1)DP's Tx Preset(from Equalization Control register),(2) EC=01b,(3) 對應於Tx Preset的FS、LF、和Post-cursor(請參考上面的圖7)

UP:
當進入Equalization state後,一開始為Phase0並且開始傳送TS1,且包含 (1) 來至於DP's EQ TS2所給的Tx Preset值,(2) EC=00b,(3) 對應於Tx Preset的Pre-cusor、Cursor和Post-cursor(請參考上面的圖7)


=== 動畫5 ======

● Entry to EQ Phase 1

DP:
仍然處於Phase1。

UP:
當接收到2個連續的TS1且EC=01b時,會將LFFS的值儲存下來,隨即進入Phase1。進入Phase1後會開始傳送TS1且(1) EC=01b,(2) DP所給的FS、LF、和Post-cursor


=== 動畫6 ======

● DP Entry to EQ Phase 2

DP:
當在Phase1接收到2個連續的TS1,且(1) EC=01b,(2) 且DP想要執行Phase2 & Phase3,則設置Equalization Phase 1 Successful為1,且儲存TS1中的LF和FS的值,隨即進入Phase2。進入Phase2後,開始傳送EC=10b的TS1。

UP:
仍然處於Phase1。


=== 動畫7 ======

● UP Entry to EQ Phase 2

UP:
目前處於Phase1,如果接收到2個連續的EC=10b的TS1,會設置Equalization Phase 1 Successful為1,並且進入EQ Phase2。進入Phase2後開始傳送TS1,且(1) EC=10b,(2)新的Preset值或Coefficient,根據Symbol6[7], Use Preset來決定傳送Preset或Coefficient(3) 對應於Tx Preset值的Pre-cusor、Cursor和Post-cursor

DP:
目前處於Phase2,這時候DP的判斷會比較寬鬆,如果接收到2個連續的EC=10b的TS1,且
preset或coefficients都是相同不相同,都會直接改變DP本身的Tx setting,並用此Tx Setting的語調來發送TS1,並且回應相同的preset或coefficients給UP


=== 動畫8 ======

● Entry to EQ Phase3

UP:
目前處於Phase2,當接收到2個連續的TS1,且Tx Preset值或Coefficients相同於UP所要求的,此時這組值會被UP接受,表示UP已經fine-tune到很OK的狀態,隨即進入Phase3。進入Phase3後,UP開始傳送EC=11b的TS1。

DP:
目前處於Phase2,當接收到2個連續的EC=11b的TS1,設置Equalization Phase 2 Successful為1後,隨即進入Phase3。進入Phase3後,換成DP開始微調UP的訊號,DP開始傳送TS1,且(1) EC=11b,(2)新的Preset值或Coefficient。


=== 動畫9 ======

● Entry to EQ Phase3

UP:
目前處於Phase3,這時候UP的判斷會比較寬鬆,如果接收到2個連續的EC=11b的TS1,且
preset或coefficients都是相同或不相同,都會直接改變UP本身的Tx setting,並用此Tx Setting的語調來發送TS1,並且回應相同的preset或coefficients給DP。

DP:
可能會發送新的Preset或coefficients。

=== 動畫10 ======

● Entry to Recovery.RcvrLock

DP:
當DP已經操作在最佳設定後,設置Equalization Phase 3 Successful和 Link Status 2 register中的Equalization Complete bit為1,表示EQ Phase3的結束。並隨即進入RcvrLock傳送EC=00b的TS1來告知UP,EQ Procedure的結束。

UP:
目前處於Phase3,當接收到2個連續的EC=00b的TS1,設置Equalization Phase 3 Successful和 Link Status 2 register中的Equalization Complete bit為1後,進入RcvrLock。


=== 動畫11 ======

● Entry to Recovery.RcvrCfg

目前雙方都處於RcvrLock,當收到8個連續的TS1或TS2,且(1) speed_change = directed_speed_change(都為0),(2) EC=00b後,隨即進入RcvrCfg,並且開始傳送speed_change=0的TS2。


=== 動畫12 ======

● Entry to Recovery.Idle and L0

目前雙方都處於RcvrCfg,如果收到8個連續的speed_change=0的TS2則,雙方都會進入Recovery.Idle,並開始傳送Idle Data

目前雙方都處於Recovery.Idle,如果接收到(1) 8個連續的Idle Data且(2) 自己已經傳送了16個Idle data此時雙方重新回到L0,完成了整個Equalization Procedure




Reference:




6 則留言:

  1. 你好啊...能否跟你交换一下email啊..chenbestdone#vip.qq.com
    有一些问题可以一起讨论一下, 我这边负责ssd controller pcie的.

    回覆刪除
  2. 你的筆記好詳細,感謝分享!!

    回覆刪除
  3. 您好想請問一下
    ● Phase 1時雙方會以8.0 GT/s data rate開始交換TS1
    DP會開始傳送EC=01b的TS1,和Phase0有點不相同的是,TS1中會帶有Equalization Control register中的Downstream Port Transmitter Preset和Downstream Port Receiver Preset Hint欄位的值
    ==> 這部分有點疑惑,TS1在8.0GT/s的時候,好像沒有欄位是可以代表 "Receiver Preset Hint"的,只有代表 Transmitter Preset 的欄位,那在這個狀況下,是如何傳遞 Receiver Preset Hint 的值,還是在這個階段其實是沒有傳遞這個東西的? 謝謝> <

    回覆刪除
  4. 看了一下TS1 Symbol 6運作在8 GT/s 的確沒有Receiver Preset Hint欄位,我的動畫範例也是沒有看到Receiver Preset Hint欄位,但翻了一下spec發現有提到Downstream Port Receiver Preset Hint是可選的(如下),的確是蠻奇怪的

    "The Downstream Port initiates Phase 1 by transmitting TS1 Ordered Sets with EC=01b (indicating Phase 1) to the Upstream Port using the preset values in the Downstream Port Transmitter Preset and, optionally, the Downstream Port Receiver Preset Hint fields of each Lane’s Equalization Control register."

    回覆刪除
  5. 請問未來是否有機會補充Gen3 => Gen4/5 Equalization的機制呢?

    Gen3 Rcvry.Idle => Gen3 Rcvry.RcvrLock => Gen3 Rcvry.RcvrCfg => Gen3 Rcvry.Speed => Gen4 Rcvry.RcvrLock => Gen4 Rcvry.Eq.Phase0 (Up only) => Gen4 Rcvry.Eq.Phase1 => Gen4 Rcvry.Eq.Phase2 => Gen4 Rcvry.Eq.Phase3 => Gen4 Rcvry.RcvrLock => Gen4 Rcvry.RcvrCfg => Gen4 Rcvry.RcvrCfg => Gen4 Rcvry.Idle => Gen4 L0.

    謝謝

    回覆刪除
    回覆
    1. Gen3/4/5 走的equalization都是同樣的路,應該就不用在重複寫了

      刪除

解析 NVM Express - 透過Linux OS 解析M.2 NVMe SSD

在之前,我撰寫了三篇有關NVMe的文章 ,分別是" 原理NVM Express - NVMe Submission Queue & Completion Queue (SQ & CQ) "、" 原理NVM Express - Admi...