Xilinx平台SRIO介绍(五)示例工程ExampleDesign介绍

更新时间:2023-06-28 09:59:38 阅读: 评论:0

Xilinx平台SRIO介绍(五)⽰例⼯程ExampleDesign介绍理解IP的使⽤,少不了Example Design的学习。
汇总篇:
⽬录:
课余生活有哪些⼀、⽰例⼯程架构组成
到了这⼀步,默认你已经⽣成IP并打开⽰例⼯程了。
奇妙近义词
⾸先,我们展开⽰例⼯程⽬录结构如下:
包含两个头⽂件和⼀堆⼦模块。我们列个表对这些⼦模块简单介绍⼀下:
1.1 ⼦模块介绍
⽂件名称模块功能描述
maintenance_list.vh Verilog头⽂件,定义了⼀些维护事务,它被包含在srio_quick_start.v模块中。
instruction_list.vh Verilog头⽂件,定义了121个事务,它被包含在srio_request_gen.v模块中。
srio_support.v srio核⼼模块,包含IP例化以及时钟和复位;
手游戏我们使⽤IP核就是在该模块的基础上进⾏逻辑设计。
srio_request_gen.v⽣成请求事务的模块,把instruction_list.vh中包含的事务发出去。
srio_respon_gen.v这个模块⽤来产⽣有响应事务的响应包
srio_quick_start.v这个模块与IP核的维护端⼝相连,⽤来发起维护事务。
srio_report.v在仿真时,这个模块⽤来产⽣包接收和发送的时间戳,在硬件上运⾏的时候这个模块可以删除
srio_statistics.v 这个模块⽤来收集核的统计信息并通过寄存器接⼝提交⼀些信息,提交的信息可以通过Vivado的调试特征以及⽤户设计来访问
srio_sim.v srio_sim.v是仿真顶层⽂件,它例化了两个核,分别是primary和mirror,并把它们连接到⼀起⽤于仿真。它也包含了上报测试是否成功的机制与超时功能。
1.2 ⼯程结构
整个结构包括时钟模块,复位模块,配置结构以及产⽣RapidIO事务的激励模块。
srio_quick_start模块在顶层srio_example_top.v中例化,它与IP核的维护端⼝相连⽤来产成维护事务,维护事务在maintenance_list.vh 中进⾏定义,⽤户可以根据需要编辑maintenance_list.vh⽂件来添加,修改和移除维护事务。
srio_request_gen.v模块也在顶层srio_example_top.v中例化,它⽤来产⽣I/O事务与消息事务。这个模块也存储了期望的响应并把接收的响应与期望值进⾏⽐较。
srio_respon_gen.v模块也在顶层srio_example_top.v中例化,它⽤来为接收到的请求事务⽣成对应的响应事务。
  通过上图可以看出,产⽣I/O事务⼀共有两种⽅式:第⼀种是通过例⼦⼯程中⾃带的srio_request_gen.v产⽣I/O事务;第⼆种是通过顶层模块中Initiator和Target的resquest/respon接⼝⾃⼰编写代码产⽣I/O事务。同理,产⽣维护事务也有两种⽅式:第⼀种是通过例⼦⼯程中⾃带的srio_quick_start.v模块产⽣维护事务;第⼆种是通过顶层模块中的维护接⼝⾃⼰编写代码产⽣维护事务。I/O事务的端⼝类型是AXI4-Stream类型,维护事务的端⼝类型是AXI4-Lite类型。
⼆、⽰例⼯程仿真分析
英格兰牧羊犬过敏能喝酒不
2.1仿真分析
继续打开仿真⽬录如下所⽰:
仿真顶层例化了两个srio_top实体:⼀个primary,⼀个mirror;
具体是什么意思呢,我们打开仿真tb顶层研究:
可以看到,primary的发送管脚tx与mirror的接收管脚rx相连接,也就是说由primary发给mirror;另⼀个⽅向同样,primary的接收管脚rx与mirror的发送管脚tx相连接。其实从primary和mirror这两个单词基本就知道他们是⼲嘛的了,镜像嘛对吧~
另外,如果你看了⼀些xilinx的example design之后,你就会发现,其实套路都是固定的,什么xxx_support模块为核⼼啊,xxx_gen产⽣数据啊,xxx_check表⽰接收数据然后检测啊;我们做接⼝,⽆⾮就是发送与接收。
扯远了,我们回到srio仿真继续介绍,为了更加直⽩形象的说明仿真,我们放张图, 说再多,都没有⼀张图来的明⽩:
(虚线仅为理解使⽤,实际是通过SRIO进⾏收发的)
按照我们的理解,primary的srio_request_gen.v产⽣的I/O事务,将由ireq接⼝发送出去,由mirror的treq接⼝接收。mirror实体的srio_request_gen.v产⽣的I/O事务,也由ireq接⼝发送出去,由primary的treq接⼝接收。
那么,接下来,我们就打开仿真,对我们的理解进⾏验证。
2.2仿真验证
Run Simulation:
记得添加信号哦,添加了再对其分个组⽅便查看:
王小岚
然后就等初始化完成,port_initialized拉⾼,表⽰初始化完成。link_initialized拉⾼,表⽰物理层接收了7个控制符号并发送了15个控制符号。啊,这个有点底层,不想讲太多,感兴趣的去看⼿册,同时把信号抓出来⾃⼰研究。
我们直接使⽤结果,链路ok,然后开始收发数据。
PS:笔者家⾥的⼩笔记本,真让我⼀阵好等= =||
所以建议使⽤Modelsim,更专业,更快速!
【------------------等待时间-------------------】
OK,仿真结果出来了。为了好看,我们直接使⽤第⼀个数据包进⾏分析:
由图可知,包头信号为64’h006020fcd0000600
换算为⼆进制数为:64'b0000_0000_0110_0000_0010_0000_1111_1100_1101_16'b0_0110_8'b0宪法日是
⾸先判断事务类型:
FTYPE = [55:52] = 6,
脱贫故事
TTYPE = [51:48] = 0,
可以判断,事务类型为SWRITE。(SWRITE没有TTYPE)
我们再把SWRITE事务类型格式拉过来进⾏对⽐⼀波:PG007-[P.68]
得知,size = 15,意思就是这包请求包含16个字节的数据。⽽tdata为64bit,8byte;
可以推论在发送数据的第⼆个有效时钟周期时,将会拉⾼tlast。如上图标红所⽰②。同时,我们将发送的数据记录下来,待会⼉与接收对⽐。
发送数据为: 64’b0,64’h0101010101010101;
注意:AXI4接⼝全部以valid/ready握⼿信号来进⾏数据发送,这⾥默认读者已经了解不再啰嗦,不懂的⾃⾏百度。
疑问:
SWRITE事务格式⾥⾯没有size,⽽是R(保留),为什么实际操作还是按照size来做的?⼿册⾥说的SWRITE拥有更少的头部开销,但是包头不都是占⼀拍吗?求⼤佬告知,在线等,挺急的。 = =||
但是,者不影响我们使⽤,我们继续往下看mirror的接收treq:

本文发布于:2023-06-28 09:59:38,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1058562.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:事务   模块   维护   发送   接收   包含
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图