0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

RapidIO核的仿真以及包時(shí)序的分析

FPGA之家 ? 來(lái)源:FPGA之家 ? 作者:FPGA之家 ? 2022-12-19 10:33 ? 次閱讀

一、軟件平臺(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)層次

6aeb0020-7f43-11ed-8abf-dac502259ad0.jpg

它由一個(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)方。

6b073cea-7f43-11ed-8abf-dac502259ad0.jpg

SRIO核的原理框圖以及接口如下圖所示

6b67b160-7f43-11ed-8abf-dac502259ad0.jpg

為了方便說(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)的格式

串行物理層的包:

6b85922a-7f43-11ed-8abf-dac502259ad0.jpg

控制符號(hào):

6baa1b90-7f43-11ed-8abf-dac502259ad0.jpg

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)全部選中,然后直接拖到右邊的波形窗口

6bd561c4-7f43-11ed-8abf-dac502259ad0.jpg

Step2、找到上面提到的幾個(gè)關(guān)鍵控制信號(hào),觀察它們的波形

6c04cb62-7f43-11ed-8abf-dac502259ad0.jpg

由上圖可以看出,控制信號(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í)序均正確。

6c21a890-7f43-11ed-8abf-dac502259ad0.jpg

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)拖到最右邊的波形窗口中,如下圖所示

6c410082-7f43-11ed-8abf-dac502259ad0.jpg

在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)。

6c77c6c6-7f43-11ed-8abf-dac502259ad0.jpg

下面把控制符號(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))

6c99e3fa-7f43-11ed-8abf-dac502259ad0.png

上圖表明在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)系如下圖所示

6cbe4538-7f43-11ed-8abf-dac502259ad0.jpg

當(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,下圖是它們的波形

6ce07716-7f43-11ed-8abf-dac502259ad0.png

整個(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ù)。如下圖所示

6cfc2e5c-7f43-11ed-8abf-dac502259ad0.png

下面以上圖第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)全部刪掉)

6d1c3efe-7f43-11ed-8abf-dac502259ad0.jpg

Step2、找到請(qǐng)求事務(wù)的傳輸通道ireq,并抓出事務(wù)的波形如下圖所示

6d4713b8-7f43-11ed-8abf-dac502259ad0.png

由于僅當(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)系如下所示:

6d6b40c6-7f43-11ed-8abf-dac502259ad0.jpg

由上圖可知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)拖到右邊的波形窗口中,如下圖所示

6d9705e4-7f43-11ed-8abf-dac502259ad0.jpg

整個(gè)從邏輯層到傳輸層到物理層到吉比特收發(fā)器(Gigabit Transceiver)的波形如下圖所示,波形的細(xì)節(jié)這里不再展開,大家可以自己抓出來(lái)觀察。

6de45a1a-7f43-11ed-8abf-dac502259ad0.jpg

Step5、ireq通道的SWRITE請(qǐng)求事務(wù)經(jīng)過(guò)邏輯層,傳輸層和物理層到達(dá)吉比特收發(fā)器(Gigabit Transceiver),吉比特收發(fā)器的數(shù)據(jù)通道gttx_data[31:0](接口7)波形如下圖所示

6e13ccf0-7f43-11ed-8abf-dac502259ad0.jpg

由上圖可知,整個(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)系如下圖所示

6e2f6654-7f43-11ed-8abf-dac502259ad0.jpg

b04600ad_d0000600_00000000_00000000_01010101_01010101_e8d30000是SWRITE事務(wù)串行物理層的包,把它轉(zhuǎn)化為二進(jìn)制后各個(gè)字段的對(duì)應(yīng)關(guān)系如下圖所示

6e6d6738-7f43-11ed-8abf-dac502259ad0.jpg

上圖中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)系如下圖所示

6e99ffbe-7f43-11ed-8abf-dac502259ad0.jpg

至此,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ù)。

6ec9447c-7f43-11ed-8abf-dac502259ad0.jpg

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ù)。

6ef68c2a-7f43-11ed-8abf-dac502259ad0.jpg

Step2、鎖定request_address為37的位置,找到請(qǐng)求事務(wù)的傳輸通道ireq,并觀察事務(wù)的波形如下圖所示

6f2020f8-7f43-11ed-8abf-dac502259ad0.png

