简要讲解Xilinx的SRIO IP的配置参数(高速收发器二十九)

文章来源:数字站

配置SRIO IP

打开srio IP的配置界面,如下图所示,在1处选择使用高级模式。

2处设置SRIO的数据链路,包含几路高速收发器,由于后续上板时通过光纤回环,开发板上只有两路光纤,因此只能选择数据链路x1。
3处设置高速收发器的线速率,选择最大线速率6.25Gbps,然后在4处选择高速收发器的参考时钟频率为156.26MHz。

5处需要设置发送端和接收端buffer的深度,可以设置为8、16、32,表示缓冲区能够存储的最多数据包数量。图片

图1 配置“Basic”界面.png

图1 配置“Basic”界面

6处需要设置设备ID和设备ID的位宽,如果网络中存在多个ID,那么需要通过识别ID来判断是否接收对应数据包。8位ID的网络最多存在256个SRIO设备,同一网络下,16位ID最多可以存在65536个SRIO设备。
同时可以勾选统一log_clk和phy_clk时钟,如果勾选该选项,则log_clk必须与phy_clk保持一致,可以节省资源。
7处用于设置流量控制的方式,如果勾选发送方流量控制,则优先使用发送方流量控制,如果接收方不支持发送方发起的流量控制,则会更改位接收方发起的流量控制。机制应该与Aurora协议的流量控制一致。

然后配置“Logiccal Layer”界面,如下图所示,其中1和2用于配置发送端和接收端支持的数据包类型,一般默认即可,均支持写、流写、带响应的写、读、门铃、消息等事务。

图2 配置“Logiccal Layer”界面.png

图2 配置“Logiccal Layer”界面

勾选3处将启用逻辑层输入端口之间的仲裁器,启用时,可确保同等优先级的端口永远不会出现资源匮乏的情况。当前数据包完成后,仲裁器切换到下一个端口。

在稳定状态下,如果所有端口的tvalid信号都被拉高,如下图所示。仲裁器将按以下顺序拉高tready来响应对应的端口,实现仲裁功能。

图3 仲裁时序图.png

图3 仲裁时序图

当端口设置为Initiator/Target I/O时,依次响应用户定义端口、发送方请求端口、目标响应端口、消息发送方请求端口、消息目标响应端口、维护端口。

当端口设置为Condensed I/O时,依次响应用户定义端口、精简I/O发送端口、消息发起方请求端口、消息目标响应端口、维护端口。每当一个端口赢得仲裁时,它就会移动到队列的末尾,所有其他端口都会上移一个位置。

4处始终勾选,表示核心能够发起维护请求(包括本地和远程请求)。

5处为本地配置空间基址,勾选时内核检查传入I/O事务的高位地址,如果地址匹配,则将事务路由到维护端口。LCSBA匹配仅由核心对HELLO格式的数据包执行,I/O格式必须设置为HELLO,并且必须支持事务类型,以便核心将数据包重新路由到维护端口。

默认LCSBA掩码:LCSBA CSR的复位值。一个10位掩码,与传入I/O事务的高位地址进行比较,以便它们在以此地址空间为目标时可以重新路由到配置空间。

下图配置“I/O”界面,该界面用于配置逻辑层用户端口的端口形式和数据格式。

图4 配置“IO”界面.png图片

图4 配置“I/O”界面

1处用于设置I/O端口使用Condensed I/O模式还是Initiator/Target I/O模式,通常使用Initiator/Target I/O。

勾选选项2将I/O端口的数据格式设置为HELLO,否则使用SRIO Stream交互数据。

3处用于选择消息传递端口的接口样式,可以与I/O端口结合,也可以将消息端口单独分离出来。默认消息端口与I/O端口结合使用。

4处用于设置维护方式,SRIO Gen2提供了AXI4-Lite维护端口选项。

下图时设置“Buffer Layer”界面,勾选1允许发送缓冲区重新排序请求包,优先级较高的请求包会在优先级较低的请求包之前发出。图片

图5 设置“Buffer Layer”界面.png

图5 设置“Buffer Layer”界面

2处是流量控制选项,暂时保持默认即可。

下图用于设置PHY层,1处用于指示CRF位是否用于扩展优先级映射。

图6 设置“Physical Layer”界面.png

图6 设置“Physical Layer”界面

2处通过下拉列表选择在转换到致命错误状态之前,在没有收到链接响应的情况下要发送的链接请求的数量,默认设置为3。

勾选3启用软件辅助错误恢复:RapidIO规范专门为软件辅助错误恢复定义了三个命令和状态寄存器。

空闲模式支持:支持的空闲模式因组件/系统生成页面上选择的传输频率而异。IDLE1仅支持线速率小于5Gbps的模式,IDLE2只支持线速率为6.25Gbps的链路设计。

