天天看點

【FPGA】SRIO例子程式仿真分析實踐

當我們去看有關高速串行總線與并行總線相比較的優點,會發現有這麼一條描述,說串行總線能實作分割式資料傳輸,所有的串行總線都使用包括包和分割式資料傳輸協定進行資料傳輸。串行總線有包的概念,包可以有包界定符号,包起始控制符,包結束控制符以及中間的資料資訊,CRC校驗資訊等。

這篇博文,我們就通過仿真來了解下這句話的含義,看看我們是如何發送資料以及如何接收到資料的。

這裡稍微偏題,總結下串行總線相較于并行總線的好處:

占用引腳數量少;

TX以及RX信号線上采用差分信号傳輸方式,這種傳輸方式具有很高的抗噪聲能力;

強錯誤檢測能力,串行協定使用了基于包的資料傳輸方式并帶有CRC校驗,接收裝置能檢測出接收資料包中的錯誤并通知發送端出現了傳輸錯誤,發送端可以重新發送出現錯誤的包;

全雙工資料和控制流等。

好了,下面進入正題,我們的仿真程式使用了Vivado提供的例子程式:

建立工程,建立IP核,之後打開例子程式就好了:

【FPGA】SRIO例子程式仿真分析實踐

具體見博文:Xilinx RapidIO核例子工程源碼分析

可以看看仿真程式的結構:

【FPGA】SRIO例子程式仿真分析實踐

一個primary,一個mirror,二者之間的關系就是primary發送資料,mirror接收資料,反之也成立。

二者程式都是例化了設計程式,是以内容一緻,隻不過一個是請求方一個是響應方而已。如下圖:

【FPGA】SRIO例子程式仿真分析實踐

我的IP核采用的是X1模式,也就是隻有一對差分發送和接收線TX0_N, TX0_P, RX0_N, RX0_P。

下面是SRIO核的接口示意圖:

【FPGA】SRIO例子程式仿真分析實踐

可以看到,SRIO核協定可以分為三層,邏輯成LOG,傳輸層Buffer,以及實體層(PHY),資料從實體層出來就到了串行收發器,串行發送資料,或者資料從串行收發器接收串行資料,之後到達實體層,傳輸層以及邏輯層,使用者能夠操縱的是邏輯層的資料,我們對使用者接口進行操作得到我們需要的資料(解析)。

邏輯層的包采用HELLO格式,關于這個格式可以看博文:【FPGA】SRIO中的關鍵問題總結(一)SRIO中的關鍵資料包格式總結

這種格式把包的標頭進行标準化,而且把標頭和資料在接口上分開傳輸,這将簡化控制邏輯并且允許資料與發送邊界對齊,有助于資料管理。

如下圖:

【FPGA】SRIO例子程式仿真分析實踐

下面是攜帶有資料負載的HELLO格式包在使用者接口上傳輸的時序圖,這個時序圖傳輸了4個64位資料,也就是4個雙字,加上標頭,傳輸需要5個時鐘周期。

【FPGA】SRIO例子程式仿真分析實踐

當然,也并非必須攜帶資料負載,并且傳輸也可以等待,如下:

【FPGA】SRIO例子程式仿真分析實踐

首先,有兩個背靠背(back-to-back)單周期包(包不帶資料負載,僅包含一個標頭)。包的邊界通過拉高tlast信号進行訓示。在單周期包傳輸完畢以後,主機等待了一個時鐘周期才開始發送下一個包。在發送第三個包的過程中,主機(Master)和從機(Slave)分别通過拉低tvalid和tready信号一個時鐘周期來暫停資料的發送,由于第三個包的資料負載為2個雙字,是以傳輸第三個包一共消耗了3個有效時鐘,加上2個無效的時鐘周期,一共消耗了5個時鐘周期。

資料在邏輯層上傳輸後到達傳輸層,組裝其他資訊得到一個傳輸層的包,之後在傳輸到實體層,再次組裝并添加資訊層位實體層的包,這個包是最終的包,最終到達串行收發器發送出去,最終的包的格式如下:

【FPGA】SRIO例子程式仿真分析實踐
【FPGA】SRIO例子程式仿真分析實踐

可見,這裡的包包括了各個層的資訊。

當然發送出去的也并非都是資料包,也有控制符号包,如下為控制符号包格式:

【FPGA】SRIO例子程式仿真分析實踐

控制符号通常用于充當包的起始标志,或結束标志,成為包起始控制符号以及包結束控制符号。

具體參看:【FPGA】SRIO中的關鍵問題總結(一)SRIO中的關鍵資料包格式總結

這點我們可以通過下面的仿真來了解。

先觀察幾個關鍵信号的波形,例如port_initialized和link_initialized,它們有效則表示端口和鍊路初始化成功。

【FPGA】SRIO例子程式仿真分析實踐

之後觀察發送的第一個發送的事物SWRITE:

