沧小海基于xilinx srio核的学习笔记之第四章 Xilinx SRIO的示例分析(一)
我们可以很便捷的获取Xilinx官方提供的案例供我们分析学习,真是贴心,我就按照第五章配置的IP核所生成的代码进行分析,里面不包括维护事物,减少分析工作量,借机也好好学习一下人家是的设计思路。
目录
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,如下图所示。
在核内部的时钟可分为两个部分,如下图所示。一部分是“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,参考时钟125M,4通道。
其实逻辑层和缓冲层的时钟差别不大,主要是物理层的时钟,因为物理层要与“GTPE2_CHANNEL”这个高速串行硬核连接进行数据交换,这个硬核支持的最大位宽是32bit,所以对于不链路宽度其时钟速率也会进行调整。phy_clk是物理层时钟, gt_pcs_clk是到高速串行收发器的并行数据时钟。一般来说,phy_clk与gt_clk的关系如下:
phy_clk = (gt_clk * LW) / 4
LW指的是链路宽度(Link Width),所以对于操作在2x模式(二通道模式)的核来说,LW的值为2,phy_clk的频率是gt_clk频率的一半。如下图是不同线速率和不同通道模式下的各个时钟关系。
其实对于这些我们并不需要多过多担心依然可以使用,因为人家给我们做了极好的封装,这对于公司来说事件好事,可以降低开发成本,对于个人而言是否事件好事,还真不好说。
4.3 复位与初始化
一般来讲,对于核在上电之初会有复位和初始化这样的流程,以使其工作在正常状态,对于srio这个略显复杂的核来讲更是如此。
如下图是复位相关的接口信号,实际就是输入“sys_rst”,然后核进行一些列复位操作,并产生给予共享模块的复位逻辑。
如下图是关于核的控制、状态等信号
1、sim_train_en
这个信号是为了减少仿真初始化所需时间的,如果不是仿真需将其置0或忽略。
2、phy_mce
Mec是Multi-cast Event的缩写,这是一个单周期输入信号,指示PHY发送MCE控制信号,应该是要求物理层做些什么操作吧,目前没有用到。
3、phy_rcvd_mce
该信号则表示物理层收到了“phy_mce”信号,
4、phy_link_reset
只要该信号有效,PHY就会发送链路复位控制符号,猜测应该可以给到高速串行收发器
5、phy_rcvd_link_reset
表示PHY至少已收到四个连续的无错链路复位控制符号。
6、force_reinit
该信号迫使PHY重新初始化链路。
7、phy_debug
各种状态信号的集合,参考《PG007》的Table C-3。
8、gtrx_disperr_or
串行收发器的每字节极性错误指示器。如果置一,则说明高速串行接收模块有极性错误。
9、gtrx_notintable_or
串行收发器的每字节8B/10B编码错误指示器。置一则说明高速串行接收模块有错误。
10、port_error
来自物理层的,表示端口已收到不可恢复的错误,并且处于错误状态。
11、port_timeout
在“端口链接超时控制” CSR中反映“超时值”字段的值。
12、srio_host
在物理层配置中反映来自端口通用控制CSR的主机位的值
13、port_decode_error
表示已接收到不支持的事务,由于未启用用户定义的端口,该事务已被丢弃。 当下一个受支持的数据包类型到达任何一个用户界面时,此信号将取消声明。 该
14、deviceid
当前值存储在基本设备ID CSR中(偏移量0x60)。
15、idle2_selected
指示内核正在IDLE2模式下运行。
由上可见,关于物理层的内容还是比较多的,而且不知所云,因此有比较将这部分内容翻译一下做个大概的了解。详见XXX
16、port_initialized和link_initialized
这部分是初始化状态信号,port_initialized应该是表示核本身初始化完成了,而link_initialized表示已接收到七个连续的无错误控制符号,并已发送了15个连续的符号,核心已经过全面训练,现在可以传输数据,如下图所示。高速串行收发器有一段数据后才拉高的。
17、idle_selected
表示已选择IDLE1或IDLE2。
18、mode_1x
表示链接已训练到1x