设置“Logic Registers”界面如下图所示,1处是设备标识卡存储RapidIO设备的信息,不可修改。

图7 设置“Logic Registers”界面.png

图7 设置“Logic Registers”界面

2处Assembly Identity CAR:存储有关RapidIO设备子系统创建者的信息,可以设置寄存器的程序集标识符和程序集供应商标识符字段,以唯一地标识端点,这些值不会影响核心功能。

3 处Assembly Information CAR:存储有关RapidIO设备子系统版本的信息,不影响核心功能。

4 处 Processing Element Features CAR:选择处理元件提供的主要功能,可选设置有桥、内存、处理器、内存和桥,一般将FPGA设置为内存。

下图是设置“Physical Registers”界面,该界面只需要关注该设备是否作为主机,其余选项保持默认即可。图片

图8 设置“Physical Registers”界面.png

图8 设置“Physical Registers”界面

最后配置“Shared Logic”界面,如下所示,将共享逻辑放在示例工程中,便于后续扩展。图片

图9 配置“Shared Logic”界面.png

图9 配置“Shared Logic”界面

然后点击OK,生成该IP。

分析SRIO示例工程

如下图所示,在IP选项卡中,鼠标右键生成的IP,然后选择Open IP Example Design…,即可打开该IP的官方示例工程(如果该选项卡是灰色的,则表示该IP还没有完全生成,Vivado右上角还有圈在旋转,在等一会即可)。

图10 打开示例工程.png

图10 打开示例工程

打开工程的第一件事就是打开RTL视图,查看该工程模块信号的流向,然后再去分析各个模块的代码。

打开顶层RTL视图如下所示,中间是SRIO IP封装完的模块,左边有发送请求事务模块(ireq和iresp)、接收请求事务模块(treq和tresp)、维护事务模块。

图11 顶层模块RTL视图.png

图11 顶层模块RTL视图

打开SRIO顶层模块,如下图所示,包含四个模块,与前文的GTX、Aurora的IP示例工程基本一致。包含复位逻辑产生和同步模块、时钟生成模块、GT_COMMON调用模块、SRIO IP。

图12 示例工程中SRIO内部组成.png

图12 示例工程中SRIO内部组成

SRIO的示例工程的顶层文件结构如下所示,包含9个文件,经常使用到的2个文件如下,1是发送数据模块,2是接收数据模块。

图13 顶层模块包含的文件.png

图13 顶层模块包含的文件

发送数据模块

首先通过一个for循环,将存储体instruction先初始化,内部存储instruction_list.vh文件中的数据。图片

图14 初始化包头数据.png

图14 初始化包头数据

然后通过request_address来获取对应的包头数据。

图15 获取包头数据.png

图15 获取包头数据

最终的包头数据如下所示。

图16 最终包头数据.png

图16 最终包头数据

最终发送的数据如下所示,首先发送包头数据,如果有用户自己的数据(go为高电平),则发送用户数据,否则发送递增的8字节数据。

图17 发送数据.png

图17 发送数据

接收数据模块

下图是接收数据模块的端口信号列表,包含接收数据请求和接收数据应答。

图18 接收数据模块端口信号.png

图18 接收数据模块端口信号

首先会从接收到的第一个数据中解析出数据包的一些控制信号,如下图所示,包含数据存储的起始地址、数据长度、ftype等信息。

图19 解析包头数据.png

图19 解析包头数据

去掉包头后,将剩余的数据存储在起始地址为current_addr[10:3]的RAM中,对应代码如下所示。

图20 将数据段存入指定地址空间.png

图20 将数据段存入指定地址空间

同时把解析出的数据包帧头部分存入另一个RAM中,便于后续应答时,通过地址读出对应数据包的控制信息,如下图所示。

图21 存储帧头数据.png

图21 存储帧头数据

上述是接收数据并且存储数据的部分,下面就是从RAM中读出数据,并且响应请求的逻辑代码。首先从存储数据帧头的RAM中读出数据,然后将数据解析出存储数据的RAM地址、数据段大小、ftype等。

图22 读取帧头数据.png

图22 读取帧头数据

然后将解析出的地址作为存储数据RAM的的首地址,连续从RAM中读出数据,如下图所示。图片

图23 从数据RAM中读出数据.png

图23 从数据RAM中读出数据

首先会把从帧头RAM中读出的数据拼接为帧头,即先发送响应的帧头数据,然后发送从数据RAM中读出的数据段,其余时间会发送递增的一些全字节数据。

图24 发送响应数据.png

图24 发送响应数据

当然有些数据包没有数据段,响应的数据包也就没有数据段了。官方代码的初步解读到此结束,细节可以自行查看代码。
本文篇幅比较长了,下文在对示例工程仿真,然后整理示例工程吧。

最新文章

最新文章