由上圖可知第一個(gè)有效時(shí)鐘傳輸?shù)腍ELLO格式包頭數(shù)據(jù)為:2555205004550002。發(fā)送的數(shù)據(jù)是afafafafafafafaf。包頭與HELLO包格式的對(duì)應(yīng)關(guān)系如下圖所示

6f45218c-7f43-11ed-8abf-dac502259ad0.jpg

由上圖可知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)波形如下圖所示

6f70fd8e-7f43-11ed-8abf-dac502259ad0.jpg

由上圖可知,整個(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)系如下圖所示

6f8cc2e4-7f43-11ed-8abf-dac502259ad0.jpg

d84500ad_59250455_0000afaf_afafafaf_afafad15是NWRITE_R事務(wù)串行物理層的包,把它轉(zhuǎn)化為二進(jìn)制后各個(gè)字段的對(duì)應(yīng)關(guān)系如下圖所示

6fb6d444-7f43-11ed-8abf-dac502259ad0.jpg

上圖中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)系表,如下所示

6fdd0c72-7f43-11ed-8abf-dac502259ad0.png

本例中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)系如下圖所示

70048568-7f43-11ed-8abf-dac502259ad0.jpg

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)拖到右邊的窗口中,如下圖所示

703c73a6-7f43-11ed-8abf-dac502259ad0.jpg

觀察srio_example_top_primary的gttx_data與srio_example_top_mirror的gtrx_data,如下圖所示,可以看到兩者完全相同,僅僅存在一個(gè)延時(shí)。

705c838a-7f43-11ed-8abf-dac502259ad0.png

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)拖到右邊的波形窗口中

7083b2c0-7f43-11ed-8abf-dac502259ad0.jpg

下圖是srio_example_top_mirror模塊treq通道的波形

70a132c8-7f43-11ed-8abf-dac502259ad0.png

可知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í)序圖

70c5b210-7f43-11ed-8abf-dac502259ad0.png

由上圖可知iresp_tdata的數(shù)據(jù)為:25d0400000000000。與HELLO包格式的對(duì)應(yīng)關(guān)系如下圖所示

70e062b8-7f43-11ed-8abf-dac502259ad0.jpg

由上圖可知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ù)如下圖所示

71010612-7f43-11ed-8abf-dac502259ad0.png

由上圖可知,整個(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)系如下圖所示

71208bc2-7f43-11ed-8abf-dac502259ad0.jpg

388dadad_00255540是NWRITE_R響應(yīng)事務(wù)串行物理層的包,把它轉(zhuǎn)化為二進(jìn)制后各個(gè)字段的對(duì)應(yīng)關(guān)系如下圖所示

7168597a-7f43-11ed-8abf-dac502259ad0.jpg

由于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)系如下圖所示

71975248-7f43-11ed-8abf-dac502259ad0.jpg

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ù)。

71bf7bf6-7f43-11ed-8abf-dac502259ad0.jpg

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ù)的波形如下圖所示

71efcd74-7f43-11ed-8abf-dac502259ad0.png

由上圖可知第一個(gè)有效時(shí)鐘傳輸?shù)腍ELLO格式包頭數(shù)據(jù)為:385420fde0000600。后兩個(gè)有效時(shí)鐘發(fā)送的數(shù)據(jù)分別是c2c2c2c2c2c2c2c2和c3c3c3c3c3c3c3c3。包頭與HELLO包格式的對(duì)應(yīng)關(guān)系如下圖所示

72091c34-7f43-11ed-8abf-dac502259ad0.jpg

由上圖可知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)波形如下圖所示

72225492-7f43-11ed-8abf-dac502259ad0.png

由上圖可知,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)系如下圖所示

7237b6fc-7f43-11ed-8abf-dac502259ad0.jpg

c84500ad_4b38e000_0605c2c2_c2c2c2c2_c2c2c3c3_c3c3c3c3_c3c362a2是NWRITE事務(wù)串行物理層的包,把它轉(zhuǎn)化為二進(jìn)制后各個(gè)字段的對(duì)應(yīng)關(guān)系如下圖所示

725c857c-7f43-11ed-8abf-dac502259ad0.jpg

細(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中的定義是一致的。

7279b692-7f43-11ed-8abf-dac502259ad0.png

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)系如下圖所示

72a02156-7f43-11ed-8abf-dac502259ad0.jpg

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ù)。

