SRIO學習筆記之SRIO簡介與Xilinx SRIO ip核例程詳解

目錄

1. 概述

2. 參考文件

3. SRIO協議介紹

3.1 SRIO的數據流

3.2 SRIO的數據協議

3.3 SRIO常用FPGA支持的模式

3.4 SRIO例程代碼的時鐘計算

4. SRIO的例程代碼結構

4.1 SRIO發送模塊詳解

4.1.1 發送數據部分代碼功能說明

4.1.2 接收響應部分的代碼功能詳解

4.2 SRIO接收模塊詳解

4.2.1 接收數據部分的代碼功能說明

4.2.2 發送響應部分的代碼功能說明

5. 疑點

疑點1:

疑點2:


1. 概述

本文是用於記錄srio的學習情況,以及一些對xilinx的vivado 2017.4中生成srio例程代碼的解釋。

2. 參考文件

《pg007_srio_gen2》

3. SRIO協議介紹

本處將從SRIO的數據流,數據協議,常用FPGA支持模式,以及IP例程中的時鐘大小計算等部分介紹SRIO的情況。

 

3.1 SRIO的數據流

SRIO通過生成IP後,通常情況下主要使用的接口爲四組:ireq,iresp,treq,tresp。每個IP生成後都有這四組接口,即可以同時用於發送數據,接收數據,發送響應數據,接收響應數據。而這些接口間的信號流向如下圖所示:

 

即其信號流爲IREQ發出給TREQ,TRESP發出給IRESP。

 

3.2 SRIO的數據協議

SRIO傳輸與響應的包類型很多,具體看手冊P73-P74頁。

 

在使用Xilinx的ip核時,通常用的都是HELLO包,所以這裏指給HELLO包的格式。如下圖所示。Packet 中的具體符號表示意義請查看手冊P76-P77頁。其中的size爲一包傳輸byte的數據量,範圍爲1-256 bytes。

    其典型的傳輸數據的用戶接口代碼的波形協議如下圖所示:

 

3.3 SRIO常用FPGA支持的模式

 

 

3.4 SRIO例程代碼的時鐘計算

refclk可使用時鐘如下圖table3-3所示。其中典型的時鐘計算如Table3-4表頭所示。:

gt_clk     = line_rate/20;

gt_pcs_clk = line_rate/40;

phy_clk    = (gt_clk*link_width)/4;

log_clk    = phy_clk;

cfg_clk    = phy_clk;

 

4. SRIO的例程代碼結構

SRIO生成例程後,其例程結構如下圖所示。看着有8個文件,但常規情況下與我們相關的只有只有兩個文件,即下圖高亮的兩個文件:

  1. srio_request_gen_srio_gen2_0(發送數據模塊);
  2. srio_response_gen_srio_gen2_0(接收數據模塊)

 

 

4.1 SRIO發送模塊詳解

SRIO發送模塊中主要有兩部分代碼,發送數據部分(ireq),發送響應數據部分(iresp)。接收部分端口如下圖所示:

 

 

 

4.1.1 發送數據部分代碼功能說明

發送的包頭數據的來源爲“request_data_out = instruction[request_ address]”,即數據是從`include "instruction_list.vh"文件中調入的。而選擇其文件中的哪些數據則是根據request_address算來的,具體如下圖部分所示。

 

最終包頭的格式爲:

 

    而包中去掉包頭後傳輸的數據爲每8位遞增數據數據,具體如下圖所示。

 

重點:發送用戶自己的數據與包頭時設置,將go的值設置爲0x01。

 

 

 

4.1.2 接收響應部分的代碼功能詳解

接收響應部分主要功能是在期望的得到迴應的包類型時,檢查是否迴應的對應包頭類型。

而判斷包頭類型是否正確主要是根據預判的ftype(expected_ftype)時,檢查接收到的ttype是否爲協議規定的類型。判斷的方式爲下圖位置:

 

4.2 SRIO接收模塊詳解

SRIO接收模塊中主要有兩部分代碼,接收數據部分(treq),接收響應數據部分(tresp)。接收部分端口如下圖所示:

 

 

4.2.1 接收數據部分的代碼功能說明

接收部分主要是通過解析接收端口的信號,實時的解析如下圖的信息,以及first_beat(beat爲1個時鐘的*_data),之後將每包數據去掉包頭後丟入“RAMB36SDP(local_data_store)”中,但是每一包丟入數據時的首地址是current_addr[10:3]。

 

 

 

4.2.2 發送響應部分的代碼功能說明

響應部分的代碼分兩部分,第一部分是響應的包頭信號部分,第二部分是響應的數據部分。

包頭信號部分信息與響應的包類型相關,如下圖所示,詳細信息參考《pg007》的p76頁。

 

數據部分的信息主要是提取treq中輸入的信號。但提取的方式是根據starting_read_addr = {1'b0, response_data_out[29:22]}開始提取數據輸出,即是根據current_addr[10:3]的地址提取數據。也就是說這個提取數據的位置是根據輸入數據包中的地址中的一部分作爲首地址來定位的數據開始地方。

當然是否需要反饋數據部分得根據接收到的包頭類型而定,有些包只需要反饋包頭不需要數據,有些包不需要進行反饋,詳情參考手冊P73頁。

保證存入“RAMB36SDP(response_queue_inst)”的包頭判斷信息無誤的依據是RAMB36SB的寫使能WREN(generate_a_response),generate_a_response是在接收到的first_beat時,且這個包頭是需要反饋數據的包頭時纔會拉高使能。需要反饋的依據在《pg007》的Table 3-1,具體信息如下圖所示:

 

 

5. 疑點

疑點1:

雖然理論上來說反饋的數據提取數據是根據包頭信息在同一個位置提取的,那麼反饋的數據就和接收的對應包數據相同。但是由於接收到的數據包頭的地址可能相同,至少current_addr[10:3]有很大機率相同,那麼就會存在數據覆蓋的現象,那麼就會導致反饋的數據不是想要的數據,即返回的數據與接收到的數據不同。

 

疑點2:

    爲何把“current_addr[23:16] == 8'h12”作爲pull_from_store(從存儲地址開始拉高)?

   

    答:這個只是對應SRIO例程的發射數據,發射數據自定義的“真實起始地址”,參考手冊P161,如下圖所示。在自己使用時可以屏蔽掉與這個相關的信號。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章