一、軟件平臺(tái)與硬件平臺(tái)
軟件平臺(tái):
操作系統(tǒng):Windows 8.1 64-bit
開發(fā)套件:Vivado2015.4.2
硬件平臺(tái):
評(píng)估板:ZYNQ-7 ZC706 Evaluation Board
二、介紹
上篇文章的最后一小節(jié)已經(jīng)對(duì)例子工程進(jìn)行仿真并通過(guò)命令 log_wave –r /* 記錄了所有信號(hào)的波形,這篇文章主要介紹RapidIO核的仿真以及包時(shí)序的分析。
調(diào)試SRIO核時(shí)必須對(duì)包在不同接口的傳輸過(guò)程有一個(gè)清晰的了解,能夠識(shí)別出不同接口上包的類型并正確的解析出包的內(nèi)容。
本文詳細(xì)的介紹了SRIO包(控制符號(hào)與數(shù)據(jù)字符)在不同接口上的組成與傳輸過(guò)程,并深入到邏輯層、傳輸層以及物理層來(lái)觀察RapidIO串行物理層包的傳輸細(xì)節(jié)。整個(gè)包與信號(hào)分析的過(guò)程完全基于RapidIO提供的例子工程,例子工程的產(chǎn)生與源代碼的分析已經(jīng)在上一篇文章《Xilinx RapidIO核例子工程源碼分析》(鏈接:https://www.cnblogs.com/liujinggang/p/10091216.html)提到過(guò),這里不再贅述。最后,本文會(huì)利用RapidIO核做一個(gè)回環(huán)測(cè)試(Loopback Test)的工程在ZC706上運(yùn)行,由于RapidIO是一個(gè)付費(fèi)的IP核,所以生成bit文件需要License,沒有License的可以在官網(wǎng)(https://www.xilinx.com/products/intellectual-property/ef-di-srio-gen2.html#overview)申請(qǐng)一個(gè)30天的評(píng)估版License試用,評(píng)估版的License生成的bit文件運(yùn)行一段時(shí)間以后會(huì)自動(dòng)失效,要想永久使用必須購(gòu)買官方的License。
三、例子工程結(jié)構(gòu)
下圖整個(gè)例子工程的結(jié)構(gòu)層次
它由一個(gè)仿真頂層的testbench和兩個(gè)SRIO核頂層組成。其中頂層的testbench文件srio_sim.v連接了兩個(gè)srio例子設(shè)計(jì)頂層,其中一個(gè)例子設(shè)計(jì)頂層叫做srio_example_top_primary,它代表請(qǐng)求方的RapidIO設(shè)備;另一個(gè)例子設(shè)計(jì)頂層叫做srio_example_top_mirror,它代表響應(yīng)方的RapidIO設(shè)備。
SRIO例子工程頂層文件srio_example_top.v例化了SRIO核的所有組件以及需要在硬件上執(zhí)行的必要模塊。這些模塊包括:
1、時(shí)鐘域復(fù)位模塊(srio_clk.v和srio_rst.v)
2、配置結(jié)構(gòu)(cfg_fabric.v)
3、請(qǐng)求事務(wù)與響應(yīng)事務(wù)生成模塊(srio_resquest_gen.v和srio_response_gen.v)
4、維護(hù)事務(wù)生成模塊(srio_quick_start.v)
頂層模塊srio_example_top中例化了srio_quick_start模塊,它與SRIO的維護(hù)端口相連,用來(lái)生成維護(hù)事務(wù)(Maintenance Transactions)。這個(gè)模塊用來(lái)向本地(Local)或遠(yuǎn)程(Remote)的配置寄存器空間發(fā)送一組固定的指令集,用戶可以編輯maintenance_list.v來(lái)添加、修改或移除維護(hù)事務(wù)。
srio_request_gen在頂層模塊srio_example_top進(jìn)行例化,它用來(lái)產(chǎn)生I/O事務(wù)或消息(MESSAGE)事務(wù),但僅僅SRIO核支持的事務(wù)類型能被產(chǎn)生,這個(gè)模塊也存儲(chǔ)了期望的響應(yīng)事務(wù)并與實(shí)際接收到的響應(yīng)事務(wù)進(jìn)行對(duì)比用來(lái)確定整個(gè)事務(wù)交互過(guò)程的正確性。
srio_response_gen也在頂層模塊srio_example_top進(jìn)行例化,它用來(lái)產(chǎn)生請(qǐng)求事務(wù)對(duì)應(yīng)的響應(yīng)事務(wù)。
整個(gè)例子工程結(jié)構(gòu)層次的軟件框架如下圖所示,其中左邊的srio_example_top模塊表示請(qǐng)求方的RapidIO設(shè)備,而右邊的DUT Mirror表示響應(yīng)方的RapidIO設(shè)備,它們的內(nèi)部結(jié)構(gòu)完全相同,區(qū)別僅僅在于一個(gè)作為請(qǐng)求方而另一個(gè)為響應(yīng)方。
SRIO核的原理框圖以及接口如下圖所示
為了方便說(shuō)明,上圖每一個(gè)接口都用相應(yīng)的數(shù)字標(biāo)注出來(lái)。它們分別為
Initiator/Target IO Port(接口1)
例子工程中SRIO核全部為默認(rèn)參數(shù),所以端口類型默認(rèn)被配置為Initiator/Target,在Initiator/Target接口類型中請(qǐng)求事務(wù)與響應(yīng)事務(wù)在不同的AXI4-Stream通道上進(jìn)行傳輸。SRIO核的端口類型也能被配置為Condensed I/O類型,在Condensed I/O接口類型中請(qǐng)求事務(wù)與響應(yīng)事務(wù)在同一AXI4-Stream通道上進(jìn)行傳輸,所以Condensed I/O相比于Initiator/Target類型來(lái)說(shuō)接口更加精簡(jiǎn)。本文仍然采用默認(rèn)的Initiator/Target接口類型來(lái)分析每個(gè)包的傳輸過(guò)程。
接口1的數(shù)據(jù)傳輸協(xié)議為AXI4-Stream協(xié)議,它的接口定義如下:
s_axis_ireq_* 表示Initiator請(qǐng)求事務(wù)的傳輸通道(i = initiator ,req = request)
m_axis_iresp_* 表示Initiator響應(yīng)事務(wù)的傳輸通道(i = initiator ,resp = response)
m_axis_treq_* 表示Target請(qǐng)求事務(wù)的傳輸通道(t = target ,req = request)
s_axis_iresp_* 表示Target響應(yīng)事務(wù)的傳輸通道(t = target , resp = response)
Maintenance Port(接口2)
接口2的數(shù)據(jù)傳輸協(xié)議為AXI4-Lite協(xié)議,用來(lái)傳輸維護(hù)事務(wù)。它的接口定義如下:
s_axi_maintr_* 表示維護(hù)事務(wù)的傳輸端口(maintr = maintenance)
LOG Configuration Fabric(接口3)
接口3的數(shù)據(jù)傳輸協(xié)議為AXI4-Lite協(xié)議,它是邏輯層的配置結(jié)構(gòu)端口,包括本地(Local)配置端口和遠(yuǎn)程(Remote)配置端口。它的接口定義如下:
s_axi_cfgl_* 表示本地配置端口(cfg = configuration,l = local)
m_axi_cfgr_* 表示遠(yuǎn)程配置端口(cfg = configuration,r = remote)
LOG Transport Interface(接口4)
接口4的數(shù)據(jù)傳輸協(xié)議為AXI4-Stream協(xié)議,它是邏輯層與Buffer的數(shù)據(jù)傳輸接口,包括發(fā)送和接收兩個(gè)通道。它的接口定義如下:
m_axis_buft_* 表示發(fā)送端口(buf = buffer,t = transmit)
s_axis_ bufr_* 表示接收端口(buf = buffer,r = receive)
BUF Link Interface(接口5)
接口5的數(shù)據(jù)傳輸協(xié)議為AXI4-Stream協(xié)議,它是Buffer層與物理層的數(shù)據(jù)傳輸接口,包括發(fā)送和接收兩個(gè)通道。它的接口定義如下:
m_axis_phyt_* 表示發(fā)送端口(phy= physical,t = transmit)
s_axis_ phyr_* 表示接收端口(phy = physical,r = receive)
BUF Configuration Fabric(接口6)
接口6的數(shù)據(jù)傳輸協(xié)議為AXI4-Lite協(xié)議,它是Buffer層的配置端口。它的接口定義如下:
s_axi_bcfg_* 表示Buffer層配置端口(b = buffer,cfg = configuration)
PHY Serial Interface(接口7)
接口7為物理層串行鏈路接口,它是物理層數(shù)據(jù)與串行收發(fā)器(Serial Transceivers)數(shù)據(jù)交換通道,它的接口定義如下所示:
信號(hào) |
方向 |
功能 |
gttx_data[32*LW-1 : 0] |
Output |
發(fā)送給串行收發(fā)器(Serial Transceivers)的數(shù)據(jù) |
gttx_charisk[4*LW-1 : 0] |
Output |
gttx_data信號(hào)中有效字節(jié)指示信號(hào)。當(dāng)這個(gè)信號(hào)某一位為0時(shí),gttx_data中對(duì)應(yīng)的字節(jié)為包的有效字節(jié)。 |
gttx_inhibit[LW-1:0] |
Output |
串行收發(fā)器的通道使能位。如果最低位(bit-0)為1,表示發(fā)送通道0(Lane0)不使能,其余依次類推 |
gtrx_data[32*LW-1:0] |
Input |
從串行收發(fā)器(Serial Transceivers)接收的數(shù)據(jù) |
gtrx_charisk[4*LW-1:0] |
Input |
gtrx_data信號(hào)中有效字節(jié)指示信號(hào)。當(dāng)這個(gè)信號(hào)某一位為0時(shí),gttx_data中對(duì)應(yīng)的字節(jié)為包的有效字節(jié)。 |
gtrx_chariscomma[4*LW-1:0] |
Input |
gtrx_data信號(hào)中comma指示信號(hào)。如果最低位(bit-0)為1,表示gtrx_data[7:0]是包含comma的字符,其余依次類推 |
gtrx_disperr[4*LW-1:0] |
Input |
gtrx_data信號(hào)中不一致錯(cuò)誤(Disparity Error)指示信號(hào)。如果最低位(bit-0)為1,表示gtrx_data[7:0]中存在不一致錯(cuò)誤,其余依次類推 |
gtrx_notintable[4*LW-1:0] |
Input |
gtrx_data信號(hào)中not-in-table錯(cuò)誤指示信號(hào)。Table指的是8b/10b編碼解碼表。如果最低位(bit-0)為1,表示gtrx_data[7:0]中8b/10b解碼錯(cuò)誤,其余依次類推 |
gtrx_chanbondseq[LW-1:0] |
Input |
串行收發(fā)器每個(gè)鏈路的通道綁定序列(Channel Bonding Sequence)指示信號(hào),如果最低位(bit-0)為1,表示鏈路0(Lane0)收到了一串通道綁定序列,其余依次類推 |
gtrx_chanisaligned[LW-1:0] |
Input |
串行收發(fā)器每個(gè)鏈路的通道對(duì)齊(Channel Alignment)指示信號(hào),如果最低位(bit-0)為1,表示鏈路0(Lane0)已經(jīng)實(shí)現(xiàn)了通道對(duì)齊,其余依次類推 |
gtrx_chanbonden |
Output |
串行收發(fā)器通道綁定使能信號(hào) |
gtrx_reset_req |
Input |
串行請(qǐng)求復(fù)位信號(hào)。例如,由于串行收發(fā)器接收通路彈性FIFO的上溢(overflow)或下溢(underflow), |
gtrx_reset |
Output |
串行收發(fā)器的復(fù)位信號(hào) |
gtrx_reset_done[LW-1:0] |
Input |
串行收發(fā)器每個(gè)鏈路的復(fù)位完成指示信號(hào),如果最低位(bit-0)為1,表示鏈路0(Lane0)已經(jīng)復(fù)位完成,其余依次類推 |
PHY Configuration Fabric(接口8)
接口8的數(shù)據(jù)傳輸協(xié)議為AXI4-Lite協(xié)議,它是物理層(Physical)的配置端口。它的接口定義如下:
s_axi_cfgp_* 表示物理層配置端口(cfg = configuration,p = physical)
Transceiver Interface(接口9)
接口9為串行收發(fā)器高速數(shù)據(jù)傳輸接口,每條串行數(shù)據(jù)傳輸線均為一對(duì)差分信號(hào)。它的接口定義如下:
srio_rxpN ,srio_rxnN:N為通道號(hào),接收鏈路差分對(duì),N的值為1、2或4。
srio_txpN ,srio_txnN:N為通道號(hào),發(fā)送鏈路差分對(duì),N的值為1、2或4。
四、SRIO核包時(shí)序分析
上篇文章《Xilinx RapidIO核例子工程源碼分析》(鏈接:https://www.cnblogs.com/liujinggang/p/10091216.html)的最后一小節(jié)已經(jīng)詳細(xì)介紹了仿真的全部流程以及利用log_wave –r /*命令記錄所有信號(hào)波形的方法,這里不再贅述。這一節(jié)默認(rèn)大家已經(jīng)仿真完畢(仿真結(jié)束大約需要20min左右時(shí)間,仿真完畢記得保存波形),并得到了仿真的波形,下面就對(duì)其中重要的波形進(jìn)行分析。
在分析之前,在重新回顧一下RapidIO串行物理層的包與控制符號(hào)的格式
串行物理層的包:
控制符號(hào):
4.1 鏈路初始化與控制符號(hào)
調(diào)試SRIO的第一步是去檢測(cè)SRIO頂層模塊(srio_example_top_primary)中的各個(gè)關(guān)鍵的控制信號(hào)是否正確切換。這些信號(hào)包括:復(fù)位信號(hào)、時(shí)鐘鎖定信號(hào)(clk_lock)、端口初始化信號(hào)(port_initialized)、鏈路初始化信號(hào)(link_initialized),端口錯(cuò)誤信號(hào)(port_error),mode_1x信號(hào)(在2x和4x模式下,這個(gè)信號(hào)為高表示SRIO核已經(jīng)被訓(xùn)練為1x模式,在1x模式下,這個(gè)信號(hào)一直為高,當(dāng)port_initialized為高時(shí),這個(gè)信號(hào)才有效)與端口解碼錯(cuò)誤信號(hào)(port_decode_error)等(除了這幾個(gè)信號(hào)以外,其他信號(hào)也可以觀察一下)。
Step1、把srio_example_top_primary中的所有信號(hào)全部選中,然后直接拖到右邊的波形窗口
Step2、找到上面提到的幾個(gè)關(guān)鍵控制信號(hào),觀察它們的波形
由上圖可以看出,控制信號(hào)的波形均切換正確,其中最關(guān)鍵的兩個(gè)信號(hào)是port_initialized信號(hào)與link_initialized信號(hào),當(dāng)它們?yōu)楦邥r(shí),分別表示端口和鏈路被成功初始化。
下圖是時(shí)鐘信號(hào)和復(fù)位信號(hào)的時(shí)序細(xì)節(jié),顯然,時(shí)鐘信號(hào)與復(fù)位信號(hào)的時(shí)序均正確。
Step3、pg007_srio_gen2.pdf第119頁(yè)提到,當(dāng)7個(gè)連續(xù)的error free控制符號(hào)被接收,并且15個(gè)連續(xù)的符號(hào)被發(fā)送的時(shí)候,link_initialized信號(hào)才被拉高,所以接下來(lái)看看link_initialized信號(hào)拉高之前物理層是否接收了7個(gè)控制符號(hào)并發(fā)送了15個(gè)控制符號(hào)。
首先選中最左邊的srio_gen2_0_block_inst,然后把中間列出的以gt開頭的接口7的所有信號(hào)拖到最右邊的波形窗口中,如下圖所示
在link_initialized拉高之前,觀察gttx_data,gttx_charisk與gtrx_data,gtrx_charisk總線上的數(shù)據(jù),建議把gttx_charisk與gtrx_charisk用二進(jìn)制顯示,當(dāng)gttx_charisk與gtrx_charisk對(duì)應(yīng)的位為0時(shí),表明gttx_data與gtrx_data上的數(shù)據(jù)為有效數(shù)據(jù)(控制符號(hào)與包屬于有效數(shù)據(jù))。當(dāng)gttx_charisk與gtrx_charisk對(duì)應(yīng)的位為1時(shí),gttx_data與gtrx_data上的數(shù)據(jù)為空閑序列。如下圖所示,當(dāng)link_initialized拉高之前gttx_data上發(fā)送了15個(gè)連續(xù)的控制符號(hào),gtrx_data上接收了7個(gè)連續(xù)的控制符號(hào)。
下面把控制符號(hào)波形放大觀察控制符號(hào)各個(gè)字段的細(xì)節(jié),發(fā)送與接收總線上的控制符號(hào)分別如下圖所示(gttx_charisk與gtrx_charisk對(duì)應(yīng)的位為0時(shí), gttx_data與gtrx_data上的數(shù)據(jù)為控制符號(hào))
上圖表明在link_initialized拉高之前,發(fā)送與接收的控制符號(hào)為80f713,控制符號(hào)80f713前面的1c是/K28.0/,表示控制符號(hào)的起始位置。由于SRIO核默認(rèn)使用的是短控制符號(hào),所以這里控制符號(hào)為24-bit。
把80f713轉(zhuǎn)化為二進(jìn)制:80f713 = 1000_0000_1111_0111_0001_0011,各個(gè)字段的對(duì)應(yīng)關(guān)系如下圖所示
當(dāng)gttx_charisk與gtrx_charisk對(duì)應(yīng)的位為1時(shí),gttx_data與gtrx_data上的數(shù)據(jù)為/K/,/R/,/A/組成的空閑隨機(jī)序列(前面幾篇文章解釋過(guò)這個(gè)知識(shí)點(diǎn)),它們分別為特殊字符/K28.5/,/K29.7/,/K27.7/,轉(zhuǎn)化為16進(jìn)制為bc,fd,fb,下圖是它們的波形
整個(gè)初始化的過(guò)程著重需要關(guān)注的兩個(gè)信號(hào)就是port_initialized和link_initialized,如果初始化失?。╬ort_initialized和link_initialized沒有被拉高),那么首先必須檢查gttx_data與gtrx_data上是否收到了空閑序列/K28.5/,/K29.7/,/K27.7/,同時(shí)需要檢查是否存在編解碼錯(cuò)誤,編解碼錯(cuò)誤的判斷標(biāo)志是gtrx_notintable信號(hào),當(dāng)它為1時(shí)表明存在編解碼錯(cuò)誤。
4.2 SWRITE事務(wù)
上篇文章已經(jīng)分析過(guò),例子工程會(huì)把instruction_list.vh中定義的事務(wù)按順序依次發(fā)出去。其中最先發(fā)送的是37個(gè)SWRITE事務(wù),然后是19個(gè)NWRITE_R事務(wù)、 19個(gè)NWRITE事務(wù)、26個(gè)NREAD事務(wù),2個(gè)DOORBELL事務(wù),最后是17個(gè)MESSAGE事務(wù)。其中第一個(gè)發(fā)送的事務(wù)是instruction_list.vh中第50行定義的SWRITE事務(wù)。如下圖所示
下面以上圖第50行的SWRITE事務(wù)為例來(lái)說(shuō)明整個(gè)SWRITE事務(wù)的傳輸過(guò)程。這個(gè)事務(wù)表示的是利用SWRITE事務(wù)往地址36’hCD0000600發(fā)送16個(gè)字節(jié)的數(shù)據(jù)。
Step1、選中srio_example_top_primary,把中間列出的所有信號(hào)全部拖到波形窗口中(拖到波形窗口前可以把之前波形窗口中的信號(hào)全部刪掉)
Step2、找到請(qǐng)求事務(wù)的傳輸通道ireq,并抓出事務(wù)的波形如下圖所示
由于僅當(dāng)tvalid和tready同時(shí)為高時(shí),tdata上的數(shù)據(jù)才為有效數(shù)據(jù),所以這個(gè)SWRITE一共消耗了三個(gè)有效時(shí)鐘周期,其中第一個(gè)時(shí)鐘周期發(fā)送的是HELLO包頭,后面兩個(gè)時(shí)鐘周期分別發(fā)送8個(gè)字節(jié)的數(shù)據(jù)(第一個(gè)時(shí)鐘發(fā)送的數(shù)據(jù)是0000000000000000,第二個(gè)時(shí)鐘發(fā)送的數(shù)據(jù)是0101010101010101),一共16個(gè)字節(jié)的數(shù)據(jù),和instruction_list.vh中第50行定義完全一致,整個(gè)時(shí)序也與HELLO格式的時(shí)序完全吻合。
Step3、對(duì)照HELLO格式解析包頭。包頭為006020fcd0000600,轉(zhuǎn)化為二進(jìn)制后與HELLO格式各個(gè)字段對(duì)應(yīng)關(guān)系如下所示:
由上圖可知FTYPE字段的值為6,表明確實(shí)是一個(gè)SWRITE事務(wù)
Step4、SWRITE事務(wù)通道ireq通道(接口1)傳輸給SRIO核以后進(jìn)入SRIO的邏輯層,邏輯層會(huì)給包添加傳輸層的信息發(fā)送給Buffer(接口3),然后Buffer會(huì)把數(shù)據(jù)發(fā)送給物理層(接口5)。
選中srio_gen2_0_block_inst,把中間的buft_*通道、phyt_*通道與gttx_*通道的信號(hào)拖到右邊的波形窗口中,如下圖所示
整個(gè)從邏輯層到傳輸層到物理層到吉比特收發(fā)器(Gigabit Transceiver)的波形如下圖所示,波形的細(xì)節(jié)這里不再展開,大家可以自己抓出來(lái)觀察。
Step5、ireq通道的SWRITE請(qǐng)求事務(wù)經(jīng)過(guò)邏輯層,傳輸層和物理層到達(dá)吉比特收發(fā)器(Gigabit Transceiver),吉比特收發(fā)器的數(shù)據(jù)通道gttx_data[31:0](接口7)波形如下圖所示
由上圖可知,整個(gè)串行物理層的包為:7c96f004_b04600ad_d0000600_00000000_00000000_01010101_01010101_e8d30000_7c96f203。(00000000和01010101的寬度為兩個(gè)有效時(shí)鐘)這個(gè)包的含義如下:
7c96f004中的7c是特殊字符/K28.3/,它是一個(gè)包界定符(Packet Deliminator Control Symbol),96f004轉(zhuǎn)化為二進(jìn)制為:
96f004 = 1001_0110_1111_0000_0000_0100
它是一個(gè)包起始控制符號(hào),各個(gè)字段的對(duì)應(yīng)關(guān)系如下圖所示
b04600ad_d0000600_00000000_00000000_01010101_01010101_e8d30000是SWRITE事務(wù)串行物理層的包,把它轉(zhuǎn)化為二進(jìn)制后各個(gè)字段的對(duì)應(yīng)關(guān)系如下圖所示
上圖中data字段是傳輸?shù)?0000000_00000000_01010101_01010101這16個(gè)字節(jié)數(shù)據(jù)的二進(jìn)制碼,因?yàn)樗亩M(jìn)制碼太長(zhǎng)了所以我直接用data替代。由于本次傳輸?shù)淖止?jié)小于80個(gè)字節(jié),所以SWRITE事務(wù)的最后面的三個(gè)字段不存在,大家可以抓一下數(shù)據(jù)量為256個(gè)字節(jié)的SWRITE包,當(dāng)數(shù)據(jù)量大于了80字節(jié),后面的三個(gè)字段也會(huì)有數(shù)據(jù)。
包最后面的7c96f203中7c是特殊字符/K28.3/,它是一個(gè)包界定符(Packet Deliminator Control Symbol),96f203轉(zhuǎn)化為二進(jìn)制為:
96f203= 1001_0110_1111_0010_0000_0011
它是一個(gè)包結(jié)束控制符號(hào),各個(gè)字段的對(duì)應(yīng)關(guān)系如下圖所示
至此,SWRITE事務(wù)全部分析完畢。
4.3 NWRITE_R事務(wù)
本小節(jié)以instruction_list.vh中第72行定義的NWRITE_R事務(wù)為例來(lái)說(shuō)明整個(gè)NWRITE_R事務(wù)的傳輸過(guò)程。如下圖所示,這個(gè)事務(wù)表示的是利用NWRITE_R事務(wù)往地址36’ h004550002發(fā)送6(size+1)個(gè)字節(jié)的數(shù)據(jù)。
Step1、為了方便快速的找到上圖的NWRITE_R事務(wù),建議選中srio_request_gen模塊,并把request_address變量拖到波形窗口中,并把這個(gè)變量用Unsigned Decimal(無(wú)符號(hào)10進(jìn)制)格式顯示。看過(guò)上篇《Xilinx RapidIO核例子工程源碼分析》文章的應(yīng)該知道這個(gè)變量是instruction的索引值,當(dāng)這個(gè)變量為37的時(shí)候就表示37(0~36)個(gè)SWRITE事務(wù)全部發(fā)送完畢,下個(gè)事務(wù)就是instruction_list.vh中第72行定義的NWRITE_R事務(wù)。
Step2、鎖定request_address為37的位置,找到請(qǐng)求事務(wù)的傳輸通道ireq,并觀察事務(wù)的波形如下圖所示
由上圖可知第一個(gè)有效時(shí)鐘傳輸?shù)腍ELLO格式包頭數(shù)據(jù)為:2555205004550002。發(fā)送的數(shù)據(jù)是afafafafafafafaf。包頭與HELLO包格式的對(duì)應(yīng)關(guān)系如下圖所示
由上圖可知FTYPE = 5,TTYPE = 5,這兩個(gè)字段唯一的確定了這是一個(gè)NWRITE_R事務(wù)。
Step3、ireq通道的NWRITE_R請(qǐng)求事務(wù)經(jīng)過(guò)邏輯層,傳輸層和物理層到達(dá)吉比特收發(fā)器(Gigabit Transceiver),吉比特收發(fā)器的數(shù)據(jù)通道gttx_data[31:0](接口7)波形如下圖所示
由上圖可知,整個(gè)串行物理層的包為:7c98f009_d84500ad_59250455_0000afaf_afafafaf_afafad15_7c17f21e。這個(gè)包的含義如下:
7c98f009中的7c是特殊字符/K28.3/,它是一個(gè)包界定符(Packet Deliminator Control Symbol),98f009轉(zhuǎn)化為二進(jìn)制為:
98f009= 1001_1000_1111_0000_0000_1001
它是一個(gè)包起始控制符號(hào),各個(gè)字段的對(duì)應(yīng)關(guān)系如下圖所示
d84500ad_59250455_0000afaf_afafafaf_afafad15是NWRITE_R事務(wù)串行物理層的包,把它轉(zhuǎn)化為二進(jìn)制后各個(gè)字段的對(duì)應(yīng)關(guān)系如下圖所示
上圖中data字段是傳輸?shù)腶fafafaf_afafafaf這16個(gè)字節(jié)數(shù)據(jù)的二進(jìn)制碼,因?yàn)樗亩M(jìn)制碼太長(zhǎng)了所以我直接用data替代。由于本次傳輸?shù)目傋止?jié)數(shù)為8字節(jié)的整數(shù)倍,所以NWRITE_R事務(wù)的后面可選的logical 0 pad(opt)沒有數(shù)據(jù)。
細(xì)心的人在這里可能發(fā)現(xiàn)了一個(gè)奇怪的現(xiàn)象:在HELLO格式中,address字段為36’ h004550002,其中高兩位為保留位,所以address一共只有34-bit有效位,size字段為5,表示往36’ h004550002地址中寫6(size+1)個(gè)字節(jié)的數(shù)據(jù)。但是上面串行物理層的包中address字段的值為0000_0100_0101_0101_0000_0000_0000_0,發(fā)送的數(shù)據(jù)個(gè)數(shù)為8個(gè)字節(jié)(afafafaf_afafafaf)。出現(xiàn)這種現(xiàn)象的原因?yàn)椋?/p>
HELLO格式address字段指向的存儲(chǔ)空間的最小單元是1個(gè)字節(jié),而串行物理層中的address字段指向的存儲(chǔ)空間最小單元實(shí)際上是8個(gè)字節(jié),address后面的xambsb字段是串行物理層的最高兩位地址擴(kuò)展字段,所以串行物理層的包可訪問(wèn)的存儲(chǔ)空間大小為2^34=16G,這也是HELLO格式中address字段位寬為34-bit的原因(關(guān)于這部分的內(nèi)容我在《RapidIO協(xié)議概述》也提到過(guò))。正因?yàn)镠ELLO格式address字段與串行物理層address字段所指向的存儲(chǔ)空間最小單元不同,所以pg007_srio_gen2.pdf中第78頁(yè)才給出了一個(gè)HELLO格式size,addr與有效字節(jié)的對(duì)應(yīng)關(guān)系表,如下所示
本例中size=5,addr[2:0] = 2,對(duì)應(yīng)于上圖中紅框圈出來(lái)的情況。所以往36’ h004550002地址中寫6(size+1)個(gè)字節(jié)的數(shù)據(jù)對(duì)串行物理層來(lái)說(shuō)就是往36’ h004550000地址中寫8個(gè)字節(jié)的數(shù)據(jù),高6個(gè)字節(jié)(上圖中灰色區(qū)域)為有效數(shù)據(jù)。
包最后面的7c17f21e中7c是特殊字符/K28.3/,它是一個(gè)包界定符(Packet Deliminator Control Symbol),17f21e轉(zhuǎn)化為二進(jìn)制為:
17f21e = 0001_0111_1111_0010_0001_1110
它是一個(gè)包結(jié)束控制符號(hào),各個(gè)字段的對(duì)應(yīng)關(guān)系如下圖所示
Step4、例子工程中例化了srio_example_top_primary與srio_example_top_mirror兩個(gè)實(shí)體,srio_example_top_primary實(shí)體的srio_txp0和srio_txn0連接到srio_example_top_mirror實(shí)體的srio_rxp0和srio_rxn0。因此,srio_example_top_mirror的gtrx_data上的數(shù)據(jù)應(yīng)該和上一步分析的srio_example_top_primary實(shí)體的gttx_data完全相同。
選中srio_example_top_mirror的srio_gen2_0_block_inst,把gtrx_data與gtrx_charisk兩個(gè)信號(hào)拖到右邊的窗口中,如下圖所示
觀察srio_example_top_primary的gttx_data與srio_example_top_mirror的gtrx_data,如下圖所示,可以看到兩者完全相同,僅僅存在一個(gè)延時(shí)。
Step5、srio_example_top_mirror模塊的grrx_data接收到數(shù)據(jù)以后,將會(huì)把grrx_data的數(shù)據(jù)按照與發(fā)送過(guò)程完全相反的操作傳到邏輯層,最終邏輯層的數(shù)據(jù)將會(huì)通過(guò)srio_example_top_mirror模塊的treq接口輸出。
選中srio_example_top_mirror,把treq通道的所有信號(hào)拖到右邊的波形窗口中
下圖是srio_example_top_mirror模塊treq通道的波形
可知treq通道的包頭數(shù)據(jù)為2555205004550002,與srio_example_top_primary模塊ireq通道發(fā)送的包頭數(shù)據(jù)完全一樣。這也證明整個(gè)鏈路工作正常。
4.4 NWRITE_R的響應(yīng)事務(wù)
由于NWRITE_R事務(wù)是一個(gè)有響應(yīng)的寫事務(wù),所以當(dāng)發(fā)起方(Initiator)往目標(biāo)方(Target)發(fā)送一個(gè)NWRITE_R事務(wù)以后,發(fā)起方(Initiator)還要接收目標(biāo)方(Target)的發(fā)回響應(yīng)事務(wù)。響應(yīng)包的數(shù)據(jù)會(huì)出現(xiàn)在srio_example_top_primary模塊的tresp通道,下圖是srio_example_top_primary模塊的tresp通道的時(shí)序圖
由上圖可知iresp_tdata的數(shù)據(jù)為:25d0400000000000。與HELLO包格式的對(duì)應(yīng)關(guān)系如下圖所示
由上圖可知FTYPE = 13,所以這是一個(gè)響應(yīng)事務(wù),prio字段變成了2,而NWRITE_R字段的prio字段為1,這是因?yàn)轫憫?yīng)事務(wù)的prio為請(qǐng)求事務(wù)的prio+1,(這個(gè)知識(shí)點(diǎn)前兩篇文章都提到過(guò))
事實(shí)上,響應(yīng)事務(wù)的一整套傳輸流程為:目標(biāo)方(Target)發(fā)回的響應(yīng)事務(wù)被srio_example_top_primary模塊的串行差分信號(hào)線接收到達(dá)Serial Transceivers,Serial Transceivers在把接收的數(shù)據(jù)通過(guò)gtrx_data通道(接口7)傳到物理層,物理層把接收的包經(jīng)過(guò)處理以后通過(guò)phyr_*通道(接口5)把數(shù)據(jù)發(fā)給Buffer層,Buffer層對(duì)數(shù)據(jù)進(jìn)行二次處理以后把數(shù)據(jù)通過(guò)bufr_*通道(接口4)傳給邏輯層,邏輯層再把數(shù)據(jù)傳輸給I/O端口(接口1),這樣就得到了上圖HELLO格式的響應(yīng)包。大家可以把gtrx_data、phyr_*通道、bufr_*通道和I/O端口的波形全部抓出來(lái)觀察一下,方法和上節(jié)介紹發(fā)送流程的抓取過(guò)程完全一樣。這里我只抓一下gtrx_data通道的數(shù)據(jù),并分析響應(yīng)事務(wù)串行物理層包格式各個(gè)字段的含義。
gtrx_data通道的數(shù)據(jù)如下圖所示
由上圖可知,整個(gè)響應(yīng)事務(wù)串行物理層的包為:7c83f00f_388dadad_00255540_7c83f208
7c83f00f中的7c是特殊字符/K28.3/,它是一個(gè)包界定符(Packet Deliminator Control Symbol),83f00f轉(zhuǎn)化為二進(jìn)制為:
83f00f = 1000_0011_1111_0000_0000_1111
它是一個(gè)包起始控制符號(hào),各個(gè)字段的對(duì)應(yīng)關(guān)系如下圖所示
388dadad_00255540是NWRITE_R響應(yīng)事務(wù)串行物理層的包,把它轉(zhuǎn)化為二進(jìn)制后各個(gè)字段的對(duì)應(yīng)關(guān)系如下圖所示
由于NWRITE_R的響應(yīng)事務(wù)不帶數(shù)據(jù),所以沒有data字段。target TID字段的值為16進(jìn)制的25,也就是10進(jìn)制的37,與發(fā)送的NWRITE_R請(qǐng)求事務(wù)target TID值完全相同。FTPYE字段的值為13,說(shuō)明這是一個(gè)響應(yīng)事務(wù),整個(gè)響應(yīng)事務(wù)的包正是NWRITE_R事務(wù)的響應(yīng)包。
7c83f208中的7c是特殊字符/K28.3/,它是一個(gè)包界定符(Packet Deliminator Control Symbol),83f208轉(zhuǎn)化為二進(jìn)制為:
83f208= 1000_0011_1111_0010_0000_1000
它是一個(gè)包結(jié)束控制符號(hào),各個(gè)字段的對(duì)應(yīng)關(guān)系如下圖所示
4.5 NWRITE事務(wù)
本小節(jié)以instruction_list.vh中第94行定義的NWRITE事務(wù)為例來(lái)說(shuō)明整個(gè)NWRITE事務(wù)的傳輸過(guò)程。如下圖所示,這個(gè)事務(wù)表示的是利用NWRITE事務(wù)往地址36’ hDE0000600發(fā)送16(size+1)個(gè)字節(jié)的數(shù)據(jù)。
Step1、為了方便快速的找到上圖的NWRITE事務(wù),建議選中srio_request_gen模塊,并把request_address變量拖到波形窗口中,并把這個(gè)變量用Unsigned Decimal(無(wú)符號(hào)10進(jìn)制)格式顯示??催^(guò)上篇《Xilinx RapidIO核例子工程源碼分析》文章的應(yīng)該知道這個(gè)變量是instruction的索引值,當(dāng)這個(gè)變量為56的時(shí)候就表示37(0~36)個(gè)SWRITE事務(wù)全部發(fā)送完畢,19個(gè)NWRITE_R事務(wù)也全部發(fā)送完畢,下個(gè)事務(wù)就是instruction_list.vh中第94行定義的NWRITE事務(wù)。鎖定request_address為56的位置,找到請(qǐng)求事務(wù)的傳輸通道ireq,并觀察事務(wù)的波形如下圖所示
由上圖可知第一個(gè)有效時(shí)鐘傳輸?shù)腍ELLO格式包頭數(shù)據(jù)為:385420fde0000600。后兩個(gè)有效時(shí)鐘發(fā)送的數(shù)據(jù)分別是c2c2c2c2c2c2c2c2和c3c3c3c3c3c3c3c3。包頭與HELLO包格式的對(duì)應(yīng)關(guān)系如下圖所示
由上圖可知FTYPE = 5,TTYPE = 4,這兩個(gè)字段唯一的確定了這是一個(gè)NWRITE_R事務(wù)。srcTID的值為16進(jìn)制的38,也就是10進(jìn)制的56,與request_address的值相等,因?yàn)榇a里面就是直接把request_address的值賦給了srcTID。
Step2、ireq通道的NWRITE請(qǐng)求事務(wù)經(jīng)過(guò)邏輯層,傳輸層和物理層到達(dá)吉比特收發(fā)器(Gigabit Transceiver),吉比特收發(fā)器的數(shù)據(jù)通道gttx_data[31:0](接口7)波形如下圖所示
由上圖可知,NWRITE串行物理層包的數(shù)據(jù)為:
7c93f010_c84500ad_4b38e000_0605c2c2_c2c2c2c2_c2c2c3c3_c3c3c3c3_c3c362a2_7c13f20e。包的各個(gè)字段解釋如下:
7c93f010中的7c是特殊字符/K28.3/,它是一個(gè)包界定符(Packet Deliminator Control Symbol),93f010轉(zhuǎn)化為二進(jìn)制為:
93f010= 1001_0011_1111_0000_0001_0000
它是一個(gè)包起始控制符號(hào),各個(gè)字段的對(duì)應(yīng)關(guān)系如下圖所示
c84500ad_4b38e000_0605c2c2_c2c2c2c2_c2c2c3c3_c3c3c3c3_c3c362a2是NWRITE事務(wù)串行物理層的包,把它轉(zhuǎn)化為二進(jìn)制后各個(gè)字段的對(duì)應(yīng)關(guān)系如下圖所示
細(xì)心的同學(xué)馬上會(huì)發(fā)現(xiàn)wrsize字段的值居然為11(2進(jìn)制1011,16進(jìn)制b),address字段的值為e000_0600。而instruction_list.vh中第94行定義的size字段的值為15,address字段的值為36’hDE0000600。似乎邏輯層的包到達(dá)物理層以后size字段和address兩個(gè)字段都出現(xiàn)了錯(cuò)誤。出現(xiàn)這種現(xiàn)象的原因如下:
前面幾篇文章也多次提到過(guò),address后面的兩個(gè)字段wdptr和xamsbs兩個(gè)字段是有作用的,xamsbs字段是地址字段的高兩位擴(kuò)展位。由于HELLO格式address字段的有效位數(shù)是34-bit,所以在當(dāng)address字段的值為36’hDE0000600,有效的address字段的值為34’h 1E0000600,當(dāng)我們把串行物理層xamsbs字段的01拼接在串行物理層address字段前面得到的地址就和先前定義的地址是一致的了。
至于wrsize字段的值為11,這是因?yàn)楹竺娴膚dptr字段的值變成了1,RapidIO_Rev_2.2_Specification的第35頁(yè)表4-4已經(jīng)列出了所有wrsize與wdptr字段的組合,當(dāng)wdptr=1,wrsize=11是,字節(jié)的總個(gè)數(shù)是16,這也和我們之前在instruction_list.vh中的定義是一致的。
7c13f201中的7c是特殊字符/K28.3/,它是一個(gè)包界定符(Packet Deliminator Control Symbol),13f201轉(zhuǎn)化為二進(jìn)制為:
13f201= 0001_0011_1111_0010_0000_0001
它是一個(gè)包結(jié)束控制符號(hào),各個(gè)字段的對(duì)應(yīng)關(guān)系如下圖所示
4.6 NREAD事務(wù)
本小節(jié)以instruction_list.vh中第120行定義的NREAD事務(wù)為例來(lái)說(shuō)明整個(gè)NREAD事務(wù)的傳輸過(guò)程。如下圖所示,這個(gè)事務(wù)表示的是利用NREAD事務(wù)往地址36’ h0000023F0發(fā)送8(size+1)個(gè)字節(jié)的數(shù)據(jù)。
Step1、為了方便快速的找到上圖的NREAD事務(wù),建議選中srio_request_gen模塊,并把request_address變量拖到波形窗口中,并把這個(gè)變量用Unsigned Decimal(無(wú)符號(hào)10進(jìn)制)格式顯示??催^(guò)上篇《Xilinx RapidIO核例子工程源碼分析》文章的應(yīng)該知道這個(gè)變量是instruction的索引值,當(dāng)這個(gè)變量為78(37+19+19+3=78)的時(shí)候就表示發(fā)送的是上圖第120行的NREAD事務(wù)(之所以不選擇第123行的讀事務(wù)是因?yàn)樗x的數(shù)據(jù)量太大了,截圖的時(shí)候不方便)。鎖定request_address為78的位置,找到請(qǐng)求事務(wù)的傳輸通道ireq,并觀察事務(wù)的波形如下圖所示
NREAD請(qǐng)求事務(wù)不帶任何數(shù)據(jù),只包含一個(gè)HELLO格式的包頭,包頭的數(shù)據(jù)為:4e242070000023f0。各個(gè)字段的對(duì)應(yīng)關(guān)系如下圖所示
FTYPE=2,TTYPE=4,這兩個(gè)字段唯一的確定了這是一個(gè)NREAD事務(wù)包。其他字段也與之前在instruction_list.vh中第120行定義的完全相同。
Step2、接下來(lái)再看看NREAD事務(wù)串行物理層的包格式,這個(gè)包在155610ns的位置,下圖是NREAD事務(wù)串行物理層包格式的時(shí)序圖
由上圖可知,整個(gè)串行物理層的包為:7c92f014_b84200ad_4b4e0000_23f09c5a_7c92f213。這個(gè)包的含義如下:
7c92f014中的7c是特殊字符/K28.3/,它是一個(gè)包界定符(Packet Deliminator Control Symbol),92f014轉(zhuǎn)化為二進(jìn)制為:
92f014= 1001_0010_1111_0000_0001_0100
它是一個(gè)包起始控制符號(hào),各個(gè)字段的對(duì)應(yīng)關(guān)系如下圖所示
b84200ad_4b4e0000_23f09c5a是NREAD事務(wù)串行物理層的包,把它轉(zhuǎn)化為二進(jìn)制后各個(gè)字段的對(duì)應(yīng)關(guān)系如下圖所示
FTYPE = 2,TTYPE = 4,這兩個(gè)值確定了這個(gè)包是一個(gè)NREAD事務(wù)包。rdsize=11(二進(jìn)制的1011),wdptr=0,通過(guò)查RapidIO_Rev_2.2_Specification第34頁(yè)的表可知數(shù)據(jù)量為8個(gè)字節(jié),與instruction_list.vh中第120行定義的完全相同。wdptr與rdsize的對(duì)應(yīng)關(guān)系表如下所示
7c92f213中的7c是特殊字符/K28.3/,它是一個(gè)包界定符(Packet Deliminator Control Symbol),92f213轉(zhuǎn)化為二進(jìn)制為:
92f213= 1001_0010_1111_0010_0001_0011
它是一個(gè)包結(jié)束控制符號(hào),各個(gè)字段的對(duì)應(yīng)關(guān)系如下圖所示
4.7 NREAD響應(yīng)事務(wù)
由于NREAD事務(wù)是一個(gè)有響應(yīng)的事務(wù),且響應(yīng)事務(wù)中攜帶讀到的數(shù)據(jù)。所以當(dāng)發(fā)起方(Initiator)往目標(biāo)方(Target)發(fā)送一個(gè)NREAD事務(wù)以后,發(fā)起方(Initiator)還要接收目標(biāo)方(Target)的發(fā)回響應(yīng)事務(wù)。響應(yīng)事務(wù)通過(guò)gtrx_data通道接收。響應(yīng)事務(wù)串行物理層包時(shí)序如下圖所示,這個(gè)響應(yīng)包在157370ns的位置
由上圖可知,00000000這個(gè)數(shù)據(jù)傳輸了2個(gè)時(shí)鐘周期,所以整個(gè)響應(yīng)事務(wù)串行物理層的包為:7c8af01e_708dadad_804e0000_00000000_0000469c_7c8af219
7c83f00f中的7c是特殊字符/K28.3/,它是一個(gè)包界定符(Packet Deliminator Control Symbol),83f00f轉(zhuǎn)化為二進(jìn)制為:
83f00f = 1000_0011_1111_0000_0000_1111
它是一個(gè)包起始控制符號(hào),各個(gè)字段的對(duì)應(yīng)關(guān)系如下圖所示
708dadad_804e0000_00000000_0000469c是NREAD響應(yīng)事務(wù)串行物理層的包,把它轉(zhuǎn)化為二進(jìn)制后各個(gè)字段的對(duì)應(yīng)關(guān)系如下圖所示
FTYPE=13表示這是一個(gè)響應(yīng)事務(wù),TTYPE=8表示這個(gè)響應(yīng)事務(wù)攜帶數(shù)據(jù),target TID的值為16進(jìn)制的4e(10進(jìn)制的78),與請(qǐng)求事務(wù)剛好對(duì)應(yīng)上,data字段是8個(gè)字節(jié)的00,由于并沒有存儲(chǔ)器,所以讀出來(lái)的數(shù)據(jù)全部是0。
7c8af219中的7c是特殊字符/K28.3/,它是一個(gè)包界定符(Packet Deliminator Control Symbol),8af219轉(zhuǎn)化為二進(jìn)制為:
8af219= 1000_1001_1111_0010_0001_1001
它是一個(gè)包結(jié)束控制符號(hào),各個(gè)字段的對(duì)應(yīng)關(guān)系如下圖所示
響應(yīng)事務(wù)串行物理層的包經(jīng)過(guò)物理層、傳輸層和邏輯層到達(dá)iresp通道,iresp通道的時(shí)序如下圖所示
iresp通道一共有兩個(gè)有效數(shù)據(jù),分別為HELLO格式包頭4ed8400000000000和0000000000000000。HELLO格式包頭4ed8400000000000各個(gè)字段的對(duì)應(yīng)關(guān)系如下圖所示
FTYPE = 13,TTYPE = 8表示這是一個(gè)攜帶數(shù)據(jù)的響應(yīng)事務(wù),響應(yīng)事務(wù)的prio字段的值為請(qǐng)求事務(wù)prio字段的值加1。
4.8 MAINTENANCE事務(wù)
頂層模塊srio_example_top.v中例化的srio_quick_start模塊與SRIO IP核的維護(hù)端口相連用來(lái)產(chǎn)生維護(hù)事務(wù)。維護(hù)事務(wù)在maintenance_list.vh頭文件中定義,用戶可以通過(guò)編輯maintenance_list.vh頭文件來(lái)添加、修改或移除維護(hù)事務(wù)。下圖是例子工程中定義的所有維護(hù)事務(wù)
維護(hù)事務(wù)有本地(Local)和遠(yuǎn)程(Remote)兩種類型,區(qū)分這兩種維護(hù)事務(wù)是通過(guò)maintr_araddr信號(hào)的高八位的值來(lái)確定的。如下圖所示
由上圖可知,maintr_araddr的[31:24]位用來(lái)區(qū)分本地維護(hù)事務(wù)和遠(yuǎn)程維護(hù)事務(wù),
當(dāng) maintr_araddr=01xxxxxx,表示的是遠(yuǎn)程(Remote)維護(hù)事務(wù)。
當(dāng) maintr_araddr=00xxxxxx,表示的是本地(Local)維護(hù)事務(wù)。
maintr_araddr的[23:0]位是讀操作的偏移地址。
下圖是一個(gè)維護(hù)事務(wù)的時(shí)序圖
由上圖可知,紅色框出來(lái)的部分是一個(gè)讀維護(hù)事務(wù),由于maintr_araddr的高8位[31:24]為8’h00,所以這是一個(gè)本地(Local)讀維護(hù)事務(wù)。maintr_araddr的[23:0]位為24’h000000,所以這個(gè)本地(Local)讀維護(hù)事務(wù)訪問(wèn)的是邏輯層的能力寄存器(Capability Register Space)空間,且寄存器的偏移地址為24’h000000。
SRIO核寄存器空間的分布如下圖所示
下圖是維護(hù)端口(接口2)和邏輯層配置端口(接口3)的時(shí)序圖
當(dāng) maintr_araddr=01000000,表示的是邏輯層的遠(yuǎn)程(Remote)維護(hù)事務(wù)。邏輯層I/O端口發(fā)起的維護(hù)事務(wù)會(huì)通過(guò)邏輯層、傳輸層到物理層轉(zhuǎn)化為串行物理層的包通過(guò)高速串行收發(fā)器(Serial Transceiver)發(fā)出去。下圖是一個(gè)遠(yuǎn)程維護(hù)事務(wù)串行物理層包的時(shí)序,這個(gè)包在96680ns的位置
由上圖可知,維護(hù)事務(wù)串行物理層的包為:7c82f00b_104800ff_18010000_0060dead_beefdead_beefbe6e_7c82f20c
7c82f00b中的7c是特殊字符/K28.3/,它是一個(gè)包界定符(Packet Deliminator Control Symbol),82f00b轉(zhuǎn)化為二進(jìn)制為:
82f00b = 1000_0010_1111_0000_0000_1011
它是一個(gè)包起始控制符號(hào),各個(gè)字段的對(duì)應(yīng)關(guān)系如下圖所示
104800ff_18010000_0060dead_beefdead_beefbe6e是維護(hù)事務(wù)串行物理層的包,把它轉(zhuǎn)化為二進(jìn)制后各個(gè)字段的對(duì)應(yīng)關(guān)系如下圖所示
FTYPE = 8,TTYPE = 1,表明這是一個(gè)寫請(qǐng)求的維護(hù)事務(wù)。上圖中data字段表示的是dead_beefdead_beef這8個(gè)字節(jié)的數(shù)據(jù)。
7c82f20c中的7c是特殊字符/K28.3/,它是一個(gè)包界定符(Packet Deliminator Control Symbol),82f20c轉(zhuǎn)化為二進(jìn)制為:
82f20c = 1000_0010_1111_0010_0000_1100
它是一個(gè)包結(jié)束控制符號(hào),各個(gè)字段的對(duì)應(yīng)關(guān)系如下圖所示
4.9 DOORBELL事務(wù)與MESSAGE事務(wù)
門鈴(DOORBELL)事務(wù)與消息(MESSAGE)事務(wù)的分析方法與之前幾種方法完全一樣,大家可以自己按照上面的流程先找到HELLO格式的包,對(duì)照HELLO格式各個(gè)字段的定義進(jìn)行分析,然后找到串行物理層的包對(duì)照串行物理層的包格式再次分析就能明白整個(gè)事務(wù)的交互過(guò)程了。其實(shí)對(duì)于用戶來(lái)說(shuō),串行物理層是SRIO IP核幫我們?cè)O(shè)計(jì)好的,所以在實(shí)際項(xiàng)目中使用的時(shí)候只需要關(guān)注HELLO格式的包與時(shí)序就可以了。
五、(選讀)SRIO核在ZC706上回環(huán)(Loopback)測(cè)試
通過(guò)Vivado仿真以后大家應(yīng)該對(duì)使用SRIO核有了一個(gè)基本了解。如果你手頭有自己做的開發(fā)板并且有SRIO的License的話你可以利用SRIO在硬件上做一個(gè)回環(huán)測(cè)試。
所謂SRIO的回環(huán)測(cè)試就是把SRIO的srio_txp0和srio_rxp0在硬件上連接起來(lái),把srio_txn0和srio_rxn0在硬件上連接起來(lái),讓SRIO的包自發(fā)自收。如下圖所示
由于我手頭有一塊Xilinx的ZC706評(píng)估板,所以這個(gè)回環(huán)測(cè)試我會(huì)在ZC706上完成。
ZC706上的FPGA型號(hào)為XC7Z045,它的上面BANK109、BANK110、BANK111和BANK112為MGT BANK,如下圖所示
其中BANK112與PCIe接口相連(后面有空會(huì)寫PCIe接口),所以RapidIO不能使用這個(gè)BANK。BANK109與BANK110與FMC接口相連,無(wú)法使用同軸線或光纖環(huán)回,所以這兩個(gè)BANK也不能使用。因此RapidIO只剩下BANK111可用,而且BANK111有一個(gè)通道已經(jīng)通過(guò)C653和C652環(huán)回上了,這樣就省去了自己用光纖或同軸線去環(huán)回。接下來(lái)最重要的就是給BANK111輸入一個(gè)125MHz的參考時(shí)鐘。
這個(gè)125MHz的時(shí)鐘可以從臨近的BANK“借”一個(gè),比如可以通過(guò)軟件配置SI5324產(chǎn)生一個(gè)125MHz時(shí)鐘,盡管SI5324輸出的時(shí)鐘并不在BANK111上,但是這個(gè)125MHz仍然可以被BANK111“借”用。但是這種方法需要寫軟件配置SI5324,比較麻煩,所以不推薦。
下面介紹另外一種得到這個(gè)125MHz時(shí)鐘的方法:由于BANK111上有一路時(shí)鐘是連接到SMA接口上的,所以這個(gè)125MHz時(shí)鐘可以用外部的信號(hào)源接入,但是如果你沒有信號(hào)源的話也沒事,這個(gè)125MHz時(shí)鐘可以通過(guò)FPGA內(nèi)部的Clocking Wizard產(chǎn)生。
ZC706評(píng)估板的結(jié)構(gòu)圖如下圖所示
可以看到上圖用紅色橢圓圈出來(lái)的9號(hào)和10號(hào)兩個(gè)SMA接口對(duì),10號(hào)SMA接口就是連接到BANK111上的一個(gè)參考時(shí)鐘,所以我們只需要用FPGA中的Clocking Wizard IP核用ZC706的200MHz系統(tǒng)時(shí)鐘得到125MHz的時(shí)鐘輸出到9號(hào)SMA接口對(duì),然后用同軸線把9號(hào)SMA接口對(duì)和10號(hào)接口對(duì)相連就可以了。由于Clocking Wizard IP核輸出的時(shí)鐘是單端時(shí)鐘,所以還必須用OBUFDS原語(yǔ)把這個(gè)125MHz單端時(shí)鐘變成差分時(shí)鐘輸出到9號(hào)SMA接口對(duì)。
有了125MHz的參考時(shí)鐘以后,接下來(lái)就只需要修改例子工程的頂層srio_example_top_srio_gen2_0代碼,添加9號(hào)SMA接口對(duì)的引腳定義,修改例子工程的物理約束就可以了。還有一個(gè)信號(hào)就是srio_example_top_srio_gen2_0頂層代碼中的sim_train_en在硬件上執(zhí)行時(shí)必須置0。修改完成以后就可以生成bit文件下載到ZC706上觀察現(xiàn)象了,還可以用ILA抓一下I/O通道的波形,沒有問(wèn)題的話抓出來(lái)的波形和之前仿真的波形是完全一樣的。
六、總結(jié)
整個(gè)RapidIO系列博客到此就全部寫完了,最后提供兩個(gè)仿真的建議:
1、上文我抓的包傳輸數(shù)據(jù)量都比較少,主要是方便我截圖,傳輸?shù)臄?shù)據(jù)量比較大的時(shí)候,整個(gè)包的總字節(jié)數(shù)會(huì)超過(guò)80個(gè)字節(jié),在數(shù)據(jù)量超過(guò)80字節(jié)的情況下包中會(huì)出來(lái)兩個(gè)循環(huán)冗余校驗(yàn)碼(CRC碼),這個(gè)在《RapidIO串行物理層的包與控制符號(hào)》提到過(guò),大家可以自己把包的數(shù)據(jù)量改的大一點(diǎn)觀察一下數(shù)據(jù)量大于80字節(jié)的情況。
2、由于例子工程中測(cè)試的比較全面,所以一共發(fā)了很多包,這樣導(dǎo)致找包的時(shí)候非常難找,這里提供一個(gè)小技巧,你只需要把srio_request_gen_srio_gen2_0.v模塊中的第359行instruction的索引值request_address改成一個(gè)固定的數(shù),那么就只會(huì)連續(xù)不斷的發(fā)一種包,看波形的時(shí)候就會(huì)非常方便,缺點(diǎn)是每修改一次就需要重新仿真,所以比較耗費(fèi)時(shí)間。
審核編輯 :李倩
-
Xilinx
+關(guān)注
關(guān)注
71文章
2141瀏覽量
120711 -
仿真
+關(guān)注
關(guān)注
50文章
3996瀏覽量
133230 -
sRIO
+關(guān)注
關(guān)注
1文章
30瀏覽量
20954
原文標(biāo)題:【高速接口-RapidIO】6、Xilinx RapidIO核仿真與包時(shí)序分析
文章出處:【微信號(hào):zhuyandz,微信公眾號(hào):FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論