72c13efe-7f43-11ed-8abf-dac502259ad0.jpg

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ù)的波形如下圖所示

73003e88-7f43-11ed-8abf-dac502259ad0.png

NREAD請(qǐng)求事務(wù)不帶任何數(shù)據(jù),只包含一個(gè)HELLO格式的包頭,包頭的數(shù)據(jù)為:4e242070000023f0。各個(gè)字段的對(duì)應(yīng)關(guān)系如下圖所示

73229ab4-7f43-11ed-8abf-dac502259ad0.jpg

FTYPE=2,TTYPE=4,這兩個(gè)字段唯一的確定了這是一個(gè)NREAD事務(wù)包。其他字段也與之前在instruction_list.vh中第120行定義的完全相同。

Step2、接下來(lái)再看看NREAD事務(wù)串行物理層的包格式,這個(gè)包在155610ns的位置,下圖是NREAD事務(wù)串行物理層包格式的時(shí)序圖

733b4960-7f43-11ed-8abf-dac502259ad0.png

由上圖可知,整個(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)系如下圖所示

735cb2f8-7f43-11ed-8abf-dac502259ad0.jpg

b84200ad_4b4e0000_23f09c5a是NREAD事務(wù)串行物理層的包,把它轉(zhuǎn)化為二進(jìn)制后各個(gè)字段的對(duì)應(yīng)關(guān)系如下圖所示

73995fdc-7f43-11ed-8abf-dac502259ad0.jpg

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)系表如下所示

7402b4e6-7f43-11ed-8abf-dac502259ad0.jpg

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)系如下圖所示

741da242-7f43-11ed-8abf-dac502259ad0.jpg

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的位置

7452864c-7f43-11ed-8abf-dac502259ad0.png

由上圖可知,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)系如下圖所示

746b0d84-7f43-11ed-8abf-dac502259ad0.jpg

708dadad_804e0000_00000000_0000469c是NREAD響應(yīng)事務(wù)串行物理層的包,把它轉(zhuǎn)化為二進(jìn)制后各個(gè)字段的對(duì)應(yīng)關(guān)系如下圖所示

74927270-7f43-11ed-8abf-dac502259ad0.jpg

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)系如下圖所示

74aeaaee-7f43-11ed-8abf-dac502259ad0.jpg

響應(yīng)事務(wù)串行物理層的包經(jīng)過(guò)物理層、傳輸層和邏輯層到達(dá)iresp通道,iresp通道的時(shí)序如下圖所示

74d8656e-7f43-11ed-8abf-dac502259ad0.png

iresp通道一共有兩個(gè)有效數(shù)據(jù),分別為HELLO格式包頭4ed8400000000000和0000000000000000。HELLO格式包頭4ed8400000000000各個(gè)字段的對(duì)應(yīng)關(guān)系如下圖所示

74f03284-7f43-11ed-8abf-dac502259ad0.jpg

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ù)

751a0276-7f43-11ed-8abf-dac502259ad0.jpg

維護(hù)事務(wù)有本地(Local)和遠(yuǎn)程(Remote)兩種類型,區(qū)分這兩種維護(hù)事務(wù)是通過(guò)maintr_araddr信號(hào)的高八位的值來(lái)確定的。如下圖所示

758c9408-7f43-11ed-8abf-dac502259ad0.jpg

由上圖可知,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í)序圖

75b7bb92-7f43-11ed-8abf-dac502259ad0.png

由上圖可知,紅色框出來(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核寄存器空間的分布如下圖所示

75d8a8c0-7f43-11ed-8abf-dac502259ad0.jpg

下圖是維護(hù)端口(接口2)和邏輯層配置端口(接口3)的時(shí)序圖

75fceec4-7f43-11ed-8abf-dac502259ad0.jpg

當(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的位置

76434b30-7f43-11ed-8abf-dac502259ad0.png

由上圖可知,維護(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)系如下圖所示

7668c31a-7f43-11ed-8abf-dac502259ad0.jpg

104800ff_18010000_0060dead_beefdead_beefbe6e是維護(hù)事務(wù)串行物理層的包,把它轉(zhuǎn)化為二進(jìn)制后各個(gè)字段的對(duì)應(yīng)關(guān)系如下圖所示

76826b3a-7f43-11ed-8abf-dac502259ad0.jpg

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)系如下圖所示

769c1a4e-7f43-11ed-8abf-dac502259ad0.jpg

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ā)自收。如下圖所示

