【高速介面-RapidIO】1、RapidIO協議概述
一、RapidIO背景介紹
RapidIO是由Motorola和Mercury等公司率先倡導的一種高效能、 低引腳數、 基於資料包交換的互連體系結構,是為滿足和未來高效能嵌入式系統需求而設計的一種開放式互連技術標準。RapidIO主要應用於嵌入式系統內部互連,支援晶片到晶片、板到板間的通訊,可作為嵌入式裝置的背板(Backplane)連線。
RapidI0採用三層分級體系結構,該分級結的如下圖所示
其中邏輯層位於最高層.定又全部協議和包的格式,它們為端點器件發起和完成事務提供必要的資訊;傳輸層規範位於中間層,定義了RapidIO地址空間和在端點器件間傳輸包所需要的路由資訊,物理層規範在整個分級結構的底部,包括器件級介面的細節,如包傳輸機制、流量控制、電氣特性和低階錯誤管理等功能.
Rapid IO分為並行Rapid IO標準和序列Rapid IO標準,序列RapidIO是指物理層採用序列差分模擬訊號傳輸的RapidIO標準。在Xilinx的一部分FPGA裡面已經集成了GTP,GTX或GTZ等高速序列收發電路,這些是FPGA實現RapidIO高速傳輸的物理層基礎。
二、RapidIO協議概述
2.1 包與控制符號
RapidIO操作是基於請求和響應事務的。
包是系統中端點器件間的基本通訊単元。發起器件或主控器件產生一個請求事務,該事務被髮送至目標器件。目標器件於是產生一個響應事務返回至發起器件來完成該次操作。 RapidIO事務被封裝在包中,而包則包含確保將事務可靠傳送至目標端點的所有必需的位欄位。通常不會將RapidIO端點相互直接連在一起,而是通過介於其間的交換結構(fabric)連線。名詞“交換結構”指的是提供系統互連的單個或多個交換器件的集合。
控制符號用於管理RapdIO物理層互連的事務流,也用於包確認、流量控制資訊和維護功能。下圖顯示瞭如何在 RapidIO系統中傳送事務。
上圖中,系統中的發起器件(Initiator)通過產生一個請求事務(Request)開始一次操作。該請求包傳送至交換結構器件(Fabric),通常是一個交換機,交換結構器件發出控制符號確認收到了該請求包,然後交換結構將該包轉發至目標器件(Target),這就完成了此次操作的請求過程。目標器件(Target)完成要求的操作,產生響應事務(Response)。通過交換結構(Fabric)將承載該事務的響應包傳送回發起器件(Initiator).傳送時使用控制符號對每一跳(hop)進行確認。一旦響應包到達發起器件(Initiator)並得到確認,就可認為此次操作已經完成。
2.2 包格式
RapidIO包由代表3級規範體系結構的多個欄位組成。下圖顯示了典型的請求包和響應包的格式,這些包的格式屬於並行物理層包格式,序列物理層包的格式與此稍有不同。某些欄位是依賴於具體的上下文的, 並不會在所有的包中出現。
請求包以物理層欄位開始, S位指示這是一個包還是一個控制符號(S=0表示是一個包,S=1表示是控制符號), AckID表明交換結構器件將用控制符號來確認哪一個包。PRIO欄位指示用於流量控制的包優先順序。TT、目標地址( Target Address)和源地址( Source Address)欄位指示傳輸地址的機制型別、包應被傳送到的器件的地址和產生包的器件的地址。Ftype和事務(Transation)指示正被請求的事務。長度(Size)欄位等於編碼後事務的長度, RapidIO事務資料的有效裁荷(Payload)長度從1到256位元組不等。SrcTID(源事務ID)指示事務ID, RapidIO器件在兩個端點器件間最多允許有256個未完成的事務。對於儲存器對映事務,跟隨在srcTID後面的是器件偏移地址 (Device Offset Address ) 欄位。寫事務必須附帶資料的有效裁荷,所有包以16位(2個位元組)迴圈冗餘校驗碼(CRC)結束。
響應包與請求包類似。狀態(Status)欄位指示是否成功完成了事務。目標TID(目標事務ID)欄位的值與請求包中源事務 ID欄位的值相等。下圖是請求包與響應包的包格式示意圖
對於使用者來說,最需要關注的就是邏輯層(上圖中藍色部分)各個欄位的含義,邏輯層中Ftype與Ttype(Ttype欄位和上圖中的Transaction欄位是同一個欄位,只不過叫法不同而已)兩個欄位唯一的確定了這個請求包的功能。下表列出了Ftype與Ttype所確定的包含義
Ftype (Format Type) |
Ttype (Transaction Type) |
包型別
|
功能 |
0~1 |
—— |
Reserve |
無 |
2 |
4’b0100 |
NREAD |
讀指定的地址 |
4’b1100 |
ATOMIC increment |
先往指定的地址中傳遞資料,在把傳遞的資料加1,此操作為原子操作,不可打斷 |
|
4’b1101 |
ATOMIC decrement |
先往指定的地址中傳遞資料,在把傳遞的資料減1,此操作為原子操作,不可打斷 |
|
4’b1110 |
ATOMIC set |
把指定地址中的資料每個bit全部寫1 |
|
4’b1111 |
ATOMIC clear |
把指定地址中的資料清0(每個bit全部清零) |
|
3~4 |
—— |
Reserve |
無 |
5 |
4’b0100 |
NWRITE |
往指定的地址寫資料 |
4’b0101 |
NWRITE_R |
往指定的地址寫資料,寫完成以後接收目標器件(Target)的響應 |
|
4’b1101 |
ATOMIC test/swap |
對指定地址中的資料進行測試並交換,此操作為原子操作,不可打斷 |
|
6 |
4’bxxxx |
SWRITE |
以流寫方式寫指定的地址,與NWRITE以及NWRITE_R相比,此方式效率最高 |
7 |
—— |
Reserve |
無 |
8 |
4’b0000 |
MAINTENANCE read request |
發起讀配置,控制,狀態暫存器請求 |
4’b0001 |
MAINTENANCE write request |
發起寫配置,控制,狀態暫存器請求 |
|
4’b0010 |
MAINTENANCE read response |
產生讀配置,控制,狀態暫存器響應 |
|
4’b0011 |
MAINTENANCE write response |
產生寫配置,控制,狀態暫存器響應 |
|
4’b0100 |
MAINTENANCE write resquest |
埠寫請求 |
|
9 |
—— |
Reserve |
無 |
10 |
4’bxxxx |
DOORBELL |
門鈴 |
11 |
4’bxxxx |
MESSAGE |
訊息 |
12 |
—— |
Reserve |
無 |
13 |
4’b0000 |
RESPONSE no data |
不帶有效資料的響應包 |
4’b1000 |
RESPONSE with data |
帶有效資料的響應包 |
|
14~15 |
—— |
Reserve |
無 |
2.3 事務格式與型別
RapidIO事務的型別大概有以下幾種:
功能 |
事務型別 |
I/O非一致功能 |
NREAITED(讀非共享儲存器) |
NWRITE、NWRITE_R、SWRITE(寫非共享儲存器) |
|
原子(ATOMIC)(讀-修改-寫至非共享儲存器) |
|
基於埠的功能 |
門鈴(DOORBELL)(產生中斷) |
訊息(MESSAGE)(對埠寫) |
|
系統支援功能 |
維護(MAINTENANCE)(讀寫配置、控制、狀態暫存器) |
使用者定義功能 |
對專用事務開放 |
快取記憶體一致性功能 |
讀(READ)(讀全域性共享快取記憶體器) |
READ_TO_DOWN(寫全域性共享快取記憶體器) |
|
拋棄(CASTOUT)(交出全域性共享快取記憶體器擁有權) |
|
IKILL(指令緩衝失效) |
|
DKILL(資料緩衝失效) |
|
重新整理(FLUSH)(返回全域性共享快取記憶體器至儲存器) |
|
IO_READ(讀非緩衝全域性共享快取記憶體器的副本) |
|
作業系統支援功能 |
TLBIE(TLB失效) |
TLBSYNC(TLB強迫完成失效) |
2.4 訊息傳遞
當資料必須被系統中的多個處理器件共享時,必須由協議維護和管理多個器件對共享資料的臨時佔用,許多嵌入式系統用軟體機制實現該協議。如果儲存器空間可被多個器件訪問,可以使用鎖或者訊號量來保證器件間正確的訪問次序。在其他情況下,處理部件可能只有訪問本地儲存器空間的權利,在這些“非共享”的系統中,需要一種機制把資料從一個處理器件傳遞到另一個器件。使用訊息傳遞(Message Passing)信箱(Mailbox)可以實現這種機制。
RapidIO提供了一種有用的訊息傳遞機制, RapidlO訊息傳遞協議描述了支援信箱和門鈴通訊的事務。RapidIO信箱是一個埠,器件間可通過它傳送訊息。接收器件在訊息到達後對其進行處理。RapidIO訊息的長度從0到4096位元組不等。一個接收器件有1~4個可定址訊息佇列來捕獲輸人的訊息。
RapidIO門鈴 (Doorbell )是一種基於埠的輕量級事務,可用於帶內(in-band)中斷。門鈴訊息包括一個由軟體定義的16位欄位,該欄位可用來在兩個器件間傳達多種不同意圖的訊息。
2.5 全域性共享儲存器
支援全域性共享的分散式儲存器系統是RapidIO協議的擴充套件功能之一。這意味著可以把儲存器放到系統中不同的物理位置上, 可以正確地在不同處理器件間快取。
RapidIO制定了一種基於目錄的一致性解決方案來支援這種方法。使用這種方法,每個儲存器控制器都有責任跟蹤每個資料元素的當前副本在系統中位於什麼位置,為一致域中的每個器件維護一個目錄,跟蹤每個器件的修改、共享、位置(MSL)等簡単的一致性狀態。
2.6 流量控制
流量控制是任何互連技術的重要內容。流量控制是指在任意時間互連技術採用某些規則和機制,根據這些規則和機制決定任意時間從可能獲得的若干事務中選擇哪一事務進行傳送。流量控制的目的是使器件完成系統中的事務,避免被其他事務阻塞。基於匯流排的互連技術使用仲裁演算法來確保器件進行恰當的轉發操作,確保高優先順序的事務優先於低優先順序的事務得到轉發。採用交換的互連技術,事務從系統的不同位置進入,從而無法使用集中式的仲裁機制。這就需要一種管理系統中的事務流的方法。RapidIO使用若干補充機制來獲得系統中平穩的資料流並避免系統死鎖。
2.7 序列物理層
RapidIO邏輯層的包被定義為一連串的位元,並且與物理層實現無關。這意味著RapidIO協議在序列與並行介面,銅線與光纖介質下都能正常工作。在Xilinx FPGA中已經集成了GTP,GTX或GTH等高速序列收發器,所以在FPGA實現RapidIO高速傳輸協議都是採用的序列物理層而並非並行物理層。序列物理層使用8B/10B編碼用到的字元(K碼)完成定界,利用這種方式,傳送器件使用K碼作為定界符,為接收器件指明包或控制符號的開始和結束。
序列RapidIO規範使用物理編碼子層(PCS)和物理媒介附屬子層(PMA)在傳送方將包轉化成序列位元流。並在接收方提取出該位元流。除了在傳送前進行編碼和在接收後進行解碼操作,PCS層還負責空閒序列(idle sequence) 產生、通道分段(lane striping)、通道對齊(lane alignment)、以及接收方通道合併(lane destriping)的操作。PCS層使用8B/10B編碼技術在鏈路上傳送資料,8B/10B編碼模組把8位資料編碼轉換為10位做據,編碼後的資料包括原始資料和可恢復的時鐘資訊。PCS層還提供了一種機制,用於自動決定埠的工作模式是在單通道(1-lane)模式還是四通道(4-lane)模式。PCS層也可彌補傳送方和接收方之間的時鐘差。
PMA層負責逐個通道地將10位並行碼組(code-group)資料序列化為序列位元流或將序列位元流並行化為10位並行碼組資料。接收資料時, PMA層獨立地、逐個通道地將接收到的位元流對齊到10位碼組邊界,然後向PCS層提供連續的10位碼組流,每一通道分配一個碼組流,10位碼組對於PCS層以上各層是不可見的。
三、I/O邏輯操作與包格式
3.1 引言
I/O邏輯操作支援RapidIO儲存空間的基本讀寫,它可以通過請求和響應事務對來完成。請求和響應事務對穿越 RapidIO交換結構執行, 但當事務穿越交換結構時RapidIO交換結構並不跟蹤該事務。從交換結構的角度看, 請求事務和與之對應的響應事務間並沒有明確的關係。雖然系統中可能存在多箇中間交換器件和由此引起的多次包轉發,但是從RapidlO邏輯層的角度來說,請求事務和響應事務只有一個(如果需要響應的話),中間交換器件不區分請求和響應事務,它們的作用只是轉發事務到它們的最終目的地。
在 RapidIO體系結構中定義了6種基本的I/O操作, 下表給出了這6種基本的I/O操作、用來執行相應操作的事務和對操作的描述,
操作 |
使用的事務 |
描述 |
讀 |
NREAD、RESPONSE |
從目標器件中讀資料 |
寫 |
NWRITE |
往目標器件中寫資料 |
有響應寫 |
NWRITE_R、RESPONSE |
往目標器件中寫資料,寫完後等待目標的響應 |
流寫 |
SWRITE |
面向大資料量DMA傳輸優化寫資料 |
Atomic |
ATOMIC、RESPONSE |
原子操作,讀-修改-寫,事務不能被打斷 |
維護 |
MAINTENANCE |
以RapidIO專用暫存器為目標的事務 |
3.2 請求包格式
RapidIO處理器發起一個請求包給目標器件(Target),目標器件收到這個請求包以後給一個響應包到處理器(前提是這個請求包需要目標器件的響應),比如儲存器讀操作。一個典型的請求包的格式如下圖所示
對於使用者來說,最需要關注的就是邏輯層(上圖中藍色部分)各個欄位的含義,Ftype與Ttype兩個欄位唯一的確定了包的型別,具體的對應關係請參考2.2節。邏輯層各個欄位的含義如下表所示
欄位 |
含義 |
Ftype |
格式型別(Format Type),與Ttype共同唯一的確定包的格式 |
Ttype |
事務型別(Transaction Type),與Ftype共同唯一的確定包的格式 |
Wrsize/Rdsize |
此欄位根據包的型別來決定是寫事務資料的大小還是讀事務資料的大小,這個欄位配合wdptr(word pointer)欄位一起使用 |
Src TID |
包的事務ID(Transaction ID)號 |
Extended Address |
擴充套件地址,這是一個可選欄位,指定50-bit實體地址的高16-bit或者66-bit實體地址的高32-bit |
Address |
29-bit的實體地址,由於RapidIO傳輸以一個雙字(double-word)為基本單元,大多數嵌入式系統是32位的,所以一個字(word)佔用4個位元組,一個雙字(double-word)佔用8個位元組,所以29-bit的實體地址指向的一個儲存單元實際上是佔用8個位元組的,這樣用29-bit的實體地址實際上可以訪問4G(2^32)的記憶體空間 |
Wdptr |
字指標(Word pointer),配合Wrsize/Rdsize欄位來指明資料的大小以及對齊方式,詳細的說明請檢視RapidIO_Rev_2.2_Specification第33頁 |
Xamsbs |
擴充套件地址最高位(Extended address most significant bits),把實體地址進一步擴充套件2位,由於29-bit的地址已經可以訪問4G記憶體空間,在最高位擴充套件2位以後就可以訪問16G的記憶體空間 |
Data Payload |
要傳輸的資料 |
3.3 響應包格式
當一個RapidIO端點完成由另一個RapidIO端點發起的請求時,該端點就會發送一個響應事務。響應事務包總是以與請求事務包相同的方式被髮送和路由。從廣義上說,第12、13、14 和15類格式(Ftype=12表示的就是第12類格式)是響應類事務的格式。通常,第 12和14類是保留的,第15類由具體應用定義, 第13類才是主要的響應類事務。第13類包格式返回狀態,資料(如果需要)和請求者的事務ID。帶有“ERROR”狀態或沒有預期的資料裁荷的響應的RESPONSE包沒有資料載荷。響應包使用第13類格式來響應除維護和無響應寫之外的所有請求包。維護響應包響應維護請求。一個典型的響應包的格式如下圖所示
邏輯層各個欄位的含義如下表所示
欄位 |
值 |
含義 |
Ftype |
4’b1101 |
格式型別(Format Type),與Ttype唯一的確定包的格式,對於一個有效的響應包來說,此欄位的值固定為4’b1101,也就是16進位制的d |
Ttype |
4’b0000 |
不攜帶資料的響應 |
4’b0001~4’b0111 |
保留 |
|
4’b1000 |
攜帶資料的響應 |
|
4’b1001~4’b1111 |
保留 |
|
Status |
4’b0000 |
DONE狀態:表示請求事務得到了正確的響應 |
4’b0001~4’b0110 |
保留 |
|
4’b0111 |
ERROR狀態:表示請求事務出現了不可恢復的錯誤,未能得到正確的響應 |
|
4’b1000~4’b1011 |
保留 |
|
4’b1100~4’b1111 |
使用者自定義響應 |
|
Target TID |
—— |
目標事務ID(Transaction ID)號 |
Data Payload |
—— |
響應包攜帶的資料,如果是不攜帶資料的響應,那麼這個欄位就不存在 |
3.4 常用的I/O邏輯操作事務
1、讀操作(NREAD)
讀操作由一個NREAD事務和一個RESPONSE事務組成,NREAD事務由請求方(Requestor)發起,目標方(Destination)正確的處理請求方發過來的響應以後會給請求方反饋正確的響應以及請求方讀取的資料。整個操作的示意圖如下所示
2、寫操作(NWRITE)和流寫操作(SWRITE)
寫操作(write operations)和流寫操作(streaming-write operations)分別由NWRITE和SWRITE事務組成。請求方可以用這兩種事務往目標方指定的地址寫入資料。NWRITE事務允許多個雙字(double-word),字(word),半字(half-word)和位元組(byte)作為資料負載(Data Payload)進行傳輸,但前提是必須對資料進行適當的補0(padded)並進行8位元組邊界對齊。而SWRITE事務相當於用NWRITE事務傳輸雙字(double-word)的情況,並且SWRITE事務具有更少的頭部開銷(SWRITE事務的包格式中把Ttype,Rdsize/Wrsize和srcTID三個欄位全部定義為了Extended Address欄位的一部分,所以頭部開銷變少)。NWRITE事務和SWRITE事務不需要接收目標方的響應,所以當事務被目標方處理完以後並不會給發起方反饋任何資訊。NWRITE事務與SWRITE事務的操作示意圖如下圖所示
3、帶響應的寫操作(NWRITE_R)
帶響應的寫操作(write-with-response operations)由NWRITE_R事務和RESPONSE事務組成。它的整個請求操作和NWRITE事務的請求操作完全相同,但是在目標方正確處理請求方的NWRITE_R事務以後,目標方會給請求方反饋一個響應包告訴請求方事務已經被正確的處理。這種機制可以有效的保證資料傳輸的穩定性。NWRITE_R事務的處理流程如下圖所示
4、原子操作(Atomic Operations)
原子操作(Atomic Operations)又叫做讀-修改-寫操作(Read-modify-Write Operations),它是由ATOMIC事務和RESPONSE事務組成,許多協處理器單元使用該操作來執行非一致性(non-coherent)儲存器的同步。它允許攜帶的資料量為一個字(4個位元組),一個半字(2個位元組)或者一個位元組,其他資料量都是不被允許的。
原子操作既包含了讀操作,也包含了寫操作。目標方讀取指定地址的資料,並把讀取的資料返回給請求方,然後對資料執行相關的操作,最後在寫回指定的地址。這個過程不會被任何其他的事務干擾或者打斷。對資料執行的操作包括加1運算(increment),減1運算(decrement),測試和交換(test-and-swap),置1操作(set)和清0操作(clear),在這些操作中,只有測試和交換(test-and-swap),比較和交換(compare-and-swap)以及交換(swap)需要處理單元提供資料。原子操作的目標資料可以用NWRITE事務進行初始化。原子操作的整個操作示意圖如下圖所示
四、維護操作與包格式
第8類事務維護事務用於訪問 RapidIO能力暫存器(CARs,Capability Registers)、命令和狀態奇存器( CSRs,Command and Status Register) ,本地定義的暫存器(Locally-Refined Registers)以及資料結構(Data Structures)。與其他的請求格式不同,維護操作的請求和響應包格式都是第8類包格式。第8 類包不含地址欄位,只含寫請求和讀響應的資料載荷。
WRSIZE欄位規定了多雙字事務資料載荷的最大長度。資料載荷的長度不能超過這個最大長度,但是如果需要的話,可以比這個最大長度小。維護讀請求和維護請求都產生正確的維護響應 。
維護事務的請求包格式如下圖所示
維護事務的響應包格式如下圖所示
維護事務包格式中邏輯層各個欄位(Hopcount欄位不屬於邏輯層,下表同樣列出它的含義)的含義如下表所示
欄位 |
值 |
含義 |
Ftype |
8 |
第8類事務代表維護類事務,維護類事務中這個欄位固定為8 |
Ttype |
4’b0000 |
指定一個維護讀請求 |
4’b0001 |
指定一個維護寫請求 |
|
4’b0010 |
指定一個維護讀響應 |
|
4’b0011 |
指定一個維護寫響應 |
|
4’b0100 |
指定一個維護寫埠請求 |
|
4’b0101~4’b1111 |
保留 |
|
Hopcount |
|
跳數是一個8-bit欄位,用於確定維護事務的目標交換器件。RapidIO交換器件沒有器件ID,跳數是可供選擇的定址交換器件機制 |
Config Offset |
|
用於讀寫CAR/CSR暫存器的雙字偏移量 |
Src TID |
|
維護請求包的事務ID |
Target TID |
|
維護響應包的事務ID |
Status |
4’b0000 |
DONE狀態:表明請求的事務成功完成 |
4’b0001~4’b0110 |
保留 |
|
4’b0111 |
ERROR狀態:檢查到不可恢復的錯誤 |
|
4’b1000~4’b1011 |
保留 |
|
4’b1100~4’b1111 |
使用者定義 |
維護操作由維護請求事務和維護響應事務組成,處理器可以通過這類事務訪問CARs/CSRs等暫存器中的資料。如果發起的維護請求事務需要一個響應,那麼目標方正確處理了維護請求事務以後會給請求方反饋一個維護響應包而不是由NWRITE_R事務或NREAD事務產生的正常響應包。它支援讀取配置暫存器的操作執行長度是字(4位元組),也可以是雙字( 8位元組)或設計者自已指定的雙字的整數倍長,但執行長度最多不得超過64 位元組。所有寫配置暫存器的操作的執行長度規定與讀操作相同。維護操作的示意圖如下圖所示
五、訊息操作與包格式
5.1 引言
分散式處理系統的一般方法是使用連線到分散式儲存器部件的緊耦合處理器。這些處理器可能執行在一個単獨的作業系統下。例如,,一個單Linux系統可以在最多數十個處理器上有效地執行。通常一個單作業系統的任務是管理處理器組和儲存器組。多數情況下,處理器可以高效地計算出通用硬體維護的一致性儲存器空間。這允許處理器通過使用訊號量(semaphores )、自旋鎖(spin lock)和處理器間中斷來解決任務的初始化和完成的通訊問題。作業系統使用頁保護方案集中管理儲存器。這種多處理技術十分成熟,已經使用了幾十年。
在其他分散式系統中,處理器和儲存器的耦合度可能鬆一些。若干作業系統或者核心可能在同一系統中共存,每個核心負責整個系統的一小部分。這些核心可能來自不同的軟體供應商,可能執行在不同的處理器體系結構上。在這些系統中使用簡單的通訊機制是十分有用的;核心可以使用該機制與系統內的其他核心通訊。例如,執行Linux的PowerPC處理器可能與執行QNX的TigerSHARC數字訊號處理器通訊。對於一個給定的應用,可能沒有理由在這些器件間共享儲存器空間。在這種型別的系統中,需要一種在所有器件上可用的通用硬體和軟體介面機制來簡單、經濟地完成高效能通訊。在這些系統中,處理器之間通過訊息傳遞進行通訊。
在這些訊息傳遞系統中,經常使用兩種機制將命令或資料從一個器件移動到另一個器件, 第一種機制稱為直接儲存器訪問(DMA),第二種稱為訊息(Message)。這兩種模型的主要差別是,DMA事務由源端操縱,而訊息由目標端操縱。這意味著DMA源端不僅需要訪問目標,還必須具有對目標的地址空間的可見性。訊息的源端僅需訪問目標,而不需要對目標地址空間的可見性。在分散式系統中,通常DMA和訊息機制是結合使用的。
RapidIO體系結構包括一種可以用於訊息的包傳輸機制。RapidIO訊息模型應滿足下列目標:
1、訊息由一個或多個事務組成,這些事務可以通過無序的互連發送和接收。
2、傳送者可以有多個正在排隊等待發送的未完成的訊息。
3、傳送者可以在低優先順序訊息前傳送高優先順序訊息,也可以為了傳送一個高優先順序訊息而搶佔低優先順序訊息,並在高優先順序訊息完成後恢復低優先順序訊息(基於優先順序的併發性)。
4、傳送者無需瞭解接收者的內部結構或儲存器對映。
5、訊息接收者控制它本身的本地地址空間。
6、如果需要,接收者可以有多個未完成的正在排隊等待服務的訊息。
7、如果需要,接收者可以接收多個併發的多事務(multiple-transaction)訊息。
RapidIO訊息傳遞邏輯規範定義了兩種不同的包格式用於訊息事務。第10類包格式用來發送非常短的16位資料載荷,第10類包也稱為門鈴(DOORBELL)事務,門鈴事務很適合傳送處理器間的中斷。多事務訊息用第11類包傳送最多4096位元組的資料載荷。下面將分別介紹兩種事務,
5.2 門鈴事務(DOORBELL)
第10類包格式是門鈴事務格式。它沒有資料載荷。門鈴事務的請求包格式如下圖所示
上圖中Ftype欄位固定為10,表示這是一個門鈴事務,8位的Reserved欄位應該置0,Source TID指的是請求方的事務ID, info(msb)表示的是傳送資訊的高8位,info(lsb)表示的是傳送資訊的低8位。如果資訊是用數字表示的,而且長度大於8位,那麼資料符合低地址存放高位元組(big-endian)的格式。位元流中先到達的是高位元組。門鈴事務適合向處理器遞送中斷資訊,在這種情況下,資訊欄位用來向接收者傳遞中斷級別和目標資訊,除此以外,還可以在處理器件間傳送訊號量。
一個完整的門鈴操作由DOORBELL事務和RESPONSE事務(通常是DONE響應)組成。處理單元用這個操作將非常短的訊息通過互連結構傳送到另一個處理器部件。門鈴事務包括用於保持事務資訊的資訊欄位。該事務沒有資料載荷。它的資訊欄位是由軟體定義的,可以用子任何目的。通常,執行在處理器上的作業系統會定義門鈴事務使用的資訊欄位的意義。收到門鈴事務的處理器部件將包放進處理器部件中的門鈴訊息佇列,該佇列可以在硬體或者本地儲存器中實現。一個完整的門鈴操作如下圖所示
5.3 訊息事務
第11類包為訊息事務格式包。第11類包總有資料載荷,並且資料載荷長度總是雙字(64-bits或8-bytes)長度的整數倍。沒有規定子雙字(sub-double-word)訊息,如果需要的話,可以由軟體管理子雙字訊息。一個訊息請求包的格式如下圖所示
圖中邏輯層各個欄位的含義如下表所示
欄位 |
值 |
含義 |
Ftype |
11 |
Ftype=11表示這是一個MESSAGE事務 |
Msglen |
|
訊息長度(Message Length):指的是組成該訊息的包的總數。值為0時表明該包是一個單包訊息,值為15(4’b1111)時,表明這是一個由16個包組成的訊息。 |
Ssize |
|
標準訊息包資料大小(Stardard message packet data size)。該欄位告訴訊息接收者一個單獨訊息操作除訊息中最後一個包外組成訊息的所有包的資料載荷大小。這樣可以防止傳送者過度延長最後一個包的資料欄位並允許接收者正確的將包放入本地儲存器 |
4’b0000~4’b1000 |
保留(Reserved) |
|
4’b1001 |
8位元組(byte) |
|
4’b1010 |
16位元組(byte) |
|
4’b1011 |
32位元組(byte) |
|
4’b1100 |
64位元組(byte) |
|
4’b1101 |
128位元組(byte) |
|
4’b1110 |
256位元組(byte) |
|
4’b1111 |
保留(Reserved) |
|
Letter |
|
信件。該欄位用來識別信箱(MailBox)中的一個槽(SLOT)。該欄位允許傳送方同時傳送最多4個訊息到接收方的同一個信箱中 |
Mbox |
|
信箱(MailBox)。該欄位用來指定目標處理部件中的接收信箱 |
Msgseg |
|
訊息段(Message Segment)。該欄位用來表明該包是組成訊息的包中的第幾個包。值為0表明該包是訊息的第一個包。值為15(4’b1111)表明該包是訊息的第16個包。 |
Xmbox |
|
對於單包資料訊息事務,該欄位用來指明目標信箱的高四位。該欄位與Msgseg佔用相同的欄位。Xmbox欄位和mbox欄位組合使用的定義如下: xmbox || mbox : mailbox number 0000 00 : mailbox 0 0000 01 : mailbox 1 0000 10 : mailbox 2 0000 11 : mailbox 3 0001 00 : mailbox 4 …… 1111 11 : mailbox 63 |
儘管RapidIO規範使用信箱(MailBox)、信件(Letter)和訊息分段(Message Segment)之類的術語,但是這些欄位在邏輯上指的是一個8位的訊息識別符號資訊。訊息識別符號資訊可以用來惟一的標識和管理任意兩個處理部件之間最多256個不同的訊息流。接收處理部件的訊息傳遞硬體會根據該資訊計算應該把事務資料存放在本地儲存器的什麼位置。
例如,假設接受處理部件的信箱0、信箱1、信箱2和信箱3的起始地址分別為地址0x1000、0x2000、0x3000和0x4000,處理部件接收到的訊息事務帶有下列欄位:
A、訊息長度為6個包(msglen = 4’b0110)
B、訊息段是第3個包(msgseg = 4’b0011)
C、信箱為信箱2(mbox = 2’b10)
D、信件為1(letter = 2’b01)
E、標準大小為32位元組(ssize = 4’b1011)
F、資料載荷為32位元組(由於這不是最後一個事務, 所以資料載荷應該是32位元組)
處理部件的訊息傳遞硬體使用這些資訊來決定將這部分資料訊息所含32位元組資料存放到本地儲存器地址0x3040。
目標地址 = 信箱2基地址(Mailbox_2_base) + (訊息分段x標準長度)
0x3040 = 0x3000 + (0x0002 x 0x0020)
這個簡單的定址結構使得接收處理部件很容易計算儲存訊息資料的目標儲存結構的地址。不僅計算起來容易,而且接收者的目標儲存器結構的位置對傳送者也是不可見的。這允許僅在處理器部件間提供基於訊息通訊的安全系統研發工作。
訊息的響應事務也是由第13類包產生,與NREAD事務和NWRITE_R事務響應包不同的是,訊息事務的響應包中的target_info欄位佔用了普通響應包中的target ID欄位的位置,具體的響應包格式見下圖
其中訊息響應包中邏輯層Ftype欄位,Ttype欄位,Status欄位以及Data Payload欄位的含義與普通響應包中各欄位的含義完全相同, Target_info欄位由letter,mbox和msgseg三個欄位組成,這三個欄位的含義與訊息請求包中這三個欄位的含義完全相同,這裡不再贅述。
由訊息和響應(一般是DONE響應)事務組成的資料訊息操作如下圖所示,處理部件的支援訊息傳遞的硬體用它向另一個處理部件傳送資料訊息。完成一次資料訊息操作最多需要16個單獨的訊息事務。訊息事務資料載荷的大小是雙字長度(8個位元組)的整數倍。最大的訊息操作載荷是4096位元組,該載荷由16個訊息事務組成,每個事務攜帶256位元組的資料載荷。信件( letter),信箱(mbox)和訊息段(msgseg)組合在一起,惟一地標識系統中每個請求和響應部件對的訊息包,與其他請求型別使用的事務 ID的作用一樣。
六、總結
RapidIO的事務大致就上面幾種,下圖把所有的事務都放在一起以便於大家更快的檢視相關的包格式與各個欄位的位置。
這裡有幾點值得注意的是:
1、 每個包的邏輯層欄位與上文所講的各個包的邏輯層欄位定義完全相同
2、 上圖物理層欄位的前10位所代表的欄位ackID,rsvd,crf以及prio與正文中包格式的物理層欄位有所出入,經過我查閱RapidIO協議的官方手冊,確實是上圖(上圖來源於Xilinx的pg007中168頁)欄位定義有問題,所以關於物理層欄位定義以正文所講的為準。寫程式碼的時候只需要關注邏輯層就可以了,所以這個問題也不用太過於糾結,知道就好。
3、 上圖每個包CRC欄位的後面還有一些欄位是正文中包格式所沒有講到的。這裡特地解釋一下:由於RapidIO包的總長度大於80個位元組以後,RapidIO包會對前80個位元組生成一個2位元組CRC碼並補0湊滿80位元組使位元組邊界對齊。然後80位元組以上的資料放在處理完畢以後的資料後面繼續傳送,傳送完畢以後生成第二個CRC碼並補0使位元組邊界再次對齊。所以會出現後面的那些欄位。後面我會寫一篇部落格教大家怎麼使用RapidIO核,到時候看完這種情況的時序就能明白這個過程了。