一、引言
前幾篇文章已經(jīng)談到RapidIO的協(xié)議,串行物理層與控制符號(hào)。
RapidIO協(xié)議包括讀事務(wù)(NREAD),寫事務(wù)(NWRITE),流寫事務(wù)(SWRITE),有響應(yīng)的寫事務(wù)(NWRITE_R),原子操作(ATOMIC),維護(hù)操作(MAINTENANCE),門鈴事務(wù)(DOORBELL)和消息(MESSAGE)這幾種。
RapidIO的串行物理層是基于SERDES的,關(guān)于SERDES涉及的一些相關(guān)技術(shù)請閱讀《SERDES關(guān)鍵技術(shù)總結(jié)》(鏈接:https://www.cnblogs.com/liujinggang/p/10125727.html)這篇文章。SERDES分為PCS(物理編碼子層)和PMA(物理媒介附屬子層)兩層,其中PCS是由純數(shù)字電路組成,可以用軟邏輯來實(shí)現(xiàn),而PMA則既包括了數(shù)字電路,也包括了模擬電路,不能用純邏輯實(shí)現(xiàn)。
控制符號(hào)是被串行鏈路端口所使用的消息單元,它用來管理串行鏈路操作的各個(gè)功能,包括鏈路維護(hù),包界定,包應(yīng)答,錯(cuò)誤報(bào)告和錯(cuò)誤恢復(fù)等。
有了前面的基礎(chǔ)以后,接下來就談一談RapidIO串行物理層包的傳輸過程。
二、串行物理層的PCS層與PMA層
物理編碼子層(PCS)與物理媒介附屬子層(PMA)提供SERDES能夠進(jìn)行高速串行數(shù)據(jù)傳輸?shù)幕竟δ?術(shù)語PCS和PMA出自IEEE 802.3 )。主要包括8B/10B編碼、字符表示法、數(shù)據(jù)流的分段、碼組(Code Group)、縱列(Column)、鏈路傳輸規(guī)則、空閑序列(Idle Sequence)和鏈路初始化。
通道的概念用于描述串行RapidIO端點(diǎn)的寬度。通道定義為每個(gè)方向上的單向差分對。目前串行RapidIO規(guī)定了兩種鏈路寬度:1x鏈路為1通道鏈路, 4x鏈路為4通道鏈路。更寬的鏈路也是可能的, 但是目前還沒有知定。
下圖展示了一個(gè)典型的RapidIO端點(diǎn)的結(jié)構(gòu)??驁D的上部是負(fù)責(zé)產(chǎn)生大量RapidIO包的邏輯層和傳輸層。在這些層下面緊接著的是串行協(xié)議層,該層負(fù)責(zé)產(chǎn)生和處理控制符號(hào)并通過鏈路管理協(xié)議管理鏈路。串行協(xié)議層下面是PCS層。鏈路協(xié)議管理層和PCS層之間的邊界通常也是時(shí)鐘從器件內(nèi)部時(shí)鐘轉(zhuǎn)變?yōu)?RapidIO端點(diǎn)本身時(shí)鐘的轉(zhuǎn)變邊界。PCS層負(fù)責(zé)通道分段(Striping),產(chǎn)生空閑序列并把字符轉(zhuǎn)換為相應(yīng)的8B/10B編碼的K碼和D碼。PCS層下面是PMA層,該層負(fù)責(zé)與電氣層的銜接。PMA層還負(fù)責(zé)確保不同通道間彼此正確對齊。電氣層代表不同器件、接收器及其之間的電氣連接。
2.1 PCS層的功能
物理編碼子層(PCS)的功能是負(fù)責(zé)產(chǎn)生空閑序列、通道分段、發(fā)送編碼、解碼、通道對齊和在接收時(shí)將分段合并。PCS使用8B/10B編碼在整個(gè)鏈路上發(fā)送數(shù)據(jù)。8B/10B編碼方案最初由IBM開發(fā),并在工業(yè)界廣泛用于將數(shù)據(jù)和時(shí)鐘信息合并為一個(gè)單獨(dú)的信號(hào)。
PCS層還提供了判定端口的操作模式是4通道還是1通道的機(jī)制和檢驗(yàn)鏈路狀態(tài)的方法。該層容許在發(fā)送者和接收者之間存在時(shí)鐘差異而無需流量控制。
PCS層執(zhí)行下列發(fā)送功能:
1、 將在隊(duì)列中等待發(fā)送的包和定界控制符號(hào)提取出來組成字符流。
2、 在可用通道上分段發(fā)送字符流。
3、 當(dāng)沒有待發(fā)送的包和定界控制符號(hào)時(shí),產(chǎn)生空閑序列并將其插入到每個(gè)通道發(fā)送的字符流中。
4、 將每個(gè)通道的字符流獨(dú)立編碼為10位并行碼組。
5、 將形成的10位并行碼組傳遞給PMA層。
PCS層執(zhí)行下列接收功能:
1、 解碼10位并行碼組的接收流為各通道獨(dú)立的符號(hào)。
2、 將從無效碼組解碼得到的字符標(biāo)記為無效。
3、 如果鏈路使用多于一個(gè)的通道,對齊字符流來消除通道間的偏移并將每個(gè)通道上的字符流重新組裝為一個(gè)單獨(dú)的字符流。
4、 將解碼字符流得到的包和定界控制符號(hào)遞送到更高層。
2.2 PMA層的功能
物理介質(zhì)附屬層(PMA)的功能是逐通道將10位并行碼組串行化為串行比特流,或?qū)⒋斜忍亓鬓D(zhuǎn)換為10位并行碼組。在接收數(shù)據(jù)時(shí), PMA層的功能是將接收到的比特流逐通道分別對齊到10位碼組邊界。接著該層向PCS層的每個(gè)通道提供一個(gè)連續(xù)的碼組流。10位碼組對PCS層以上的各層是不可見的。
2.3 術(shù)語定義
在討論P(yáng)CS和PMA層時(shí)使用的術(shù)語定義如下:
1、字節(jié)(Byte):一個(gè)8位信息単元,字節(jié)中每位的值為0或1。
2、字符(Character):由信息字節(jié)和一個(gè)控制位組成的9位實(shí)體。控制位指示信息字節(jié)包含的是數(shù)據(jù)還是控制信息??刂莆坏闹禐镈或K,分別指示信息字節(jié)包含數(shù)據(jù)或控制信息。
3、D字符(D- Character):控制位為D的字符,也稱為數(shù)據(jù)字符。
4、K字符(K- Character):控制位為K的字符,也稱為特殊字符。
5、碼組(Code-group):對字符進(jìn)行8B/10B編碼得到的10位實(shí)體。
6、縱列(Column):同時(shí)在4x(4通道)鏈路上傳送的由4個(gè)字符組成的組群。
7、Comma:8B/10B特殊碼組中唯一的只包含7個(gè)比特的字符,接收者用它來判定碼組邊界。
8、空閑序列(Idle Sequence):當(dāng)不發(fā)送包或者控制符號(hào)時(shí)發(fā)送的字符(編碼后的碼組) 序列,空閑序列允許收發(fā)雙方保持同步,并保證在包之間、控制符號(hào)之間以及包與控制符號(hào)之間的碼組對齊。
9、通道對齊(Lane Alignment):消除4通道串行鏈路通道間偏移的過程。由發(fā)送者以縱列(Column)發(fā)送的字行由接收者的對齊過程以縱列輸出。若無通道對齊,以縱列發(fā)送的字符可能會(huì)被分散到由接收者輸出的若干縱列上。對齊過程使用作為空閑序列的一部分傳送的特殊對齊字符。
10、分段(Striping): 4x鏈路上使用的在4個(gè)通道上同時(shí)發(fā)送數(shù)據(jù)的方法。它將字符流逐字符分散到多個(gè)通道上。第1到第4個(gè)字符經(jīng)分段處理后被分別分配到通道0到通道3上,第5個(gè)字符被循環(huán)分配到通道0上,以此類推。
2.3 8B/10B傳輸碼
PCS在發(fā)送數(shù)據(jù)時(shí)使用8B/10B發(fā)送碼將9位字符(8位信息和1位控制位)編碼為10位碼組,接收數(shù)據(jù)時(shí)則進(jìn)行相反的操作。256個(gè)數(shù)據(jù)字符和12個(gè)特殊(控制)字符被定義了編碼。
8B/10B碼使用的碼組中,“0”和“1”的個(gè)數(shù)相等(平衡)或相差2(不平衡)。如此選擇碼組保證了在每一碼組中至少存在兩次跳變,即0到1或1到0,使維持平衡的任務(wù)變得簡單。字符被編碼為一個(gè)單獨(dú)的平衡碼組或一對不平衡碼組。碼組對的成員在邏輯上與對方互補(bǔ)。這允許編碼器在選擇非平衡碼組時(shí),根據(jù)維持編碼器輸出碼組流的0/1平衡所需的碼組選擇一個(gè)含“1”較多或含“0”較多的非平衡碼組。
8B/10B編碼有如下特性:
1、充足的位跳變密度(每個(gè)碼組有3~8個(gè)跳變),以允許接收端進(jìn)行時(shí)鐘恢復(fù)。
2、使用特殊碼組建立接收者對10位碼組邊界的同步,定界控制符號(hào)并維持接收者位和碼組的邊界同步。
3、直流平衡(“0”和“1”的個(gè)數(shù)基本相同)。
4、可檢測某些單比特或多比特錯(cuò)誤。
2.4 字符和碼組記號(hào)
8B/10B編碼和解碼使用下列記號(hào)描述字符、碼組和它們的位。
未編碼字符的信息位[0-7]由字母A到H標(biāo)記,H標(biāo)記的是最高信息位(RapidIO第0位),A標(biāo)記的是最低信息位(RapidIO第7位)。如下圖所示
每個(gè)數(shù)據(jù)字符都有一個(gè)Dx.y格式的表示法,其中x是最低5個(gè)信息位EDCBA的十進(jìn)制值,y是最高3個(gè)信息位HGF的十進(jìn)制值。同時(shí),每個(gè)特殊字符也都有一個(gè)與之類似的Kx.y格式的表示法。
8B/10B編碼過程輸出的是10位碼組,用字母a到j(luò)標(biāo)記碼組的位。碼組的位具有相等的重要性,沒有最高位或最低位。碼組位的次序如下圖所示
與數(shù)據(jù)字符Dx.y(8-bit)對應(yīng)的碼組由/Dx.y/(10-bit)表示,與特殊字符Kx.y(8-bit)對應(yīng)的碼組由/Kx.y/(10-bit)表示。
2.5 運(yùn)行不一致(Running Disparity)
8B/10B編碼和解碼功能使用一個(gè)稱為運(yùn)行不一致的二進(jìn)制變量。該變量值可為正(RD+)或負(fù)(RD-)。實(shí)際上,運(yùn)行不一致變量表示的就是10-bit碼組中“0”的個(gè)數(shù)和“1”的個(gè)數(shù)的差值。當(dāng)“0”的個(gè)數(shù)大于“1”的個(gè)數(shù)時(shí),運(yùn)行不一致變量的值為正,當(dāng)“0”的個(gè)數(shù)小于“1”的個(gè)數(shù)時(shí),運(yùn)行不一致變量的值為負(fù)。其實(shí)要保證直流平衡最簡單的方式是使10-bit碼組中的0和1的個(gè)數(shù)相同,也就是10-bit碼組中“0”和“1”的個(gè)數(shù)都是5個(gè),但是10-bit碼組中既要滿足直流平衡,還要有足夠的跳變(3~8次跳變)使得接收方能夠恢復(fù)出時(shí)鐘信號(hào),那么滿足要求的“0”和“1”個(gè)數(shù)相同的10-bit碼組數(shù)量是不夠的,所以必須增設(shè)一些“0”和“1”的個(gè)數(shù)不相等的碼組,編碼器可以通過碼組的運(yùn)行不一致變量的值來選擇下一個(gè)要發(fā)送的碼組來保證整個(gè)鏈路的直流平衡。
每個(gè)通道的編碼器和解碼器都有一個(gè)運(yùn)行不一致變量。對于4x鏈路,各通道運(yùn)行不一致的值相互獨(dú)立。
在編碼過程中運(yùn)行不一致的主要用途是跟蹤解碼器是否輸出了較多的1或較多的0。當(dāng)字符編碼需要從兩個(gè)不平衡的碼組中選擇一個(gè)碼組時(shí),使用編輯器當(dāng)前的運(yùn)行不一致選擇采用哪一個(gè)不平衡碼組。
在上電后和端口可操作前,發(fā)送者(編碼器)和接收者(解碼器)都必須建立運(yùn)行不一致的當(dāng)前值。發(fā)送者使用負(fù)值作為每個(gè)通道運(yùn)行不一致的初始值。接收者可能使用負(fù)值或正值作為每個(gè)通道的運(yùn)行不一致變量的初始值。
使用下列算法計(jì)算各通道的運(yùn)行不一致值。在編碼器中,該算法對由編碼器產(chǎn)生的新碼組進(jìn)行操作。在接收方,該算法對接收到的由解碼器解碼的新碼組進(jìn)行操作。
每個(gè)碼組被分為兩個(gè)子塊,如下圖所示,前6位(abcdei)形成一個(gè)子塊(6位子塊),其余4位(fghi)形成另一個(gè)子塊(4位子塊)。6位子塊頭部的運(yùn)行不一致值是前一個(gè)碼組尾部的運(yùn)行不一致值。4位子塊頭部的運(yùn)行不一致值是6位子塊尾部的運(yùn)行不一致值。碼組末尾的運(yùn)行不一致值是4位子塊尾部的運(yùn)行不一致值。
子塊運(yùn)行不一致值的計(jì)算方法如下:
1、如果子塊包含“1”的個(gè)數(shù)多于“0”的個(gè)數(shù),那么任何子塊尾部的運(yùn)行不一致值都是正的。如果4位子塊值為0b0011,其尾部的運(yùn)行不一致值也是正的。如果6位子塊值為0b000111,其尾部的運(yùn)行不一致值也是正的。
2、如果子塊包含“0”的個(gè)數(shù)多于“1”的個(gè)數(shù),那么在任何子塊尾部的運(yùn)行不一致值都是負(fù)的。如果4位子塊值為0b1100。其尾部的運(yùn)行不一致值也是負(fù)的。如果6位子塊值為0b111000,其尾部的運(yùn)行不一致值也是負(fù)的。
3、在其他任何情況下,子塊尾部的運(yùn)行不一致值總是與子塊頭部的運(yùn)行不一致值相同。
2.6 8B/10B編碼
8B/10B編碼功能將9位字符編碼為10位碼組。RapidIO規(guī)范包含256個(gè)數(shù)據(jù)字符(Dx.y)和12個(gè)特殊字特(Kx.y)的編碼。這些編碼幾乎完全基于IEEE 802.3工作組在10G位以太網(wǎng)(XAUI)適配接口標(biāo)準(zhǔn)中定義的編碼。對任意給定的一個(gè)9位字符,有兩列編碼,一列記為RD-(負(fù)運(yùn)行不一致),另一列記為RD+(正運(yùn)行不一致)。對字符編碼時(shí),如果當(dāng)前編碼器的運(yùn)行不一致值為負(fù),就選擇RD-列中的碼組作為編碼結(jié)果;如果當(dāng)前編碼器的運(yùn)行不一致值為正,就選擇RD+列中的碼組作為編碼結(jié)果。在每個(gè)字符經(jīng)編碼后,編碼器應(yīng)當(dāng)跟據(jù)運(yùn)行不一致規(guī)則使用編碼得到的新碼組更新運(yùn)行不一致值。 .
2.7 發(fā)送順序
編碼器輸出的10位并行碼組經(jīng)串行化,以“abcdeifghj”的位次序發(fā)送,其中“a”位首先發(fā)送。如下圖所示,該圖給出了一個(gè)字符經(jīng)過編碼、并串轉(zhuǎn)換、發(fā)送、串并轉(zhuǎn)換和解碼的完整過程。圖的左邊顯示的發(fā)送過程是使用8B/10B編碼對字符流編碼和10位并串轉(zhuǎn)換過程。右邊顯示的是接收者對接收到的碼組進(jìn)行串并轉(zhuǎn)換和8B/10B解碼的過程。點(diǎn)劃線是產(chǎn)生10位碼組的PCS層和串行化碼組的PMA層的功能分界線。
下圖還顯示了在接收方接收者使用包含Comma序列的特殊字符來建立10位碼組的邊界對齊。
2.8 8B/10B解碼
8B/10B解碼功能將接收到的10位碼組解碼為9位字符,檢測接收到的未定義解碼的碼組并標(biāo)記解碼輸出流中得到的相應(yīng)字符為無效字符(INVALID)。
解碼功能使用與8B/10B編碼相反的解碼表和解碼器當(dāng)前的運(yùn)行不一致值。解碼器將接收到的碼組與兩個(gè)表選擇的列中的碼組做比較。如果找到匹配,碼組就被解碼為相應(yīng)字符;如果找不到匹配,碼組就被解碼為一個(gè)以某種方式標(biāo)記為無效的字符。在解碼每個(gè)碼組后,解碼器接著應(yīng)根據(jù)運(yùn)行不一致規(guī)則使用解碼得到的新碼組更新解碼器的運(yùn)行不一致值。
下表是一部分?jǐn)?shù)據(jù)字符(Dx.y)的解碼表,完整的解碼表請查看參考文獻(xiàn)1的492頁到499頁
下表是12個(gè)特殊字符(Kx.y)的解碼表
Comma是8B/10B編解碼中非常重要的一個(gè)單元,它只有7個(gè)bit,接收鏈路可以利用Comma實(shí)現(xiàn)碼組的邊界對齊。8B/10B中一共定義了兩種Comma,分別為0b0011111(Comma+)和0b1100000(Comma-)。這兩組Comma分別對應(yīng)特殊碼組/K28.1/,/K28.5/和/K28.7/的abcdeif位。當(dāng)碼組轉(zhuǎn)化完畢以后,在沒有傳輸錯(cuò)誤發(fā)生的情況下,Comma不可能出現(xiàn)在碼組中的任何位置,也不可能在兩個(gè)相鄰碼組的邊界產(chǎn)生,但下面一種情況例外:
當(dāng)特殊碼組/K28.7/后面?zhèn)鬏數(shù)臄?shù)據(jù)碼組是/D3.y/,/D11.y/,/D12.y/,/D19.y/,/D20.y/,/D28.y/和/K28.y/(y的取值范圍是0~7的整數(shù))中的任意一個(gè)時(shí),有可能導(dǎo)致comma在兩個(gè)碼組的邊界產(chǎn)生(取決于運(yùn)行不一致的值)。如果在兩個(gè)碼組的邊界產(chǎn)生了comma,那么接收鏈路就有可能改變10-bit碼組的對齊位置。因此,特殊碼組/K28.7/僅僅用作測試或者診斷的目的。
2.9 特殊字符與縱列
下表定義了RapidIO串行物理層中的特殊字符與縱列,使用特殊字符可以完成以下功能:
1、 逐通道對齊碼組(10位)邊界。
2、 對齊通過四個(gè)通道的接收數(shù)據(jù)流
3、 標(biāo)記IDLE2 Sequence 中CS域的起始位置(CS = Command and Status)
4、 接收者和發(fā)送者間的時(shí)鐘速率補(bǔ)償
5、 控制符號(hào)界定
下面對上表中的各個(gè)特殊字符與碼組的功能進(jìn)行分別說明:
包分界控制符號(hào)(/PD/):
PD和/PD/分別是K28.3字符和/K28.3/碼組的別名,用于定界包含包定界符的控制符號(hào)的開始
控制符號(hào)的開始(/SC/):
SC和/SC/分別是K28.0字符和/K28.0/碼組的別名,用于定界不包含包定界符的控制符號(hào)的開始
同步(/K/):
K和/K/分別是K28.5字符和/K28.5/碼組的別名,空閑序列使用該字符或碼組向接收者提供接收者需要獲得并維持的位和10位碼組的邊界同步信息。選用/K28.5/碼組作為同步字符的原因如下:
1、 該碼組的“abcdeif”位中包含Comma序列。Comma序列可在碼組比特流中輕易找到并標(biāo)記碼組邊界
2、 “ghj”位提供了最大數(shù)量的位跳變(即101或010)
略過(/R/)
R和/R/分別是K29.7字符和/K29.7/碼組的別名。它們在空閑序列和時(shí)鐘補(bǔ)償序列中使用
對齊(/A/)
A和/A/分別是K27.7字符和/K27.7/碼組的別名。它們在空閑序列中使用并用于對齊4x通道。
標(biāo)記(/M/)
M和/M/分別是K28.1字符和/K28.1/碼組的別名。它們在空閑序列2(Idle Sequence 2)中使用并給接收鏈路提供保持10位碼組邊界同步的信息,同時(shí)標(biāo)記空閑幀中CS域的位置。
||K||,||R||,||A||,||M||,||I||
||K||,||R||,||A||,||M||,||I||分別代表四通道情況下的特殊字符,含義與上面對應(yīng)的字符含義相同。
三、使用串行物理層
了解組成串行物理層包頭的位、用于管理端口間通信的控制符號(hào)和使用8B/10B編碼在同一信號(hào)中傳送時(shí)鐘和DC平衡數(shù)據(jù)的比特流編碼技術(shù)后,現(xiàn)在我們可以研究鏈路在兩個(gè)端點(diǎn)間發(fā)送數(shù)據(jù)的實(shí)際工作機(jī)制了。
3.1 端口初始化過程
端口初始化是RapidIO用來初始化和同步一對通信端口的過程。這個(gè)過程包括檢測鏈路的另一端是否存在一個(gè)鏈路對象、建立位同步并對齊碼組邊界以及在端口能同時(shí)支持1x和4x模式(1x/4x端口)情況下,發(fā)現(xiàn)鏈路對象是否能支持4x操作模式并選擇1x或4x操作模式,如果選擇1x模式,則選擇通道0或者通道2作為鏈路接收通道。
若干狀態(tài)機(jī)控制了初始化過程。RapidIO規(guī)范詳細(xì)的描述了狀態(tài)機(jī)的結(jié)構(gòu)。狀態(tài)機(jī)的數(shù)量和類型取決于端口僅支持1x模式(1x端口)還是同時(shí)支持1x和4x模式(1x/4x端口)。在兩種情況下都有一個(gè)主狀態(tài)機(jī)和一個(gè)或多個(gè)次狀態(tài)機(jī)。使用多個(gè)狀態(tài)機(jī)使整體設(shè)計(jì)更為簡化。正如可以預(yù)期的那樣,1x端口的初始化過程比1x/4x端口的初始化過程簡單;1x端口的初始化過程使1x/4x端口初始化過程的子集。
3.2 包交換協(xié)議
一旦端口初始化完成,就可以開始包的交換。已經(jīng)定義了一個(gè)協(xié)議用于兩個(gè)串行RapidIO端點(diǎn)之間的包通信。使用控制符號(hào)管理通過鏈路的包流。包由控制符號(hào)定界和確認(rèn)。錯(cuò)誤情況也可以通過控制符號(hào)通信??刂品?hào)還用于支持流量控制協(xié)議。
控制符號(hào):
控制符號(hào)是由串行鏈路連接的端口所使用的消息部分。控制符號(hào)用于鏈路維護(hù)、包定界、包確認(rèn),錯(cuò)誤報(bào)告和錯(cuò)誤恢復(fù)。
發(fā)送時(shí)控制符號(hào)由一個(gè)單獨(dú)的8B/10B特殊(控制)字符定界??刂谱址麡?biāo)記控制符號(hào)的開始并緊靠在控制符號(hào)的首位之前。為了通道分段(如果可用)和8B/10B編碼,在將控制符號(hào)傳遞到PCS子層前將用于定界控制的特殊字符加入控制符號(hào)。因?yàn)槎炭刂品?hào)的長度是固定的24位,所以控制符號(hào)不需要尾部定界符。定界符和控制符號(hào)組合在一起,稱為定界控制符號(hào)。
使用兩種特殊字符中的一種定界控制符號(hào)。如果控制符號(hào)包含一個(gè)包定界符,就使用專用字符PD(K28.3 )。如果控制符號(hào)不包含包定界符,就使用專用字符SC(K28.0)。如此使用特殊字符向接收者提供了一個(gè)控制符號(hào)內(nèi)容的“預(yù)警(Early Warning)”信號(hào)。
任何不包含包定界符的控制符號(hào)都可被嵌入到包中。嵌入的控制符號(hào)可能包含任何已定義的stype0編碼和“多播事件”或“NOP”之類的stype1編碼。不能將stype1作為包開始、包結(jié)束、消除、從重傳處重啟或鏈路請求控制符號(hào)嵌入到包中,因?yàn)樗鼈儠?huì)終止包。
在鏈路嵌入控制符號(hào)的方式和程度會(huì)影響鏈路和系統(tǒng)的性能。例如,嵌入多播事件控制符號(hào)允許它們的傳播延時(shí)和通過交換機(jī)處理部件的時(shí)延變化最小(某些多播事件應(yīng)用迫切需要嵌入多播事件控制符號(hào))。另一方面,嵌入所有的包確認(rèn)控制符號(hào)而不是把它們盡可能多地與包定界控制符號(hào)組合的做法減少了可用于包傳送的鏈路帶寬,可能是我們所不希望的。
包:
串行 RapidIO包在發(fā)送時(shí)由控制符號(hào)進(jìn)行定界。由于包長度是變化的,所以同時(shí)需要包開始和包結(jié)束定界符。標(biāo)記包的結(jié)束(包終止)的控制符號(hào)跟在包尾或嵌入的控制符號(hào)的后面。
用來進(jìn)行包定界的控制符號(hào)如下:
1、 包開始
2、 包結(jié)束
3、 消除
4、 從重傳處重啟
5、 任意鏈路請求
由包開始控制符號(hào)標(biāo)記包的開始。
包以下列三種方式之一終止:
1、 用包結(jié)束控制符號(hào)標(biāo)記包尾。
2、 用包開始控制符號(hào)標(biāo)記包尾,包開始控制符號(hào)標(biāo)記新包的開始。
3、 用從重傳處重啟、消除或鏈路請求控制符號(hào)取消包。
每個(gè)包都需要一個(gè)標(biāo)識(shí)符來唯一的標(biāo)識(shí)它的確認(rèn)控制符號(hào)。該標(biāo)識(shí)符就是RapidIO包格式中的ackID字段,對RapidIO串行物理層的包來說,ackID字段的長度是5位,它允許在相鄰處理部件間存在1到32個(gè)未完成的待確認(rèn)的請求或響應(yīng)包,但只允許同時(shí)存在最多31個(gè)未完成的待確認(rèn)包。
復(fù)位后分配給ackID 的初始值是 0b00000。ackID的后續(xù)值是連續(xù)分配的(按數(shù)字順序增加,達(dá)到最大數(shù)時(shí)返回到0),用來指示包的發(fā)送次序。確認(rèn)本身由控制符號(hào)組成。
串行RapidIO鏈路協(xié)議使用重傳從包發(fā)送錯(cuò)誤中恢復(fù)。為支持包重傳,發(fā)送端口保存每個(gè)通過串行鏈路傳輸?shù)陌囊粋€(gè)副本,直到收到接收端口發(fā)出的接收包的包確認(rèn)控制符號(hào)或者直到端口判定該包已經(jīng)遇到了不可恢復(fù)的錯(cuò)誤情況。包確認(rèn)控制符號(hào)指示接收端口已收到包并且沒有檢測到錯(cuò)誤,同時(shí)已經(jīng)接收對該包進(jìn)行處理的責(zé)任。除了可能的錯(cuò)誤,如果端口在接收到的包的優(yōu)先級上沒有足夠的可用輸入緩沖區(qū)空間,則端口也可能拒絕包。
產(chǎn)生包的端點(diǎn)處理部件為每個(gè)包分配一個(gè)優(yōu)先級。該優(yōu)先級包含在包的物理層字段優(yōu)先級(PRIO)中并有四個(gè)可能的值: 0、1、2和3。包的優(yōu)先級隨優(yōu)先級值的增加而提高;最低優(yōu)先級為 0; 最高優(yōu)先級為3。使用包優(yōu)先級的目的有多個(gè), 包括事務(wù)排序和死鎖預(yù)防。
3.3 空閑序列
空閑序列是一個(gè)碼組序列。當(dāng)鏈路無需發(fā)送包或控制符號(hào)時(shí),在每個(gè)串行鏈路協(xié)議(LP- Serial)鏈路通道上連續(xù)地發(fā)送空閑序列??臻e序列不能插入到包中。作為端口初始化過程的一部分, 在每個(gè)通道上傳送空閑序列。這是端口初始化協(xié)議所需要的。
1x空閑序列由碼組/K/、/A/、/R/ (空閑碼組)構(gòu)成的偽隨機(jī)序列組成,由操作模式為1x的端口使用。4x空閑序列由縱列l(wèi)lKll、llAll、llRll(空閑縱列)構(gòu)成的偽隨機(jī)序列組成,由操作模式為4x的端口使用。協(xié)議對空閑序列長度沒有要求??臻e序列可以是任意長度。
空閑序列中對碼組的偽隨機(jī)選擇導(dǎo)致空閑序列的頻譜中沒有離散譜線。這可以最小化長空閑序列產(chǎn)生的電磁干擾(EMI)。
空閑序列分為空閑序列1(Idle1 Sequence)和空閑序列2(Idle2 Sequence)。
空閑序列1(Idle1 Sequence):
空閑序列1是一組由A,K,R特殊字符組成的序列,這組序列在串行鏈路上發(fā)送之前必須先經(jīng)過8B/10B編碼器進(jìn)行編碼產(chǎn)生對應(yīng)的10-bit特殊碼組/A/,/K/,/R/之后才能在鏈路上發(fā)送。
產(chǎn)生空閑序列1推薦使用至少7階的本原多項(xiàng)式來產(chǎn)生相應(yīng)的偽隨機(jī)序列,例如:
X7+X6+1 和 X7+X3+1
就是兩個(gè)7階本原多項(xiàng)式的例子,可以利用這兩個(gè)多項(xiàng)式的任意一個(gè)作為空閑序列1的偽隨機(jī)序列生成多項(xiàng)式。下圖是一個(gè)產(chǎn)生空閑序列1偽隨機(jī)序列的框圖
空閑序列2(Idle2 Sequence):
空閑序列2是一組由數(shù)據(jù)字符和特殊字符A,K,M,R組成的序列。這組序列在串行鏈路上發(fā)送之前必須先經(jīng)過8B/10B編碼器進(jìn)行編碼產(chǎn)生對應(yīng)的10-bit特殊碼組/A/,/K/,/M/和/R/之后才能在鏈路上發(fā)送。
空閑序列2的空閑幀的結(jié)構(gòu)如下所示
它包括509-515個(gè)字符的隨機(jī)數(shù)據(jù)域,8個(gè)字符的CS域標(biāo)記以及32個(gè)字符的編碼CS域。其中隨機(jī)數(shù)據(jù)域包含偽隨機(jī)數(shù)據(jù)字符和A、M特殊字符。CS域標(biāo)記字段指明了命令和狀態(tài)(CS = Command and Status)域的起始位置,并且提供了鏈路極性,鏈路寬度和鏈路號(hào)等信息。CS域給端口提供了一些狀態(tài)信息和控制發(fā)送端口的預(yù)加重設(shè)置。
空閑序列的選擇:
當(dāng)串行鏈路每個(gè)通道的線速率在5.5Gbps以上時(shí)只能選擇空閑序列2(IDLE2 Sequence),當(dāng)每通道的線速率低于5.5Gbps時(shí)既可以選擇空閑序列1(IDLE1 Sequence),也可以選擇空閑序列2(IDLE2 Sequence)。至于在端口初始化的過程中選擇空閑序列的算法請查看參考文獻(xiàn)1的516頁。
關(guān)于空閑序列的產(chǎn)生以及更加詳細(xì)的介紹請查看參考文獻(xiàn)1的503頁到517頁。
3.4 1x串行RapidIO鏈路上的數(shù)據(jù)流
1x串行RapidIO端口通過8B/10B編碼器編碼從上層(邏輯層和傳輸層)依次傳送過來的分界控制符號(hào)與包的字符流,當(dāng)控制符號(hào)與包不可獲得時(shí),空閑序列將被送入8B/10B編碼器進(jìn)行編碼并發(fā)送,以保證整個(gè)收發(fā)鏈路處于同步狀態(tài)。
對于接收鏈路來說,10-bit的碼組流將送入8B/10B解碼器進(jìn)行解碼,然后把解碼得到的控制符號(hào)與包按照接收的順序依次傳入上層(邏輯層與傳輸層)。
如果鏈路的空閑序列為空閑序列2,控制符號(hào)和包數(shù)據(jù)字符在發(fā)送之前需要擾碼,接收之前需要解擾。
下圖顯示了短控制符號(hào)在1x串行RapidIO鏈路上的編碼和發(fā)送順序示意圖
下圖顯示了RapidIO包在1x串行RapidIO鏈路上的編碼和發(fā)送順序示意圖
下圖顯示了一個(gè)在1x串行鏈路上傳送控制符號(hào)、包和空閑序列的實(shí)例。發(fā)送的第一個(gè)碼組是代表控制符號(hào)開始的/SC/, 隨后是三個(gè)包含24位控制符號(hào)信息的數(shù)據(jù)碼組。該控制符號(hào)的功能沒有顯示??刂品?hào)后面跟著四個(gè)空閑字符。這四個(gè)空閑字符之后是一個(gè)定界包開始的/PD/碼組。后面三個(gè)碼組包含的控制符號(hào)信息代表包定界符號(hào)信息。碼組表示RapidIO包緊跟在該符號(hào)信息之后。包長度為28字節(jié)。包之后是一個(gè)包結(jié)束控制符號(hào),這個(gè)包結(jié)束控制符號(hào)之后是另一個(gè)包開始控制符號(hào)和另一個(gè)數(shù)據(jù)包。在從重傳處重啟控制符號(hào)終止包前,該包能夠傳輸16字節(jié)信息。該包還插入了另外兩個(gè)控制符號(hào), 這兩個(gè)控制符號(hào)分別插在數(shù)據(jù)流中的第8個(gè)數(shù)據(jù)字節(jié)和第12個(gè)數(shù)據(jù)字節(jié)之后。在RapidIO協(xié)議中,幾乎可在任意時(shí)刻將控制符號(hào)插入到通信信道中, 無需等到包發(fā)送完全完成即可插入控制符號(hào)。在發(fā)送從重傳處重啟控制符號(hào)之后, 另一個(gè)包被發(fā)送到鏈路上。該包正確地完成后鏈路成為空閑狀態(tài)。
3.5 4x串行RapidIO鏈路上的數(shù)據(jù)流
在4x操作模式下的串行端口在8B/10B編碼之前按如下方式將定界控制符號(hào)和組成包的字符流分段到四個(gè)通道上。
包和定界控制待號(hào)將被從通道0開始分段到四個(gè)通道上。每個(gè)包的第一個(gè)字符或定界控制符號(hào)被放到通道0,第二個(gè)字符被放到通道1 ,第三個(gè)字符被放到通道2,第四個(gè)字符被放到通道3。第五個(gè)字符又被放到通道0,如此循環(huán)。
由于控制符號(hào)的長度是固定的24位并且要求包的長度必須是32位的整數(shù)倍, 分段后定界控制符號(hào)的碼組總被放到通道0。所有包將形成整數(shù)個(gè)連續(xù)的縱列。在分段后, 4個(gè)字符流的每一個(gè)流都被獨(dú)立地進(jìn)行8B/10B編碼和發(fā)送。
在接收方對每個(gè)通道進(jìn)行解碼。解碼后, 字符流對齊這4個(gè)通道。作為4x空閑序列的一部分發(fā)送的llAll縱列提供執(zhí)行對齊所需的信息。在對齊之后,縱列被合并為單獨(dú)的字符流, 然后被傳遞到上層 。
通道對齊過程消除了通道間的偏移,這樣在合并(destriping)后接收到的字符流中字符的順序與在分段和發(fā)送前字符的順序相同。由于||A||縱列之間最小的非llAll縱列數(shù)量為16, 所以可以明確修正的最大通道偏移是在一個(gè)通道上傳送7個(gè)碼組的時(shí)間 。下圖顯示了一個(gè)在4x鏈路上傳送空閑序列、包和定界控制符號(hào)的實(shí)例。該實(shí)例使用的包序列與1x鏈路的實(shí)例相同。
四、總結(jié)
RapidIO串行物理層的8B/10B編解碼原理與包傳輸流程相關(guān)的內(nèi)容到此介紹完畢,更多詳細(xì)的內(nèi)容請閱讀參考文獻(xiàn)1的第485頁到560頁。為了便于大家以后的查閱,下面把控制符號(hào)與K碼相關(guān)的定義全部列到一起。
注意:上圖列出的是短控制符號(hào)的定義。長控制符號(hào)總長度為48位而短控制符號(hào)的總長度為24位。
至此,整個(gè)RapidIO理論部分全部介紹完畢,后面會(huì)繼續(xù)寫Xilinx RapidIO核的相關(guān)內(nèi)容。
審核編輯 :李倩
-
RapidIO
+關(guān)注
關(guān)注
1文章
39瀏覽量
20806 -
物理層
+關(guān)注
關(guān)注
1文章
148瀏覽量
34359 -
PMA
+關(guān)注
關(guān)注
1文章
30瀏覽量
18803
原文標(biāo)題:一、引言
文章出處:【微信號(hào):zhuyandz,微信公眾號(hào):FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論