2.RapidIO序列物理層的包與控制符號
轉自https://www.cnblogs.com/liujinggang/p/9932150.html
一、RapidIO序列物理層背景介紹
上篇博文提到RapidIO的物理層支援序列物理層與並行物理層兩種,由於Xilinx 部分FPGA內部已經集成了序列高速收發器,所以用FPGA實現RapidIO大多都是基於序列物理層的。本文將主要討論一下RapidIO序列物理層的包格式與控制符號。
RapidIO序列物理層,通常稱為序列RapidIO,簡稱為SRIO(Serial-RapidIO)。 序列物理層定義器件間的全雙工序列鏈路,在每個方向上使用單向差分訊號。RapidIO序列物理層支援RapidIO器件間的包傳送,包括包和控制符號的傳送、流量控制、錯誤管理和其他器件到器件的功能。
RapidIO序列物理層有如下特徵:
1、採用8B/10B編碼方案將時鐘嵌入到資料中。
2、在每個方向上支援一個序列差分對,稱為1通道;或支援四個並列的序列差分對,稱為4通道。
3、使用專用的8B/10B碼(稱為K碼)來管理鏈路。管理內容包括流量控制、包定界和錯誤報告。
4、允許在RapidIO 1x/4x LP-Serial(序列RapidIO)埠和RapidIO物理層8/l6 LP-LVDS(並行RapidIO)埠之間進行包傳輸而無需包處理。(LP=Link Protocol)
5、使用與並行RapidlO物理層相似的重傳和錯誤恢復協議。
6、支援每通道1.25G、2.5G和3.125G波特率(資料速率為1.0Gbps、2.0 Gbps和2.5 Gbps)的傳送速率。
二、RapidIO序列物理層的包格式
2.1 序列物理層包格式與並行物理層包格式的區別
RapidIO並行物理層包格式和序列物理層包格式的邏輯層和傳輸層欄位完全相同,唯一不同的是物理層欄位有所區別。總體來說,並行RapidIO包和序列RapidIO包在物理層有以下兩方面不同:
1、因為並行RapidlO包和控制符號在同樣的資料線路中傳送,並且並行介面不使用K碼來為包和控制符號定界,所以並行包的第一位用來區分包和控制符號。而序列包不包括用來區別包和控制符號的S欄位。
2、序列物理層提供5位元的ackID而並行物理層僅提供3位元的ackID。這意味著在兩個序列鏈路埠之間最多可以包含32個未完成的事務,而對於並行介面兩個埠之間最多隻能有8個未完成的事務。序列鏈路介面覆蓋範圍更大,因為序列介面更可能執行在需要較長距離通訊的情況,更可能在兩個埠之問有較多的未確認的活動事務。
下圖是RapidIO序列物理層包格式與並行物理層包格式的對比圖
由上圖可以看出,序列物理層的包格式與並行物理層的包格式僅僅只有前6-bit不同,而其餘的欄位完全相同。所以包格式最後的CRC校驗碼的計算範圍不包括包的前6-bit。
2.2 RapidIO序列物理層包格式
RapidIO序列物理層的包格式如下圖所示
其中邏輯層和傳輸層各個欄位的含義與上篇文章並行物理層包格式欄位含義完全相同。這裡不再贅述,序列包格式物理層各個欄位的含義如下表所示
欄位 |
描述 |
ackID[0-4] |
ackID是返回給包傳送者的包識別符號。序列物理層為該欄位定義了5位。這足以在兩個器件間唯一的識別最多32個未完成的事務 |
rsvd[0-2] |
ackID欄位後面的兩個0就是rsvd欄位。產生包時這兩位必須置0,接收包時,這兩位需要忽略 |
crf |
關鍵請求流(Critical Request Flow),與prio欄位共同決定包的優先順序 |
prio[0-1] |
設定包的優先順序,2’b11的優先順序最高,2’b00的優先順序最低 |
crc[0-15] |
使用16位迴圈校驗碼檢查包中的錯誤 |
序列RapidIO包的長度應該是32位的整數倍。因為內部資料的寬度一般是32位的整數倍,所以使序列RapidIO包的長度等於32位的整數倍可以簡化傳送和接收埠邏輯的設計。如果包的長度是16位的奇數倍(包括迴圈冗餘校驗碼欄位),值為0x0000的16位資料會填充到包尾。填充後的包長度是32位的整數倍。
2.3 RapidIO序列物理層包保護
序列物理層在每個包中加入16位迴圈冗餘校驗碼以提供錯誤檢測機制。該碼覆蓋了除ackID欄位和rsvd欄位首位外的整個包,迴圈冗餘校驗碼計算時將未覆蓋的部分視為0。下圖顯示了迴圈冗餘校驗碼未覆蓋的序列物理層包頭的前6位(ackID和第一個保留位)。
由於包通過交換結構傳輸時不要求為每個鏈路重複計算迴圈冗餘校驗碼,所以該結構允許ackID在每條鏈路上改變。由於在每條鏈路上為每一後續傳送的包分配的ackID是連續的,所以很容易檢測到ackID欄位的錯誤。
有兩種方式將迴圈冗餘校驗碼附加在包尾。對除迴圈冗餘校驗碼外長度等於或少於80位元組的包來說,在邏輯層欄位尾附加一個單獨的迴圈冗餘校驗碼。下圖是長度小於80位元組的被填充過的包的示例
對除迴圈冗餘校驗碼外長度大於80位元組的包來說,在前80位元組後附加一個迴圈冗餘校驗碼。在邏輯層欄位尾的加另一個迴圈冗餘校驗碼。第二個迴圈冗餘校驗碼是第一個的延續。第一個迴圈冗餘校驗碼包含在執行(running)計算中,這意味著在執行迴圈冗餘校驗碼值插入到包的前80個位元組後面之後不再重新初始化。這允許相關器件將嵌入的迴圈冗餘校驗碼值視為2位元組的資料載荷以進行迴圈校驗碼的校驗。 如果附在邏輯層後面的迴圈冗餘校驗碼不能使包尾部對齊32位邊界的話, 2位元組的全邏輯0填充就會加在包尾部。該邏輯0填充區有助於保證迴圈冗餘校驗碼校驗總在32位邊界完成。接收處理部件使用前一個迴圈冗餘校驗碼來檢査較大包頭的有效性並在接收到整個包前開始處理資料,這樣可以更早地釋放資源並減少完成事務的延遲。
下圖是一個長度大於80位元組的被填充過的包的示例。這個包包括兩個迴圈冗餘校驗碼和一個位於包尾的填充區。包的總長度為32位的整數倍。
使用ITU(國際電信聯盟)多項式X16+X12+X5+1可以產生包16位的迴圈冗餘校驗碼。在每個包的開始迴圈冗餘校驗碼的值初始化為0xFFFF(全部邏輯1)。在迴圈冗餘校驗碼計算時把未覆蓋的6位視為邏輯0。具體的實現過程請參考RapidIO官方手冊(參考文獻1)第465頁。
三、RapidIO序列物理層的控制符號
3.1 控制符號介紹
控制符號是被序列鏈路埠使用的訊息單元,它用來管理序列鏈路操作的各個功能,包括鏈路維護,包界定,包應答,錯誤報告和錯誤恢復。
SRIO中定義了兩種控制符號。第一種控制符號長度為3個位元組,被稱為短控制符號(Short Control Symbol),第二種控制符號長度為6個位元組,被稱為長控制符號(Long Control Symbol)。短控制符號是SRIO最先定義的一種控制符號,它適用於序列鏈路的線速率低於5.5Gbps,並且接收方並未對資料進行判決反饋均衡(Decision Feedback Equalization,DFE)的情況,它提供了序列鏈路協議需要的基本功能以及一些擴充套件功能。長控制符號是對短控制符號的擴充套件,它適用於序列鏈路的線速率高於5.5Gbps,並且接收方對資料進行判決反饋均衡(Decision Feedback Equalization,DFE)的情況。由於接收方對資料進行判決反饋均衡(Decision Feedback Equalization,DFE)容易產生資料的突發錯誤(Burst Error),所以長控制符號提供了一些額外的功能去加強突發錯誤的錯誤檢測能力。同時,長控制符號還提供了一些短控制符號不具備的其他擴充套件功能。當然,長控制符號也支援序列鏈路的線速率低於5.5Gbps的情況,在這種情況下,長控制符號可以替代短控制符號提供更多的控制符號功能。
3.2 控制符號格式
控制符號包括長控制符號和短控制符號兩種。長控制符號是對短控制符號功能的擴充套件。
所有的短控制符號長度都為24位(3個位元組),格式如下圖所示
短控制符號一共承載了兩個功能,一個功能由stype0欄位決定,另一個功能由stype1欄位決定。其中,parameter0欄位和parameter1欄位被stype0欄位所代表的功能所使用,而cmd欄位是被stype1欄位所代表的功能所使用。stype0欄位所代表的功能主要包括埠傳輸控制符號過程中的狀態資訊,而stype1欄位所代表的功能主要是傳輸RapidIO包的界定符和一些接收埠的請求。
所有的長控制符號長度都為48位(6個位元組),它的格式如下圖所示
長控制符號各個欄位的含義與短控制符號各個欄位的含義完全相同,唯一的不同之處在於短控制符號的parameter0欄位和parameter1欄位長度為5位,而長控制符號的parameter0欄位和parameter1欄位長度為6位。
控制符號中各個欄位的詳細定義如下表所示
欄位 |
定義 |
stype0 |
為使用了parameter0和parameter1欄位的控制符號編碼 |
Parameter0 |
與stype0編碼一起使用 |
Parameter1 |
與stype0編碼一起使用 |
Stype1 |
為使用cmd欄位的控制符號編碼 |
Cmd |
與stype1欄位一起用來定義鏈路維護命令 |
Crc-5 |
用來檢測控制符號傳輸錯誤的5位迴圈冗餘校驗碼 |
Crc-13 |
用來檢測控制符號傳輸錯誤的13位迴圈冗餘校驗碼 |
只有一種功能的控制符號以它所表示的功能的名字來命名。有兩種功能控制符號以它所表示的某個功能的名字來命名。例如, stype0設定為接收包(packet-accepted)而stype1設量為NOP的控制符號稱為接收包控制符號。其stype0設定為接收包而stype1設定為從重傳處重啟(restart-from-retry)的控制符號被稱為接收包控制符號或從重傳處重啟控制符號,這取決於上下文。
可以傳達兩種功能的能力是控制符號特有的屬性。這樣包確認控制符號和包定界控制符號就能由同一控制符號表示。鏈路傳送的控制符號流中大多數是包確認控制符號和包定界控制符號。有的時候在一個控制符號中攜帶確認(或狀態)和包定界符能顯著降低鏈路開銷並增加傳送包的鏈路頻寬。
3.3 stype0控制符號
下表列出了stype0控制符號的編碼和功能以及parameter0欄位和parameter1欄位所代表的含義
Stype0 |
功能 |
內容 |
|
Parameter0 |
Parameter1 |
||
3’b000 |
可接收的包 |
Packet_ackID |
Buf_status |
3’b001 |
包重傳 |
Packet_ackID |
Buf_status |
3’b010 |
不可接收的包 |
任意值 |
Cause |
3’b011 |
保留 |
—— |
—— |
3’b100 |
狀態 |
ackID_status |
Buf_status |
3’b101 |
虛擬通道狀態 |
VCID |
Buf_status |
3’b110 |
鏈路響應 |
ackID_status |
Port_status |
3’b111 |
使用者定義 |
使用者定義 |
使用者定義 |
上表中各個欄位的含義如下表所示
引數 |
定義 |
Packet_ackID |
被應答控制符號的ackID |
ackID_status |
埠預期接收的下一個包的ackID的值。這個值比上一次收到的包的ackID值大1, |
Buf_status |
埠在指定的虛擬通道可接收的最大包的個數 對於短控制符號: 值為0~29:該編碼值定義了埠在指定的虛擬通道件可以接收的新的最大包的個數。例如,值0表示埠在指定的虛擬通道沒有包緩衝,因此不能接收新包 值為30:埠在指定的虛擬通道件可以接收的新的最大包的個數為30個 值為31: 埠在指定的虛擬通道件可以接收的新的最大包的個數未定義,包的個數取決於流控制的重傳協議 對於長控制符號: 值為0~61:該編碼值定義了埠在指定的虛擬通道件可以接收的新的最大包的個數。例如,值0表示埠在指定的虛擬通道沒有包緩衝,因此不能接收新包 值為62:埠在指定的虛擬通道件可以接收的新的最大包的個數為30個 值為63: 埠在指定的虛擬通道件可以接收的新的最大包的個數未定義,包的個數取決於流控制的重傳協議 |
Cause |
這個引數指的是包不被接收的原因。 5’b00001:接收包中的ackID值錯誤 5’b00010:接收控制符號的迴圈冗餘校驗碼錯誤 5’b00011:非維護的接收包被阻止 5’b00100:接收包的迴圈冗餘校驗碼錯誤 5’b00101:接收了無效的字元或者有效但不合法的字元 5’b00110:缺乏資源 5’b00111:解交織同步訊號丟失 5’b11111:普通錯誤 |
Port_status |
埠狀態: 5’b00010:埠遇到了不可恢復的錯誤 5’b00100:重傳停止(Retry-stopped) 5’b00101:錯誤停止(Error-stopped) 5’b10000:正常(OK) 其他值均為保留值。 |
接收包(Paket-Accepted)控制符號:
接收包的控制符號表明接收器件已經把包傳送到其最終目的地並且可以釋放由傳送器件分配的資源。該控制符號應該僅在已接收到整個包並且沒有發現可檢測的錯誤之後產生。接收包控制符號的格式如下圖所示
重傳包(Paket-Retry)控制符號:
重傳包控制符號表明接收器件由於某些臨時的資源衝突,如緩衝區不足而不能接收包,傳送者應該重新發送包。重傳包控制符號的格式如下圖所示
未接收包(Packet-not-accepted)控制符號:
未接收包控制符號用來向包傳送者表明接收埠沒有接收到包的原因。控制符號包含一個指示無法接收包的原因的cause欄位和一個packet_ackID欄位。如果接收器件不能確定原因,或原因不屬於定義的原因選項,就使用一般錯誤編碼。Cause欄位的定義在上表已經給出,未接收包控制符號的格式如下圖所示
狀態(Status)控制符號:
狀態控制符號預設為stype0編碼。它在控制符號不傳達另一個stype0功能時使用。狀態控制符號包含ackID_status和buf_status欄位。buf_status欄位向接收埠指示傳送埠在產生控制符號時擁有的可用來接收包的可容納最大長度包的緩衝區數量。ackID_status欄位允許接收埠判定該埠和傳送埠是否關於傳送埠期望接收到的下一個ackID值同步。下圖是狀態控制符號的格式
鏈路響應(Link-Request)控制符號:
器件用鏈路響應控制符號響應鏈路請求(link-request)控制符號。在狀態欄位中報告的狀態是在接收到相關鏈路請求/輸入狀態(link-request/input-status)控制符號時埠的狀態。下圖是鏈路響應控制符號的格式,port_status欄位的功能在上表已經描述
3.4 stype1控制符號
下表列出了stype1控制符號的編碼和功能以及cmd欄位所代表的含義
Stype1 |
Stype1功能 |
cmd |
Cmd功能 |
包定界符 |
3’b000 |
包開始 |
3’b000 |
包開始 |
是 |
3’b001~3’b111 |
保留 |
否 |
||
3’b001 |
包取消 |
3’b000 |
包取消 |
是 |
3’b001~3’b111 |
保留 |
否 |
||
3’b010 |
包結束 |
3’b000 |
包結束 |
是 |
3’b001~3’b111 |
保留 |
否 |
||
3’b011 |
從重傳處重啟 |
3’b000 |
從重傳處重啟 |
* |
3’b001~3’b111 |
保留 |
否 |
||
3’b100 |
鏈路請求 |
3’b000~3’b010 |
保留 |
* |
3’b011 |
復位裝置 |
|||
3’b100 |
輸入狀態 |
|||
3’b101~3’b111 |
保留 |
|||
3’b101 |
多播事件 |
3’b000 |
多播事件 |
否 |
3’b001~3’b111 |
保留 |
否 |
||
3’b110 |
保留 |
3’b000~3’b111 |
保留 |
否 |
3’b111 |
NOP(忽略)** |
3’b000 |
NOP(忽略)** |
否 |
3’b001~3’b111 |
保留 |
否 |
* 表示如果包在轉發過程中,從重傳處重啟並且鏈路請求控制符號可能只是包定界符。
** 表示雖然NOP(忽略)沒有作為控制符號定義,但是它是在控制符號不傳達另一個stype1功能時的預設值。
包開始(Start-Of-Packet)控制符號:
包開始控制符號用來界定包的起始位置,它的格式如下圖所示
包取消(Stomp)控制符號:
包取消控制符號用來取消一個正在傳送的包,它的格式如下圖所示
包結束(End-Of-Packet)控制符號:
包結束控制符號用來界定一個包的結束位置,它的格式如下圖所示
從重傳處重啟(Restart-from-Retry)控制符號:
從重傳處重啟控制符號會取消一個當前的包。該控制符號可能在空閒鏈路上傳送。用該控制符號標記重傳包的開始可使接收者知道在其請求重傳一個包後什麼時候開始接收包。它的格式如下圖所示
鏈路請求(Link-Request)控制符號:
器件使用鏈路請求控制符號發起一個命令到相連器件或請求相連器件的輸入埠狀態。鏈路請求控制符號取消當前包並可在包之間傳送。在錯誤情況下,鏈路請求/輸入狀態控制符號的作用與鏈路請求/從錯誤處重啟控制符號的作用相同。鏈路請求控制符號的格式如下圖所示。
鏈路請求控制符號的第二個欄位是一個3位的命令(cmd)欄位。該欄位包含傳送到鏈路的命令。定義了兩個命令:器件復位(reset-device)和輸入狀態(input-status),cmd欄位詳細的描述如下表所示
Cmd的值 |
命令名稱 |
描述 |
3’b000~3’010 |
|
保留 |
3’b011 |
復位裝置(reset-device) |
復位接收裝置 |
3’b100 |
輸入狀態(input-status) |
返回輸入埠狀態;在錯誤情況下和鏈路請求(從錯誤處重啟)控制符號的功能相同 |
3’b101~3’b111 |
|
保留 |
復位裝置命令引起接收器件執行復位或上電過程; 所有狀態機和暫存器都復位到上電初始狀態。復位裝置命令不會產生鏈路響應控制符號。由於各系統設計的可靠性並不確定, 在鏈路響應控制符號的復位功能上設定保護是必要的。裝置接收到鏈路響應控制符號中的復位裝置命令時並不執行復位功能,除非它收到四個連續的復位器件命令。這些連續的命令之間不應有除狀態控制符號外的任何其他插入的包或控制符號。這樣做能防止假復位命令在無意中復位器件。
輸入狀態命令請求正在接收的器件返回在其輸入埠期望接收到的來自發送者的下一個ackID值,同時返回該輸入埠當前的工作狀態。該命令使接收端重新整理其輸出埠在輸入狀態命令之前接收到的由包產生的所有控制符號。重新整理輸出埠是與具體實現相關的,可能導致丟棄接收緩衝區的內容或在鏈路上傳送控制符號,然後接收者產生鏈路響應控制符號作為響應。
多播事件(Multicast-Event)控制符號:
多播事件控制符號與其他的控制符號不同,不同之處在於它攜帶的資訊與鏈路傳輸的控制符號無關。多播事件控制符號允許把使用者定義事件的發生廣播到整個系統。它的格式如下圖所示
3.5 控制符號保護
控制符號的錯誤檢測是通過迴圈冗餘校驗碼(Cyclic Redundancy Check,CRC)來完成的。
對於短控制符號來說,RapidIO協議使用一個5位的CRC對錯誤進行檢測。它能為8B/10B解碼模組解出來的24位短控制符號檢測最多5位的突發錯誤(Burst Error),5位的突發錯誤是最長的突發錯誤,8B/10B解碼模組組的頂層如果出現單位元的傳輸錯誤就有可能導致5位的突發錯誤。
對於長控制符號來說,RapidIO協議使用一個13位的CRC對錯誤進行檢測。它能為8B/10B解碼模組解出來的48位長控制符號檢測任意位數的突發錯誤(Burst Error),11位的突發錯誤最多可以破壞兩個8B/10B碼組。
CRC-5迴圈冗餘校驗碼
使用ITU多項式X5+X4+X2+1為控制符號產生5位迴圈冗餘校驗碼。迴圈冗餘校驗碼的校驗位佔用了控制符號的最後5位。應該注意的是,5位迴圈冗餘校驗碼必須由傳送者產生並由接收者檢驗。在計算5位迴圈冗餘校驗碼前應該將迴圈冗餘校驗碼欄位設定為全1 (5’b11111 )。為了使各種型別的迴圈冗餘校驗碼實現更加靈活,在控制符號欄位中加人了一個虛擬的第20位。對所有的計算來說,第20位是應用的最後1位,並且總是置為邏輯0。
CRC-13迴圈冗餘校驗碼
使用ITU多項式X13+X10+X8+X5+X2+1為控制符號產生13位迴圈冗餘校驗碼。迴圈冗餘校驗碼的校驗位佔用了控制符號的最後13位。應該注意的是,13位迴圈冗餘校驗碼必須由傳送者產生並由接收者檢驗。在計算13位迴圈冗餘校驗碼前應該將迴圈冗餘校驗碼欄位設定為全0 (13’b0000000000000 )。
關於CRC碼的具體產生方法請閱讀RapidIO官方手冊(參考文獻1)的第481頁。
四、總結
RapidIO序列物理層的控制符號就是上文介紹的幾種情況,關於並行物理層的控制符號不屬於本文的討論範圍,感興趣的請閱讀RapidIO官方手冊(參考文獻1)的第209頁。為了便於大家以後的檢視,下面列出一張比較精簡的控制符號的圖方便大家快速的檢視各個欄位的意義。
上圖列出的是短控制符號的定義。右下角關於K碼的內容請看下一篇部落格。上篇文章和這篇文章講的都是Rapid協議相關的東西,可能比較抽象,仍然不知道在FPGA裡面如何實現RapidIO協議。我建議大家初學RapidIO協議可以把這兩篇文章和下一篇文章快速瀏覽一遍對相關的包和控制符號的概念有個印象即可,等你自己最後把所有的事務都在Vivado裡面仿過一遍以後再回過頭來看這些東西就覺得很合理了。
五、參考資料
1、RapidIO™ Interconnect Specification,下載連結 https://pan.baidu.com/s/1ek-3AAhetLAcxTuOE2IyMg
2、RapidIO嵌入式系統互連,電子工業出版社
3、Xilinx的pg007_srio_gen2,下載地址 https://china.xilinx.com/support/documentation/ip_documentation/srio_gen2/v4_0/pg007_srio_gen2.pdf