76b698d8-7f43-11ed-8abf-dac502259ad0.jpg

由于我手頭有一塊Xilinx的ZC706評(píng)估板,所以這個(gè)回環(huán)測(cè)試我會(huì)在ZC706上完成。

ZC706上的FPGA型號(hào)為XC7Z045,它的上面BANK109、BANK110、BANK111和BANK112為MGT BANK,如下圖所示

76dab894-7f43-11ed-8abf-dac502259ad0.jpg

其中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)圖如下圖所示

770b2c5e-7f43-11ed-8abf-dac502259ad0.jpg

可以看到上圖用紅色橢圓圈出來(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í)間。

773c33bc-7f43-11ed-8abf-dac502259ad0.jpg

審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 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)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    使用IBIS模型進(jìn)行時(shí)序分析

    電子發(fā)燒友網(wǎng)站提供《使用IBIS模型進(jìn)行時(shí)序分析.pdf》資料免費(fèi)下載
    發(fā)表于 10-21 10:00 ?0次下載
    使用IBIS模型進(jìn)行<b class='flag-5'>時(shí)序</b><b class='flag-5'>分析</b>

    電源時(shí)序器跳閘的原因和解決方法

    電源時(shí)序器跳閘是一個(gè)常見的電氣問(wèn)題,它可能由多種因素引起,包括電源電壓不穩(wěn)定、電路短路、過(guò)載電流以及時(shí)序器本身的故障等。下面將詳細(xì)分析電源時(shí)序器跳閘的原因及相應(yīng)的解決方法。
    的頭像 發(fā)表于 09-29 16:28 ?214次閱讀

    時(shí)序邏輯電路故障分析

    時(shí)序邏輯電路的主要故障分析是一個(gè)復(fù)雜而重要的課題,它涉及電路的穩(wěn)定性、可靠性以及整體性能。以下是對(duì)時(shí)序邏輯電路主要故障的全面分析,旨在幫助理
    的頭像 發(fā)表于 08-29 11:13 ?357次閱讀

    FPGA 高級(jí)設(shè)計(jì):時(shí)序分析和收斂

    今天給大俠帶來(lái)FPGA 高級(jí)設(shè)計(jì):時(shí)序分析和收斂,話不多說(shuō),上貨。 這里超鏈接一篇之前的STA的文章,僅供各位大俠參考。 FPGA STA(靜態(tài)時(shí)序分析) 什么是靜態(tài)
    發(fā)表于 06-17 17:07

    FPGA的IP軟使用技巧

    仿真,需要經(jīng)過(guò)綜合以及布局布線才能使用。 IP軟的優(yōu)點(diǎn)在于其靈活性高、可移植性強(qiáng),允許用戶自配置。然而,其缺點(diǎn)在于對(duì)模塊的預(yù)測(cè)性較低,在后續(xù)設(shè)計(jì)中存在發(fā)生錯(cuò)誤的可能性,有一定的設(shè)計(jì)風(fēng)險(xiǎn)。 選擇合適
    發(fā)表于 05-27 16:13

    rapidio交換芯片是什么

    RapidIO交換芯片是一種基于RapidIO協(xié)議的專用交換芯片,它能夠?qū)崿F(xiàn)高速、低延遲的數(shù)據(jù)傳輸和交換,廣泛應(yīng)用于嵌入式系統(tǒng)、數(shù)據(jù)中心、網(wǎng)絡(luò)通信等領(lǐng)域。RapidIO協(xié)議本身是一種基于
    的頭像 發(fā)表于 03-16 16:40 ?2283次閱讀

    fpga時(shí)序仿真和功能仿真的區(qū)別

    FPGA時(shí)序仿真和功能仿真在芯片設(shè)計(jì)和驗(yàn)證過(guò)程中各自扮演著不可或缺的角色,它們之間存在明顯的區(qū)別。
    的頭像 發(fā)表于 03-15 15:28 ?1742次閱讀

    最實(shí)用的Modelsim使用及仿真的基本步驟

    仿真也稱為時(shí)序仿真或者布局布線后仿真,是指電路已經(jīng)映射到特定的工藝環(huán)境以后,綜合考慮電路的路徑延遲與門延遲的影響,驗(yàn)證電路能否在一定時(shí)序
    的頭像 發(fā)表于 03-06 09:58 ?8338次閱讀
    最實(shí)用的Modelsim使用及<b class='flag-5'>仿真</b>的基本步驟

    Vivado時(shí)序問(wèn)題分析

    有些時(shí)候在寫完代碼之后呢,Vivado時(shí)序報(bào)紅,Timing一欄有很多時(shí)序問(wèn)題。
    的頭像 發(fā)表于 01-05 10:18 ?1663次閱讀

    使用仿真模型進(jìn)行拓?fù)?b class='flag-5'>分析

    擴(kuò)展建模技術(shù),安森美(onsemi)使仿真精度進(jìn)一步提升到更高的水平,此前我們?yōu)榇蠹医榻B了物理和可擴(kuò)展仿真模型功能以及使用Cauer網(wǎng)絡(luò)仿真熱行為及評(píng)估各項(xiàng)因素對(duì)開關(guān)損耗的影響,本文將
    的頭像 發(fā)表于 01-05 10:04 ?803次閱讀
    使用<b class='flag-5'>仿真</b>模型進(jìn)行拓?fù)?b class='flag-5'>分析</b>

    芯片前仿真和后仿真的區(qū)別

    是指在芯片設(shè)計(jì)過(guò)程中,對(duì)電路的功能和性能進(jìn)行仿真驗(yàn)證的環(huán)節(jié)。它主要關(guān)注電路的功能性、時(shí)序和功耗等方面,以確保設(shè)計(jì)的正確性和可行性。前仿真通常在物理布局之前進(jìn)行,因此也稱為靜態(tài)時(shí)序
    的頭像 發(fā)表于 12-13 15:06 ?6384次閱讀

    FPGA優(yōu)質(zhì)開源模塊-SRIO IP的使用

    本文介紹一個(gè)FPGA常用模塊:SRIO(Serial RapidIO)。SRIO協(xié)議是一種高速串行通信協(xié)議,在我參與的項(xiàng)目中主要是用于FPGA和DSP之間的高速通信。有關(guān)SRIO協(xié)議的詳細(xì)介紹網(wǎng)上有很多,本文主要簡(jiǎn)單介紹一下SRIO IP的使用和本工程的源代碼結(jié)構(gòu)。
    的頭像 發(fā)表于 12-12 09:19 ?1923次閱讀
    FPGA優(yōu)質(zhì)開源模塊-SRIO IP<b class='flag-5'>核</b>的使用

    基于FPGA的時(shí)序分析設(shè)計(jì)方案

    時(shí)鐘的時(shí)序特性主要分為抖動(dòng)(Jitter)、偏移(Skew)、占空比失真(Duty Cycle Distortion)3點(diǎn)。對(duì)于低速設(shè)計(jì),基本不用考慮這些特征;對(duì)于高速設(shè)計(jì),由于時(shí)鐘本身的原因造成的時(shí)序問(wèn)題很普遍,因此必須關(guān)注。
    發(fā)表于 11-22 09:29 ?635次閱讀
    基于FPGA的<b class='flag-5'>時(shí)序</b><b class='flag-5'>分析</b>設(shè)計(jì)方案

    送電電壓電流相、測(cè)相量及分析

    送電電壓電流相、測(cè)相量及分析
    的頭像 發(fā)表于 11-17 09:41 ?644次閱讀
    送電電壓電流<b class='flag-5'>核</b>相、測(cè)相量及<b class='flag-5'>分析</b>

    網(wǎng)絡(luò)丟問(wèn)題分析

    通常會(huì)帶來(lái)嚴(yán)重的性能下降,特別是對(duì) TCP 來(lái)說(shuō),丟通常意味著網(wǎng)絡(luò)擁塞和重傳,進(jìn)而還會(huì)導(dǎo)致網(wǎng)絡(luò)延遲增大、吞吐降低。 一、 哪里可能丟 接下來(lái),我就以最常用的反向代理服務(wù)器 Nginx 為例,帶你一起看看如何分析網(wǎng)絡(luò)丟
    的頭像 發(fā)表于 11-13 11:24 ?879次閱讀
    網(wǎng)絡(luò)丟<b class='flag-5'>包</b>問(wèn)題<b class='flag-5'>分析</b>