1、使用官方的SRIO核,base模式,默认参数不做任何修改,生成IP后点击生成example工程,不改动任何源码,直接run simulation。第一次使用ARTIX7的FPGA,不能初始化成功,现在改成K7的FPGA.型号是
2、log_wave -r /* 记录所有波形
只用了160us就把全部事务仿真测试完了:
3、调试SRIO的第一步是去检测SRIO顶层模块(srio_example_top_primary)中的各个关键的控制信号是否正确切换。这些信号包括:复位信号、时钟锁定信号(clk_lock)、端口初始化信号(port_initialized)、链路初始化信号(link_initialized),端口错误信号(port_error),mode_1x信号(在2x和4x模式下,这个信号为高表示SRIO核已经被训练为1x模式,在1x模式下,这个信号一直为高,当port_initialized为高时,这个信号才有效)与端口解码错误信号(port_decode_error)等(除了这几个信号以外,其他信号也可以观察一下)。
4、如下图所示,在第60us左右的时候,两个关键信号,最关键的两个信号是port_initialized信号与link_initialized信号,当它们为高时,分别表示端口和链路被成功初始化。
下图显示port_initalized 和link_initalized 信号的捕获。当port_initalized 和link_initalized都有效时,用户应用程序可以发送/接收数据包。link_initalized 表示已接收到七个连续的无差错控制符号,并且已发送了15 个连续符号。图中的圆圈区域是控制符号port_initalized 和link_initalized.
5、下面把控制符号波形放大观察控制符号各个字段的细节,发送与接收总线上的控制符号分别如下图所示(gttx_charisk与gtrx_charisk对应的位为0时, gttx_data与gtrx_data上的数据为控制符号)。
当gttx_charisk与gtrx_charisk对应的位为1时,gttx_data与gtrx_data上的数据为/K/,/R/,/A/组成的空闲随机序列(前面几篇文章解释过这个知识点),它们分别为特殊字符/K28.5/,/K29.7/,/K27.7/,转化为16进制为bc,fd,fb
6、在link_initialized拉高之前,发送与接收的控制符号为80f713,控制符号80f713前面的1c是/K28.0/,表示控制符号的起始位置。由于SRIO核默认使用的是短控制符号,所以这里控制符号为24-bit。把80f713转化为二进制:80f713 = 1000_0000_1111_0111_0001_0011,各个字段的对应关系如下图所示:
4.2 SWRITE事务
4.2.1、上篇文章已经分析过,例子工程会把instruction_list.vh中定义的事务按顺序依次发出去。其中最先发送的是37个SWRITE事务,然后是19个NWRITE_R事务、 19个NWRITE事务、26个NREAD事务,2个DOORBELL事务,最后是17个MESSAGE事务。其中第一个发送的事务是instruction_list.vh中第50行定义的SWRITE事务。如下图所示
4.2.2、下面以上图第50行的SWRITE事务为例来说明整个SWRITE事务的传输过程。这个事务表示的是利用SWRITE事务往地址36’hCD0000600发送16个字节的数据。
第11行到50行是37个SWRITE事务(流写事务),其中第1列的12位数据是由8-bit的保留位(SWRITE事务没有srcTID字段),1-bit的保留位,2-bit的prio和1-bit的CRF组成,下图黄色标记部分字段,第2列是FTYPE字段【蓝色字段】,第3列是保留字段(SWRITE事务没有TTYPE字段)【紫色字段】,第4列的36-bit数据是由最高2-bit的保留位和34-bit的address字段组成,第5列是8-bit保留字段(SWRITE事务没有size字段)【下图青色部分】,不管这个字段的值为多少,目标设备都会把这个值当做0来处理。源代码如下图所示
本地设备(Local Device)生成的请求(Requests)通过ireq通道发送,远程设备(Remote Device)产生的响应包通过iresp通道接收来完成整个事务的交互过程。
远程设备(Remote Device)生成的请求(Requests)通过treq通道接收,本地设备(Local Device)产生的响应包通过tresp通道发送来完成整个事务的交互过程。
在顶层模块中,变量名与通道的对应关系如下:
s_axis_ireq* 对应于ireq通道
m_axis_iresp* 对应于iresp通道
m_axis_treq* 对应于treq通道
s_axis_tresp* 对应于tresp通道
我们这里找到请求事务的传输通道ireq,并抓出事务的波形如下图所示
由于仅当tvalid和tready同时为高时,tdata上的数据才为有效数据,所以这个SWRITE一共消耗了三个有效时钟周期,其中第一个时钟周期发送的是HELLO包头,后面两个时钟周期分别发送8个字节的数据(第一个时钟发送的数据是0000000000000000,第二个时钟发送的数据是0101010101010101),一共16个字节的数据,和instruction_list.vh中第50行定义完全一致,整个时序也与HELLO格式的时序完全吻合。【在后面分析数据是如何产生的】
Step3、对照HELLO格式解析包头。包头为006020fcd0000600,转化为二进制后与HELLO格式各个字段对应关系如下所示:
Step4、分析数据的来源
9A0000600这个地址发送的数据是0404040404040404-,,,分析这些数据的由来。在文件srio_request_gen_srio_gen2_0.v里面,现在发送的是,val_ireq_tdata <= {8{data_beat}}
Step5、分析为什么第一个地址传了2个数据,第2的地址传了2个数据,第三个地址的数据个数明显增多,这个参数是怎么传进来的。
------------------------------------------------------------------
Step6、SWRITE事务通道ireq通道(接口1)传输给SRIO核以后进入SRIO的逻辑层,逻辑层会给包添加传输层的信息发送给Buffer(接口3),然后Buffer会把数据发送给物理层(接口5)。
选中srio_gen2_0_block_inst,把中间的buft_*通道、phyt_*通道与gttx_*通道的信号拖到右边的波形窗口中,如下图所示