localparam [64*37-1:0] swrite_instruction = {
  // RSVD,   FTYPE, TTYPE,  ADDRESS,       SIZE
  // SWRITEs
  {12'h000, SWRITE, 4'h0,   36'h000000777, 8'd0},  
  {12'h000, SWRITE, 4'h0,   36'h000008806, 8'd0},  
  {12'h000, SWRITE, 4'h0,   36'h000000125, 8'd0},  
  {12'h000, SWRITE, 4'h0,   36'h000000124, 8'd0},  
  {12'h000, SWRITE, 4'h0,   36'h000000123, 8'd0},  
  {12'h000, SWRITE, 4'h0,   36'h000000122, 8'd0},  
  {12'h000, SWRITE, 4'h0,   36'h000000121, 8'd0},  
  {12'h000, SWRITE, 4'h0,   36'h000000120, 8'd0},  
  {12'h000, SWRITE, 4'h0,   36'h000000126, 8'd1},  
  {12'h000, SWRITE, 4'h0,   36'h000000124, 8'd1},  
  {12'h000, SWRITE, 4'h0,   36'h000000122, 8'd1},  
  {12'h000, SWRITE, 4'h0,   36'h000004350, 8'd1},  
  {12'h000, SWRITE, 4'h0,   36'h000004355, 8'd2},  
  {12'h000, SWRITE, 4'h0,   36'h000012300, 8'd2},  
  {12'h000, SWRITE, 4'h0,   36'h000012304, 8'd3},  
  {12'h000, SWRITE, 4'h0,   36'h000345000, 8'd3},  
  {12'h000, SWRITE, 4'h0,   36'h000345003, 8'd4},  
  {12'h000, SWRITE, 4'h0,   36'h004550000, 8'd4},  
  {12'h000, SWRITE, 4'h0,   36'h004550002, 8'd5},  
  {12'h000, SWRITE, 4'h0,   36'h198877600, 8'd5},  
  {12'h000, SWRITE, 4'h0,   36'h198877601, 8'd6},  
  {12'h000, SWRITE, 4'h0,   36'h2ABBCCDD8, 8'd6},  
  {12'h000, SWRITE, 4'h0,   36'h2ABBCCDD8, 8'd7},  
  {12'h000, SWRITE, 4'h0,   36'h2ABBCCDD8, 8'd15}, 
  {12'h000, SWRITE, 4'h0,   36'h2ABBCCDD8, 8'd31}, 
  {12'h000, SWRITE, 4'h0,   36'h120000600, 8'd63}, 
  {12'h000, SWRITE, 4'h0,   36'h230000600, 8'd95}, 
  {12'h000, SWRITE, 4'h0,   36'h340000600, 8'd127},
  {12'h000, SWRITE, 4'h0,   36'h450000600, 8'd255},
  {12'h000, SWRITE, 4'h0,   36'h560000600, 8'd15}, 
  {12'h000, SWRITE, 4'h0,   36'h670000600, 8'd31}, 
  {12'h000, SWRITE, 4'h0,   36'h780000600, 8'd63}, 
  {12'h000, SWRITE, 4'h0,   36'h780000600, 8'd95}, 
  {12'h000, SWRITE, 4'h0,   36'h890000600, 8'd127},
  {12'h000, SWRITE, 4'h0,   36'h9A0000600, 8'd255},
  {12'h000, SWRITE, 4'h0,   36'hAB0000600, 8'd15}, 
  {12'h000, SWRITE, 4'h0,   36'hCD0000600, 8'd15}};      

下面以上圖第50行的SWRITE事務為例來說明整個SWRITE事務的傳輸過程。這個事務表示的是利用SWRITE事務往位址36’hCD0000600發送16個位元組的資料。

由于是一個請求事物,找到ireq開頭的波形,如下圖:

【FPGA】SRIO例子程式仿真分析實踐

可以看上述波形中的tvalid,tready,tdata以及tlast可以清楚的看出傳輸的資料,這個波形和下面的傳輸時序圖一緻:

【FPGA】SRIO例子程式仿真分析實踐

由于僅當tvalid和tready同時為高時,tdata上的資料才為有效資料,是以這個SWRITE一共消耗了三個有效時鐘周期,其中第一個時鐘周期發送的是HELLO標頭,後面兩個時鐘周期分别發送8個位元組的資料(第一個時鐘發送的資料是0000000000000000,第二個時鐘發送的資料是0101010101010101),一共16個位元組的資料,和instruction_list.vh中第50行定義完全一緻,整個時序也與HELLO格式的時序完全吻合。

對照HELLO格式解析標頭。標頭為006020fcd0000600,轉化為二進制後與HELLO格式各個字段對應關系如下所示:

【FPGA】SRIO例子程式仿真分析實踐

由上圖可知FTYPE字段的值為6,表明确實是一個SWRITE事務。

SWRITE事務通道ireq通道(接口1)傳輸給SRIO核以後進入SRIO的邏輯層,邏輯層會給包添加傳輸層的資訊發送給Buffer(接口3),然後Buffer會把資料發送給實體層(接口5),之後在發到SRIO串行收發器,這裡直接看看觀察SRIO收發器的資料通道gttx_data[31:0]:

【FPGA】SRIO例子程式仿真分析實踐

  7c96f004中的7c是特殊字元/K28.3/,它是一個包界定符(Packet Deliminator Control Symbol),968012是一個包起始控制符,968215是一個包結束控制符号。二者之間是包的内容:

b04600ad_d0000600_00000000_00000000_01010101_01010101_e8d30000是SWRITE事務串行實體層的包,把它轉化為二進制後各個字段的對應關系如下圖所示

【FPGA】SRIO例子程式仿真分析實踐

上圖中data字段是傳輸的00000000_00000000_01010101_01010101這16個位元組資料的二進制碼,因為它的二進制碼太長了是以我直接用data替代。由于本次傳輸的位元組小于80個位元組,是以SWRITE事務的最後面的三個字段不存在,大家可以抓一下資料量為256個位元組的SWRITE包,當資料量大于了80位元組,後面的三個字段也會有資料。

這隻是SWRITE事物中一個包而已,其他包類似分析。

參考:

【SRIO】6、Xilinx RapidIO核仿真與包時序分析

pg007