GIO介面(圖1)的應用有多大衝擊?從很多簡報或網路上的訊息可以得知,3GIO技術面的規範,雄心霸圖跨及桌上型電腦、筆記型電腦、伺服器平台(圖2),甚至通信應用的範疇,而NEWCARD(官方的正式名稱為Express Card)以及PCI Express Mini Card(或者稱為Mini PCI Express)的陸續底定,已完全證實這種說法。
3GIO介面(圖1)的應用有多大衝擊?從很多簡報或網路上的訊息可以得知,3GIO技術面的規範,雄心霸圖跨及桌上型電腦、筆記型電腦、伺服器平台(圖2),甚至通信應用的範疇,而NEWCARD (官方的正式名稱為Express Card)以及PCI Express Mini Card(或者稱為Mini PCI Express)的陸續底定,已完全證實這種說法。從ICH6的技術資料,已經透露出一些訊息,將3GIO做進晶片組應該是確定。訂定遊戲規則的強者,既然招式已出,剩下來的是其他各路英雄角逐者該如何來接招?
很明顯地,AGP 8x可能是AGP的末代武士,其後裔被內定為3GIO x16,會不會陰溝裡翻船,有意外的演出,誰能保證呢?至於末端來取代PCI,則不用懷疑。
在筆記型電腦部份,目標當然就是行之多年的PCMCIA(Cardbus)與問世才不久的「Mini PCI」。而3GIO又會不會如同USB 2.0一般,造成一股旋風,關鍵性的因素還是在於殺手級應用是否能即時現身與軟體的支援是否如其所言;當然,隨插即用(Plug-and-Play)的實踐能力為何,絕對會是決定性的一股勢力。而殺雞焉用牛刀,才是3GIO難以參透領悟之處。
資料連結層(Data Link layer)(圖3)居於資料交易層與實體層之間的中間地帶,其所擔當工作角色的重要性,就是要將TLP封包的傳遞,做到牢不可破的境界。而此三層的重要性次第,可說是平分天下。
簡單扼要地說,資料連結層(Data Link layer)所肩負的職責,不外乎下面幾件要事:
就資料整合度(Data Integrity)這項參數的檢視來探討,無論是DLLP封包或是TLP封包均是採用CRC的機制,箇中的差異在於DLLP封包採用16位元CRC,而 TLP封包卻是運用32位元的LCRC;而且,TLP封包冠上順序編號(Sequence Number),如此一來,在傳輸的歷程當中,如果有封包遺漏的現象,馬上一目了然。
那USB介面是運用怎樣的辦法,來辨別是否有資料封包的遺漏呢?
資料連結之控制與管理的狀態機器DLCMSM (Data Link Control and Management State Machine)(圖4)就是實質上資料連結的細部流程遷移變化。從最外面的表層觀之,資料連結的控制與管理就是3種狀態的遷徙關係。該3種狀態的個別含意摘要如下:
上述之3種狀態,分別有其一些原則的存在。比如說「DL_Inactive」無論是那一種重置(Reset)發生,都必然進入這個狀態,並會將資料連結層的資訊回復到預設的數值,同時將該層中重丟緩衝器裡頭的內容資訊給清掉。當然,不會產生DLLP封包,也不會接收DLLP封包。如果實體層告知「Physical LinkUp = 1」,就跳進「DL_Init」狀態。
該「DL_Init」狀態,針對預設虛擬通道之流程控制做初始化。當在「FC_INIT1」狀態時是回應「DL_Down」,在「FC_INIT2」狀態時才是回應「DL_Up」,而依然的條件,當實體層告知「Physical LinkUp = 1」時,就跳進「DL_Active」狀態。當然,這是指成功的場合,萬一失敗則會返回到「DL_Inactive」的狀態。
無庸置疑地,「DL_Active」狀態自然就是正常動作下的必然情況:可以傳送、接收TLP封包,產生與接受DLLP封包。如果實體層告知「Physical LinkUp = 0」,表示實體層斷線,就會回到「DL_Inactive」狀態。接下來,我們就針對流程控制初始化的協定做敘述,並請記住在電源投入或是重置之後,都一定要針對預設的虛擬通道(Virtual Channel),也就是VC0,做流程控制的初始化動作。如果有其他的虛擬通道被啟動致能,在被使用之前,也是必要經過流程控制初始化的協定。
而在虛擬通道(Virtual Channel)初始化的過程裡,其實是在進行2個狀態的流程,分別是「FC_INIT1」與「FC_INIT2」的過程處理。如果有違反(圖5)之流程控制初始化協定的事件,就會被看成DLLPE(Data Link Layer Protocol Errors)。至於要不要檢查是選項,操之在您。
DLLP封包是用來處理資料連結時的處理。為了對於DLLP封包有全盤的認知,將之歸類如下:
搞清楚DLLP封包種類之後,即可深入摸索其構造與法則。從得知,有2個重點。一個位元組「DLLP Type」的欄位,由8個位元來組成,就可以解碼成各個DLLP封包,而其所採用的CRC是16位元。
依據規格的定義,目前僅規劃了幾種DLLP的編碼。
圖7「AckNak_Seq_Num」欄位清清楚楚地指明哪一個相互對應到TLP封包。圖8、圖9與圖10中,「InitFC1、InitFC2與 UpdateFC DLLP」3種DLLP封包乃是流程控制專用,而每一個會衍生出(P、NP or Cpl)的樣式。「HdrFC」欄位指定各式各樣標頭的信用空間數值;「DataFC」欄位是指資料承載量之信用空間數值。有關電源管理(圖11)的動作細節會另闢專文來探索。另外,3GIO也埋下一記伏筆,允許製造商定義規範自己用途的DLLP封包。
說到資料整合性(Data Integrity),並不是指電氣上的特性,而是泛指整體層面傳輸協定上的考量。前面提及資料交易層會將TLP封包邊界資訊提供給資料連結層,然後資料連結層會在TLP封包前頭冠上序列號碼(Sequence Number),並在TLP封包的尾巴加上32位元的LCRC位元,作為錯誤偵測的手段,而序列號碼是由12位元數所構成。對於TLP封包的內部內容而言,資料連結層對它不能做任何變動。
不過,一旦在過程中偵測到錯誤,資料連結層會進行重試,依此邏輯推想,勢必要規劃一個重試緩衝器(retry buffer)作為這方面的用途。如果TLP封包重丟又失敗,這時候通常都會將此狀況視為實體層可能出狀況,可能需要重新再建立連結。
而重試緩衝器(retry buffer)的規劃在實踐上是一門學問,如果此緩衝器的空間不足,可能很快就爆滿,傳輸似乎必然受到節流(Throttle)的影響。反之,如果緩衝器太大,徒然付出不必要的成本,也划不來。因此,如何規劃出一個最具有經濟與機能效益的緩衝器空間,所要考量衡諸的因素涉及到ACK的潛伏時間、內部處理延遲時間,還有實體層互連的時間等。
此處有一個略帶奇異的名詞需要特別留意。根據3GIO規範,傳送器是可以修改待傳送TLP,但是目的卻是要去清楚告知接收器,務必要將此TLP封包給丟棄掉。這個動作術語上是以「nullify」the TLP來稱呼。
誠如以前多次的敘述,3GIO的架構是階層式的建構方式圖14,位居最底層的實體層便是使用者實際能夠感受到的地方。介面卡的插拔安裝、連接線的聯繫皆是實體層的職責。
實體層就是大家口中所言的PHY(圖15)。依據3GIO規範的定義,實體層可以分成2個部分,其一是邏輯處理的部位,其二便是電氣特性的處理。兩者的親密關係非比尋常,每一端的收發器(Transceiver)的狀態與控制,就是仰賴上述的2個部位。
PHY第一個要面臨的問題就是3GIO的符號編碼方式(Symbol Encoding)。3GIO乃是沿用所謂的8b/10b傳輸碼,此種傳輸碼與ANSI X3.230-1994、clause 11(或IEEE 802.3z, 36.2.4)完全一致。更精確地說是80年代初期IBM所發明的符號編碼方式。
其表面特徵就是將欲傳送的8個位元,經由特殊處理機制,映射成10個位元而得名。其內在的本質就是將位元0與位元1出現的次數差控制在最小的範圍內,不是5個1、5個0;4個1、6個0;就是6個1、4個0。帶來的好處,就是直流的平衡。
圖16中存在有一個稱之為「Z」的控制位元,最主要的用意乃在於8b/10b符號編碼方式的規範之際,額外地定義了12個特殊的符號作為控制的用途。為了能夠區分控制符號或是資料符號,當然就需要1個位元來掌控。
不知您是否有留意到,尚未轉換的原來8個位元,從MSB朝向LSB開始的順序關係是用「H,G,F,E,D,C,B,A」來表示,一旦經過8b/10b的變換之後,改用「j,h,g,f,i,e,d,c,b,a」來表示。這是當初原來論文中的表現方式分成兩組以方便敘述,其中所增加出來的2個位元,就是「i與j」。詳細的資料映射關係就列在規格中的附錄B裡頭。
由於真正丟到3GIO實體介面上的資料是串列式的方式,因此資料必定歷經所謂「Serialization」與「De-serialization」的步驟。而且,資料往介面上丟的次序是從「a位元」開始,結束在「j位元」。圖17與圖18這2個解說圖能幫助您一目了然。
前面所提及的控制專用符號一般皆是採用「K Code」的稱呼。那控制什麼東西要依據技術規格中做了哪些使用的規範?舉3GIO而論,主要是用來連結管理機制中,作為資料框(Framing)以及連結管理(Link Management)的用途,無論DLLP封包還是TLP封包都會使用到。且將這些控制專用符號做個扼要整理與說明。
歸納一下,符號丟至傳輸通道與資料框(Framing)的應用,離不開2大類。其一是「Ordered sets」的傳送。其二便是TLP封包(圖21)與DLLP封包(圖22)的載送。「Ordered sets」的傳送可以同時出現在多傳輸通道中。
至於資料框(Framing)的機制,就是採用K28.2「SDP」開始DLLP封包。K27.7「STP」開始TLP封包。兩者的終結,皆是採用K29.7「END」的符號。
如果傳輸介面上沒有任何封包或是控制情報(Ordered sets)可供傳送,傳送器就處於定義上的邏輯閒置(Logical Idle)狀態,這段時間之內,就必須傳送閒置資料。
那麼,有2個要點浮現出來了,什麼是閒置資料?邏輯閒置(Logical Idle)與電氣閒置(Electrical Idle)的差別又在何處?
閒置資料就是字符「Idle character(00h)」,而接收端可以不理會這些閒置資料。當傳輸通道寬於x1的場合,STP與SDP的符號必須放置在「輸通道寬0」。然而,如果輸通道大於x4的時候,STP與SDP的符號允許放在4*N的位置,其中的N是一個正整數。換句話說,x8的場合,STP與SDP的符號可擺在「輸通道寬0與4」。至於x16的場合,STP與SDP的符號就可以擺置在「輸通道寬0與4與8與12」。
同時也有一條很有趣的規則,可以間接用來解釋「PAD」符號的運用。舉x8的連結場合為範例,如果END與EDB符號是放置在「輸通道寬3」,其後並沒有跟著STP或SDP,那麼在「輸通道寬4~7」就必須擺置「PAD」符號。
其次,要面臨的第2個大問題就是資料攪和(Data Scrambling)的議題。該技術詞彙也是令人討厭的東西。傳送端「Data Scrambling」的進行是在字元送入「8b/10b」編碼之前,接收端是反過來的次序。資料連結層如何來告知實體層關閉這個機能,是看廠商如何來實踐,規格中並不指定。
抓住一個大原則,所有的資料字元(又稱之為D codes)都可以做資料攪和。但是,所有的特殊控制字元(又稱之為K codes)卻不能做資料攪和。
此件事情背後有2個大哉問。第一,進行資料攪和(Data Scrambling)的根本目的何在?第二,基於何種場合為何要關閉這個資料攪和機能?
前面的問題實在不知來回答才能圓滿。就算將它看成一種資料加密也未嘗不可。定性上的說法就是可以減低電磁干擾(EMI);而後面的疑問就容易答辯,就是為了簡化測試與偵錯的進行與控制。
第三個要去面臨的問題就是3GIO的資料連結之初始化(Initialization)與調訓(Training)的協定處理。初始化的問題,依據過去的經驗累積,多少可理解匯流排於使用之前必要的前置動作。困難的地方是在於調訓(Training)的過程與含意是什麼玩意兒?
資料連結之調訓(Training)所擔當的工作將之摘要如下:
要達成以上所言的使命,就必須仰賴規範上的機制來實踐。有一個名詞請大家先記住,調訓序列指示集(Training Sequence Ordered Sets)。該詞的重要部位所在乃是指示集(Ordered Sets)。所謂「Ordered Sets」並不是資料而是「控制情報」,不是「K codes」個體就是「K codes與D codes」的組合體。如此一來,我們就可以約略掌握住調訓序列(Training Sequence)就是利用了指示集(Ordered Sets)來完成實體層參數情報的交換任務。
調訓序列指示集,永遠不會有資料攪和(Data Scrambling)發生,但是,仍然必須遵循8b/10b的編碼法則。
至於接收端是否要檢查連結初始化(Initialization)與調訓(Training)的協定處理是否有違反規則,是被列為選項。若是有實施檢測的場合,一旦發現有錯誤,是可以產生報告,而且還會被歸類為致命(fatal)的錯誤。
調訓序列(Training Sequence)也就是規範中泛指的TS1或TS2,乃是連續性的傳送,僅僅有「SKP」的指示集可以來中斷它。因此勢必要對TS1與TS2的細目做個瞭解。先用表格式的整理方式來細說TS1指示集(Ordered Sets)的內在。
請留意表1與表2裡的調訓控制(Training Control)位元,「Hot Reset、Disable Link、Loopback」彼此之間乃是互斥的,也就是說僅能有一個位元被設定。
傳輸巷道極性變換(Polarity inversion)的問題,其含意就是指D+與D-信號線的角色互換。可是從上述表1與表2裡的調訓控制位元欄位中,並未看到該機能的控制位元定義。原來,接收器是檢視TS1與TS2的識別器來判定的。
當TS1與TS2識別碼顛倒之際也就是表明傳輸巷道極性變換(Lane Polarity Inversion),更精確地說,就是TS1中的「D10.2」用「D21.5」來替代,TS2中的「D5.2」用「D26.5」來取代之。既然明白這個道理,我們也就清楚地知曉傳輸巷道極性變換僅能在接收端被偵測到與實踐,傳送端是不被允許的。而且,各個傳輸巷道的處理安排是相互獨立運作的。
先前描述到快速調訓指示集(fast training Ordered Sets)也就是FTS(Fast Training Sequence)的機制,其主用的功用是從L0s進入L0狀態時,作為位元與符號的鎖定。換言之,接收端利用FTS來檢知跳離「Electrical Idle」狀態,並調整位元與符號接收電路,將接收進來的資料排列成行。N_FTS就是定義了從L0s進入L0狀態時,多少FTS指示集的數目必須傳送出去。
1個單獨的FTS是由1個K28.5(COM)與3個K28.1符號的指示集(Ordered Sets)所組成的。N_FTS就是FTS指示集的最大數量,當設定為255時,提供了「4*255*10*UI」的位元鎖定時間。
接下來談論真正的核心所在,也就是連結調訓的狀態遷移圖(圖24),簡稱為LTSSM(Link Training and Status State Machine)。而每一個狀態是可以進一步地再細分成多數個子狀態(sub-state)。
「偵測-Detect」狀態(圖25),顧名思義乃是用來查知遠端的終端阻抗是否存在。
「輪尋-Polling」狀態,連接埠會傳送出調訓指示集(Training Ordered Sets)與反應所接收的調訓指示集。在這個狀態之下,會建立位元與符號的鎖定,傳輸巷道的速率與極性都會組態完成。
「Polling.Active」子狀態意味著傳送端在偵測到接收端之後,送出連結與傳輸巷道數目設定為PAD(K23.7)的TS1指示集(Ordered Sets)。
順從性式樣(Polling.Compliance)子狀態,傳送端送出「compliance pattern」。
「Polling.Configuration」子狀態,傳送端在偵測到接收端之後,送出連結與傳輸巷道數目設定為PAD(K23.7)的TS2指示集 (Ordered Sets)。8個連續的TS2指示集之後,進入了組態(Configuration)(圖26)。當48ms的過時(Timeout),就回到「偵測- Detect」狀態。
在「組態-Configuration」狀態下,傳送端與接收端會以溝通好的速率來送收資料。當然,連接埠的傳輸巷道會構成一個連結。其中的「Configur-ation Idle」是傳送端針對所有已經組態完畢的傳輸巷道送出「閒置-Idle」符號,而接收端會處於在等待閒置資料的狀況。此時,「LinkUp = 1」,爾後即是進入了L0的動作狀態。
「恢復-Recovery」狀態(圖27)就是允許組態好的連結,重新建立位元與符號的鎖定斗等。
「L0」狀態是正常運作模式狀態,資料與控制封包可以丟過來傳過去,「LinkUp = 1」。只要詳細看清楚「LTSSM」狀態遷移圖,就可以了然一切的電源管理狀態,皆是從「L0」狀態,跳進去的。
「L0s」狀態可視為一種省電模式。其最大的特徵就是可以不經過「恢復-Recovery」狀態直接回到「L0」狀態。那什麼場合會進入「L0s」狀態呢?當接收到一個「電氣閒置(Electrical Idle)」的指示集(Ordered Sets),就是進入的時機。
「L1」狀態(圖28)也是一種省電模式,比「L0s」狀態更為節約的一種模式,因此回復(Resume)回來的時間就稍微費時。當資料連結層指示下來,並且接收到「電氣閒置(Electrical Idle)」的指示集,就是進入的時候。
「L2」狀態(圖29)是最為省電的模式,傳送器與接收器的大多部位皆被關閉掉。僅有輔助電源殘留。「L2」狀態的進入也是經由資料連結層指示下,並且接收到電氣閒置(Electrical Idle)的指示集來實踐的。如果有支援喚醒的機能,則是仰賴標示(Beacon)的喚醒信號。
失效(Disable)狀態即是關掉組態好的連結。藉由TS1與TS2的調訓指示集中的位元設定即可。
迴路(Lookback)模式(圖30)是為了測試以及錯誤隔離除錯的用途。可以藉由TS1與TS2的調訓指示集中的位元設定。一旦進入之後,要做什麼事,就看各家本領的高低。
熱重置(Hot Reset)狀態也是可以藉由TS1與TS2的調訓指示集中的位元設定。
時脈差異之補償(Clock Tolerance Compensation)含意是說連結之傳送端與接收端在時脈頻率上的不同,以SKP指令集來補償。時脈差異定在600 ppm。
回顧在談論輪尋(Polling)的狀態時,「Polling Com-pliance」子狀態傳送端送出順從性式樣(compliance pattern),而該順從性式樣的格式構成,就是「K28.5、D21.5、K28.5與D10.2」8b/10b符號的重覆。