前言
上次说到采用“将Aurora核输出的时钟,人为进行1ns的延迟,然后用延迟之后的时钟再去进行数据的读取”这个方法解决了Aurora核仿真出现的问题,但在上板中遇到了其他的问题,现在这篇文章中进行讨论。
问题提出
在上次仿真正确无误之后,我将工程放入到实际环境中去测试,果然没有那么顺利。通过mark_debug发现在上板过程中自己写的FIFO满,然后导致Aurora核存在丢帧现象,那么是什么原因导致FIFO满信号拉高了呢?
问题分析
由于丢帧现象是在几百万帧的时候才会出现,因此仿真无法重现问题,只好通过上板抓信号的方式进行分析解决。(由于当时调试的时候,笔者在外出差,因此暂时没有实例的截图,后期再补)
最终发现,不光是有丢帧问题,更有错帧问题。每一帧的帧数据会出现某64bit(采用的是64/66B编码的Aurora核)重复发两次的现象,经过多次仿真与上板,最终确定是由于之前加入了100ps的时延导致出错(这时已接近崩溃)。此时,通过仿真去观察tx_dst_rdy信号与其产生的时钟clk_rd,发现两者之间的100ps的延时竟然不复存在!!!!所以,一切的罪魁祸首都在这个tx_dst_rdy信号中!!!
问题解决
为了解决这个问题,删除掉原来所有的做的工作(心疼啊),重新生成一个Aurora核的example design,花了一整天的时间去研究官方例程中对rdy信号的处理流程,最后发现其处理流程相当于是一个异步FIFO的时序!!!!
因此,将原来所有需要Aurora核发送的数据,全部存储到异步FIFO中,该异步FIFO的读使能采用tx_dst_rdy信号,经过上板测试完美解决之前所遇到的问题。
后记
这次调试虽说走了很多的弯路,但是也学习到了很多东西。足以见得吃透官方的example design是有多么重要,以后还是要多去理解官方的例程。