可参考gongzhonghao:小苏的FPGA
目录
摘要
SRIO常用于FPGA与DSP、FPGA与FPGA、板间的通信。
根据之前在项目中实现FPGA板间、FPGA与DSP间应用SRIO协议通信的经验,分享如何在FPGA中简单应用开发SRIO。
本文主要介绍NWRITE+DOORBELL形式的数据通信,需要相关代码的私信。
上图为一种多颗FPGA、DSP间的数据协议转换方案。
一、SRIO概述
1.1 、SRIO介绍
SRIO是串行RapidIO的简称,高速串行通信协议,在FPGA端基于SerDes实现,且采用8B/10B编码。
SRIO协议由逻辑层、传输层和物理层构成。
逻辑层定义协议和包格式,比如用户接口:IO和消息接口,实现通信。
传输层为数据通道相关信息:包交换、路由寻址。例如支持8bit/16bit器件ID,可容纳256或65536个器件互联。
物理层描述了设备之间接口协议,例如流控,lane数目等。
1.1.1、SRIO核框架
SRIO核框架如下:
上图描述了SRIO的3层协议:逻辑层(LOG)、传输层(BUF)和物理层(PHY),以及GT接口,时钟及复位关系。SRIO是在高速收发器GT的基础上封装的。PHY层是基于GT对数据进行组帧、解帧,PHY层和GT的时钟相关,逻辑层与PHY层的时钟可能不同,通过BUF进行缓冲数据。时钟与复位关系同GT收发器核应用相同。
1.1.2 、逻辑层接口
对于开发SRIO协议通信,主要关注逻辑层接口,特别是用户接口。逻辑层分成几个部分以实现收发数据包。逻辑层有3类接口:用户接口,传输接口和配置接口,粗箭头表示AXI-Stream协议,细箭头表示AXI-Lite协议。
传输接口与BUFFER直接相连,配置接口用于配置逻辑层的一些寄存器参数,一般不常用。用户接口经常使用IO端口收发数据,其余端口也不常用
用户接口主要包括IO port,Messaging Port,Maintenance Port,User-Defined Port。常用IO端口收发数据,其余端口不常用。
配置接口主要用于一些寄存器参数配置,不常用。
传输接口包含发送和接收两个端口,连接Buffer,对开发者不可见。
IO port :常用的事务类型如NWRITE,NWRITE_R,SWRITE,NREAD和RESPONSE(不含维护响应)、DOORBELL等,都是在IO端口上进行的。使用HELLO或SRIO Stream两种数据格式,常用HELLO格式。
Messaging Port :message 也可以通过IO prot传输(比如门铃DOORBELL只能在IO端口);
Maintenance Port:维护数据包,配置底层寄存器需要选择使用;
User-Defined Port :自定义协议类型。
1.1.3 、通信收发接口
在用户接口中常用的数据收发通信如下,AXI Stream协议模式:
发送数据:本地设备生成的请求(本地发送的数据)及门铃通过ireq通道发送;
接收发送响应:如果本端发送带相应的事务(如NWRITE_R),远端设备产生的响应包通过iresp通道接收来;
接收数据:远端设备生成的请求(对端发送的数据)及门铃通过treq通道接收;
发送接收响应:本地设备产生的响应包通过tresp通道发送(比如本端对NWRITE_R的响应);
1.2 常用的包协议
用户接口通信用途的包有hello包和流式包;hello包时序如下:
在实际项目中hello包应用最多,valid和ready握手表示协议有效,last表示包结束,data表示数据和头部信息,keep表示data的有效字节,user包含ID信息。
stream包时序如下:
1.2.1、包结构
SRIO具有3层:用户层、传输层、物理层,对应的包结构也有三层:不同字段代表不同含义。
白色部分对应于应用层;灰色部分对应于传输层,黄色对应于物理层。对于开发者,需要构造、解析应用层。
事务类型主要有:由Ftype和Ttype字段决定,FPGA中常用的NWRITE、NWRITE_R、DOORBELL、NREAD、RESPONSE(有无数据)。
1.2.2、Hello包
hello包格式如下:左侧红框标志为事务类型,上方黄框标志为64bit,列表内为具体位置的含义。HELLO数据包格式中逻辑层每个时钟传输64 bit。
字段含义:主要关注NWRITE、DOORBELL相关字段,其中size表示数据字节数-1,每包最多可传输256字节;addr地址值要与每包数据字节数对应变化。在实际开发中,每包TID值要不同,DOORBELL的TID要与最后一包的TID值相对应,否则有概率会造成掉链。
当有效数据不足8字节或不是8字节整数倍时,需要其他控制字段表示;实际应用中,大都会避开此种应用,这里不再展开描述。
1.3 时钟关系
SRIO支持的线速率与GT参考时钟主要有以下几种:有“x”标志的是SRIO支持的类型组合。
1.3.1、7系列及UltraScale系列的时钟框架
SRIO及GT时钟关系如下:7系列和UltraScale/+系列
上述时钟框架中:phy_clk是主内核时钟,gt_pcs_clk用于GT与PHY通信的时钟信号(usrclk2),gt_clk是GT内PCS与PMA并行数据的时钟信号(usrclk)。log_clk为SRIO逻辑层的数据、配置等时钟。cfg_clk为SRIO配置接口时钟,与log_clk时钟相同。
gt_pcs_clk的时钟频率=gt_clk/2 (usrclk2是usrclk频率的一半),phy_clk=(gt_clk *lane数目)/4。为了防止BUFFER溢出,log_clk应不低于phy_clk,且log_clk与phy_clk同步。
1.3.2、SRIO及GT时钟关系
SRIO支持的lane数目及线速率主要有以下几类:GT数目,x4、x2、x1三种模式。
上述表格中在不使用Train down功能中,phy_clk时钟频率等于log_clk
在GT内并行数据位宽=线速率/usrclk=线速率/gt_clk=20bit,8/10B转换,实际数据位宽为16bit。usrclk2是usrclk频率的一半,PHY传输一次数据,GT需要传输两次数据。
根据用户层log_clk/phy_clk一次传输64bit,在GT内usrclk2(gt_pcs_clk)该数据传输的次数,可推导gt_pcs_clk与log_clk/phy_clk的频率关系进行印证。
1.3 、复位
关于复位的使用可参考SRIO核example design中的复位使用方法。每个时钟域下都有对应的复位信号,复位信号在相应时钟域下至少拉高四个时钟周期才有效。
二、SRIO核的使用
由于我的开发板上只有一个QSFP光模块单芯,且GT参考钟为156.25MHz,为了便于测试验证,此次设置采用x4模式,线速率为3.125Gbps或6.25Gbps。
2.1 、SRIO核的设置
本次设计示例不涉及维护端口,模式选择Basic
GT类型取决于FPGA型号,vivado自动选择;
Lane速率及数目、参考时钟选择:根据自己的开发板设置。由于我的开发板上为QSFP及156.25MHz,所以选择4条lane,参考钟设置为156.25MHz,在此限制下线速率有3.125Gbps和6.25Gbps两种选择,本次仿真中采用线速率3.125Gbps,上板测试选用6.25Gbps。
Buffer深度可选择8、16、32,建议选32,余量大些。
本端ID:ID位宽及具体值。
由于本次设计不涉及Train down,可以勾选phy_clk时钟频率等于log_clk。
最后是关于资源类型选择,由于我的开发板上该部分GT时钟只有SRIO使用,不存在与别的GT共享时钟资源,可选择为core内部。
2.2 、核时钟资源共享使用
该部分主要是GT时钟的使用,当GT时钟由多个不同的GT使用时,需要共享时钟资源,选择其中一个类型为共享在核内,剩余的选择为in Example Design;将in Core开放的对应时钟及复位连接in Example Design。
三、SRIO通信程序设计(NWRITE+DOORBELL)
结合实际应用场景经验,选择NWRITE+DOORBELL应用广泛,DoorBell门铃作为一次通信中断。一次NWRITE携带256字节数据,在实际应用中不足256字节的可以补零填充。
测试场景:QSFP进行收发自回环测试;VIO控制测试进行,可设置一次通信发送的字节数,不足256字节整数倍的自动补充成256字节,测试数据为递增数,最后发送DOORBELL。
3.1 、测试控制模块
测试模块:根据VIO信息产生测试数据,控制测试数据FIFO写;以及结合ireq模块状态控制读取FIFO数据及封装Hello包所需的信息。
参数信息:端口ID,数据地址,doorbell信息。
端口信息:链路状态,nwrite状态;输出hello包头部信息,数据及发送触发等。
测试数据的状态机:
关于NWRITE及DOORBELL相关信息及控制的状态主要涉及:
3.2 、Hello包封装模块
Hello包的发送在ireq接口,这部分主要封装NWRITE和DOORBELL的包。端口信息如下:
输入来源于测试控制模块,输出对应于SRIO核的axis_ireq接口。其中状态机设计如下:其中nwrite与doorbell之间加了延时,如果不加,doorbell与最后一个nwrite包会背靠背连在一起。
3.3 、Hello包解析模块
主要根据Hello包时序及不同字段的含义解析NWRITE和DOOBELL信息。
输入来自于对端发过来的axi_treq接口,输出响应信号(可选择的送到SRIO核的tresp端口),接收的NWEITE数据及地址信息和DOORBELL信息。
3.4 、链路自复位功能
当监测到链路掉链时,要产生至少4个时钟周期的复位信号,复位SRIO核;否则容易造成SRIO核状态信号不正常,导致通信无法继续。
3.5 、整体工程
测试工程结构如下:
四 、 仿真测试
仿真测试,容易观测很多细节信息;仿真采用3.125Gbps x4模式。
建链过程如下:
从上图可以看出port_initialized 信号与 link_initialized 信号拉高先后顺序,分别表示端口和链路被成功初始化。
下方表示链路建立之前的时钟及复位关系。
只有当链路初始化成功后,方可使用SRIO进行通信。
时钟关系如下:频率及相位关系与datasheet相对应。
NWRITE+DOORBELL收发过程如下:4个NWRITE+1个DOORBELL
发送的第1、2包如下:
上述hello首包可知。地址信息分别为0x001000000、0x001000100,协议类型组合为NWRITE
接收的第1、2包如下:解包数据为递增数,解包无误。
发送的DOORBELL如下:hello包头信息不再赘述。
输入来自于对端发过来的axi_treq接口,输出响应信号(可选择的送到SRIO核的tresp端口),接收的NWEITE数据及地址信息和DOORBELL信息。
五、 上板测试
设置信息如下:起始地址与doorbell信息。由于是自回环,收发器件ID相同,与核设置相同。
硬件平台如下:
5.1 、链路稳定性测试
上电后,以链路掉链作为触发,观测10分钟,链路状态稳定。
5.2 、发包测试
VIO设置发包数及使能:数据大小1K字节
4包NWRITE及DOORBELL整体信息如下:
从上图可获得每包的地址,相关控制信息及状态等。第一包的hello头细节信息如下:
DOORBELL包信息如下:头部信息、时序、状态机转换。
5.3、收包测试
接收的ILA信息:4个nwrite和1个门铃。doorbell信息为0x0001,每包的地址信息与发包对应。
第一包信息:数据为1~32递增数,解析正确。
往期精彩回顾