沧小海基于xilinx srio核的学习笔记之第四章 Xilinx SRIO的示例分析(一)

我们可以很便捷的获取Xilinx官方提供的案例供我们分析学习,真是贴心,我就按照第五章配置的IP核所生成的代码进行分析,里面不包括维护事物,减少分析工作量,借机也好好学习一下人家是的设计思路。

目录

4.1 示例梗概

4.2 时钟逻辑

4.3 复位与初始化

 


4.1 示例梗概

如下图所示是生成工程所包含内容,本章主要分析的就是核的接口以及下图框住的三个个模块,其它模块并没有多少内容可言。

       首先大致介绍下各个模块是干嘛的。

1、instruction_list.vh模块

       主要包括各种事务类型的帧头信息等参数,用于其它模块。

2、srio_gen2_0

       即经配置后生成的srio核,在后文会对涉及的接口进行介绍,就其内部逻辑会在第七章进行分析,本章主要阐述xilinx提供的示例,在第五章曾说过,nitiator/Target端口类型把请求事务与响应事务分别处理,如下图所示。

 

       srio通讯是实现两个设备间的点对点数据交换,我们分别将其称为发起和目标。

发起端发送数据用ireq端口,数据会在目标设备的treq出现。

目标设备发送数据用tresp,数据会在发起端的iresp体现。

       当我们选择“Initiator/Target”模式,则定了如上的通讯规范,但并不意味着两个设备当中一个作为“Initiator”,另一个必须作为“Target”选择另一个通道,两个可以均为“Initiator”或者“Target”,但着这样做虽失去了“Initiator/Target”模式的意义,但也是未尝不可的。

3、“srio_request_gen_srio_gen2_0”模块

       这是一个请求发送模块,该模块主要有两个功能,1是作为“Initiator”生成发送到核的数据,并对数据源进行选择,可选择用户数据或者测试数据,但数据并会直接到核,会在“dstream_seg_srio_gen2_0”模块进行一下转换,2是对响应数据进行判断。

4、“dstream_seg_srio_gen2_0”模块

       这是一个拆包模块,接收来自“srio_request_gen_srio_gen2_0”模块的数据内容,如果数据长度大于256,则拆分为多个数据包进行发送,如下图所示。

 

5、“srio_response_gen_srio_gen2_0”模块

       是对从“treq”接收的数据进行响应。


4.2 时钟逻辑

如下两图所示是核接口的时钟部分,输入的时钟是“sys_clkp/n”,输出的有一堆,但我们用到的只有“log_clk_out”这个时钟,其它的都是给与之共享时钟、复位逻辑的srio核。

 

       “sys_clkp/n”是高速串行硬核专用时钟输入,如果接触过GTP或者GTX等高速串行接口对此应该很是了解。对于srio核该时钟速率是在一定程度上可配置的,根据线速率和带宽的不同可配置未125Mhz或者156.25Mhz,如下图所示。

https://img2018.cnblogs.com/blog/1426240/201812/1426240-20181205170951088-87800038.png

       在核内部的时钟可分为两个部分,如下图所示。一部分是“srio_gen2_0_srio_clk.v”模块产生的,一部分是“srio_gen2_0_a7_gtpe2_common.v”模块产生的。那么这两个模块的时钟关系是怎样的呢?

下图是各个时钟间的关系。“srio_clk_inst”模块产生的时钟主要是用于srio核的逻辑层、缓存层以及物理层,而且“a7_gtpe2_common_inst”模块产生的时钟是用于高速串行接口这个硬核,而它本身也是这个硬核的一部分,称之为“GTPE2_COMMON”,用来产生串行速率。

       如下图是我配置核各时钟关系,我配置未线速率2.5Gbps,参考时钟125M4通道。

       其实逻辑层和缓冲层的时钟差别不大,主要是物理层的时钟,因为物理层要与“GTPE2_CHANNEL”这个高速串行硬核连接进行数据交换,这个硬核支持的最大位宽是32bit,所以对于不链路宽度其时钟速率也会进行调整。phy_clk是物理层时钟, gt_pcs_clk是到高速串行收发器的并行数据时钟。一般来说,phy_clkgt_clk的关系如下:

phy_clk = gt_clk * LW / 4

LW指的是链路宽度(Link Width),所以对于操作在2x模式(二通道模式)的核来说,LW的值为2phy_clk的频率是gt_clk频率的一半。如下图是不同线速率和不同通道模式下的各个时钟关系。

       其实对于这些我们并不需要多过多担心依然可以使用,因为人家给我们做了极好的封装,这对于公司来说事件好事,可以降低开发成本,对于个人而言是否事件好事,还真不好说。


4.3 复位与初始化

       一般来讲,对于核在上电之初会有复位和初始化这样的流程,以使其工作在正常状态,对于srio这个略显复杂的核来讲更是如此。

       如下图是复位相关的接口信号,实际就是输入“sys_rst”,然后核进行一些列复位操作,并产生给予共享模块的复位逻辑。

       如下图是关于核的控制、状态等信号

 

1sim_train_en

这个信号是为了减少仿真初始化所需时间的,如果不是仿真需将其置0或忽略。

2phy_mce                                               

MecMulti-cast Event的缩写,这是一个单周期输入信号,指示PHY发送MCE控制信号,应该是要求物理层做些什么操作吧,目前没有用到。

3phy_rcvd_mce

该信号则表示物理层收到了“phy_mce”信号,

4phy_link_reset

只要该信号有效,PHY就会发送链路复位控制符号,猜测应该可以给到高速串行收发器

5phy_rcvd_link_reset

表示PHY至少已收到四个连续的无错链路复位控制符号。

6force_reinit                                         

该信号迫使PHY重新初始化链路。

7phy_debug

       各种状态信号的集合,参考《PG007》的Table C-3

8gtrx_disperr_or

       串行收发器的每字节极性错误指示器。如果置一,则说明高速串行接收模块有极性错误。

9gtrx_notintable_or

串行收发器的每字节8B/10B编码错误指示器。置一则说明高速串行接收模块有错误。

10port_error

       来自物理层的,表示端口已收到不可恢复的错误,并且处于错误状态。

11port_timeout

       端口链接超时控制” CSR中反映超时值字段的值。

12srio_host

       在物理层配置中反映来自端口通用控制CSR的主机位的值

13port_decode_error

       表示已接收到不支持的事务,由于未启用用户定义的端口,该事务已被丢弃。 当下一个受支持的数据包类型到达任何一个用户界面时,此信号将取消声明。

14deviceid

       当前值存储在基本设备ID CSR中(偏移量0x60)。

15idle2_selected

指示内核正在IDLE2模式下运行。

由上可见,关于物理层的内容还是比较多的,而且不知所云,因此有比较将这部分内容翻译一下做个大概的了解。详见XXX

16port_initializedlink_initialized

       这部分是初始化状态信号,port_initialized应该是表示核本身初始化完成了,而link_initialized表示已接收到七个连续的无错误控制符号,并已发送了15个连续的符号,核心已经过全面训练,现在可以传输数据,如下图所示。高速串行收发器有一段数据后才拉高的。

17idle_selected

表示已选择IDLE1IDLE2

18mode_1x

表示链接已训练到1x

 

©️2020 CSDN 皮肤主题: 技术工厂 设计师:CSDN官方博客 返回首页