目錄
前言
本文對SRIO的基礎理論進行學習和整理,部分內容來自參考文獻。
詳細文檔可以參考ISE產生的IP CORE 芯片手冊《LogiCORE IP Serial RapidIO Gen2 Endpoint v1.5》,這個手冊與vivado產生的手冊會有一點差異。
1、SRIO物理層LP-Serial串行接口
2、User Interface
2.1 I/O端口(I/O Port)
I/O端口能被配置爲兩種類型:Condensed I/O或Initiator/Target。這兩種類型可以在IP核的配置中進行選擇。I/O端口的數據流協議是AXI4-Stream協議,它支持兩種類型的包格式,分別是HELLO格式與SRIO Stream格式。
Condensed I/O端口類型減少了用於發送和接收I/O包的端口數目。它只用一個AXI4-Stream通道來發送所有類型的包,同樣,也只用一個AXI4-Stream通道去接收所有類型的包。Condensed I/O端口示意圖如下:
Initiator/Target端口類型把請求事務與響應事務分別處理,所以一共有4個AXI4-Stream通道用於I/O事務的傳輸。Initiator/Target端口的示意圖如下圖所示,其中灰色的箭頭表示請求事務,黑色的箭頭表示響應事務。
端口名 | 相對SRIO IP數據方向 | 作用 |
1、ireq | 數據輸入 | 給SRIO IP發送待轉發的REQ,SRIO通過srio_txn0/srio_txp0將req請求發送給遠端設備。 |
2、iresp | 數據輸出 | SRIO IP接收到ireq對應的響應,即遠端設備返回對應的response,本地設備進行數據接收。 |
3、treq | 數據輸出 | SRIO IP接收到遠端設備的request請求。 |
4、tresp | 數據輸入 | 給SRIO IP發送待轉發的response,即本地設備給遠方設備發送response響應。 |
2.2 消息端口(Messaging Port)
消息端口是一個可選的接口,消息事務既能在I/O端口上發送,也能在獨立的消息端口上發送。獨立的消息端口類型爲Initiator/Target類型。下圖是消息端口的示意圖。
消息接口與IO接口使用方式類似。
2.3 寄存器空間(Register Space)
2.4 數據包格式
(1)SRIO包格式
(2)SRIO包類型
SRIO包的類型由Ftype和TT共同決定。最重要的三種類型爲NREAD(基本讀操作)、NWRITE(基本寫操作)、Doorbell(門鈴操作),通過這三種類型的組合就可以完成所有的存儲器讀寫操作。
包類型 | Ftype設置 | TType設置 |
NREAD | 2 | 0b0100 |
NWRITE | 5 | 0b0100 |
Doorbell | 10 | -- |
(3)HELLO包格式
在下圖中55位中 “ FType2 ” , 表示FType值=2。
此外,需要注意:下面ISE產生IP 手冊中的hello包格式,與vivado產生的略有不同。vivado的手冊中,多了一個data stream包格式。
傳輸的數據量小於8字節(Sub-DWORD Accesses):
對於傳輸的數據量小於8字節的情況,address字段和size字段用來決定有效的字節位置(tkeep信號必須爲0xff),但是僅僅能導致RapidIO包中rdsize/wrsize和wdptr爲有效值的address和size值組合纔是被允許的,下圖是HELLO格式中address和size兩個字段與有效字節位置的對應關係示意圖(圖中灰色部分爲有效字節位置)
例如,對size=2,address=34’h1_1234_5675這兩個組合來說,由於size=2,所以往address中寫入的數據個數爲3(size+1)個字節,而address的最低3位爲5(3’b101),通過上圖可知,有效字節的位置是第7、6、5三個字節。對於size和address[2:0]值的組合不在上圖中的情況都是非法的,這是應該避免的,比如,size=2, address=34’h1_1234_5673這種組合就屬於非法的組合。
傳輸的數據量大於8字節(Large Accesses):
對於傳輸的數據量大於8字節,並且地址的起始字節偏移不爲0的情況必須把數據分成多次進行傳輸,其中未對齊的小於8字節的段就可以通過上圖中size和address的有效組合來確定有效字節的位置。
因此,對於數據量爲1個雙字(8個字節)或更大的情況,address的最低3位必須爲0,RapidIO手冊給讀寫事務定義了範圍從1到256個字節的可支持的數據量。請求事務的數據量如果大於一個雙字(8個字節),那麼數據量應該通過四捨五入到最接近的支持的值。讀寫事務有效的HELLO格式的數據量爲:7,15,31,63,95(僅支持讀事務),127,159(僅支持讀事務),191(僅支持讀事務),223(僅支持讀事務)和255。
2.5 時鐘
幾種推薦的典型時鐘
2.6 復位
每個時鐘域都有相關聯的復位信號。復位信號應該至少在各自的時鐘域中保持4個時鐘週期,如果RapidIO核的通道寬度減少導致phy_clk的時鐘頻率降低,那麼復位信號仍然需要保持至少4個時鐘週期。復位參考設計模塊(srio_rst.v)有一個單復位輸入sys_rst。這個信號同步於輸入。這個模塊同步復位信號到每個時鐘域並對復位脈衝進行擴展以滿足最小4個時鐘週期的要求。
硬件復位應該被用戶設計產生,當復位RapidIO核的時候必須要注意主機和從機必須同時復位以保證ackID字段對齊,推薦主機和從機的復位信號完全重疊以減少包和控制符號的丟失率。
3、SRIO工程創建
軟件工具ISE14.7
對example design工程進行分析。
3.1 ISE工程創建
在配置下圖的IO端口時,選擇Initiator/Target Legacy;
在配置下圖的Messaging端口時,選擇separate端口,端口通道數與IO口一致。
3.2 架構分析
在對SRIO進行實例化的時候,可以直接使用srio_dut.v (包含下面所有字模塊),作爲SRIO Gen2 Endpoint。
相關介紹見下面手冊。
文件名 | 功能 |
srio_example_top.v | 例子工程的頂層模塊 |
srio_request_gen_1 | 生成請求事務的模塊。它用來產生I/O事務或消息(MESSAGE)事務,但僅僅SRIO核支持的事務類型能被產生,這個模塊也存儲了期望的響應事務並與實際接收到的響應事務進行對比用來確定整個事務交互過程的正確性。 |
srio_response_gen | 這個模塊用來產生有響應事務的響應包 |
srio_request_gen_2 | 生成請求事務的模塊 |
srio_respose_gen | 這個模塊用來產生有響應事務的響應包 |
srio_quick_start | 這個模塊與IP核的維護端口相連,用來發起維護事務。這個模塊用來向本地(Local)或遠程(Remote)的配置寄存器空間發送一組固定的指令集,用戶可以編輯maintenance_list.v來添加、修改或移除維護事務。 |
srio_dut.v | This module instantiates srio_wrapper and the clocking and reset modules. |
srio_clk.v | 時鐘域模塊 |
srio_rst.v | 復位模塊 |
srio_wrapper.v | HDL包裝器文件,用於實例化:SRIO Gen2 Endpoint頂層包裝器,GT包裝器和配置結構參考設計。 |
cfg_fabric.v | 配置結構 |
srio_gt_wrapper_<family>_<width>.v | 收發器包裝文件。其子模塊含有:GT wrapper from 7 series Transceiver Wizard for 7 series FPGA configurations. |
srio_ipcore | |
其他 .v 文件 | |
instruction_list.vh | 這是一個Verilog頭文件,裏面定義了120個事務,它被包含在srio_request_gen.v模塊中,srio_request_gen.v模塊會把裏面的所有事務依次發出去。 |
maintenance_list.vh | 這是一個Verilog頭文件,裏面定義了一些維護事務,它被包含在srio_quick_start.v模塊中,srio_quick_start.v模塊會把裏面的所有維護事務依次發出去用來配置相關寄存器。 |
srio_report.v | 在仿真時,這個模塊用來產生包接收和發送的時間戳,在硬件上運行的時候這個模塊可以刪除 |
srio_statistics.v | 這個模塊用來收集核的統計信息並通過寄存器接口提交一些信息,提交的信息可以通過Vivado的調試特徵以及用戶設計來訪問。 |
srio_sim.v | srio_sim.v是仿真頂層文件,它例化了兩個核,分別是primary和mirror,並把它們連接到一起用於仿真。它也包含了上報測試是否成功的機制與超時(timeout)功能。 |
srio_condensed_gen.v | 當IP核的端口配置爲Condensed I/O模式時,這個文件纔會出現在例子工程中。它用來產生Condensed I/O模式的請求事務。 |
3.3 仿真分析
參考文獻