背景介绍
硬件采用K7+6678构架,K7通过srio接口向6678传输图像。
问题描述
在srio启动初始情况或dsp大批量写DDR3的过程中,尤其是写批量复杂数据时基本都会导致srio卡死,观测发现fpga死在发送数据状态,一直等待ready信号拉高,但一直无响应。
问题分析排查
由于发送数据采用Swirte协议,不带响应,虽然数据传输效率高,但是如果dsp端异常无法接收时,fpga还会一刻不停的写数据,直到异常,初步推断写内存过程占用ddr带宽,导致srio读写DDR3速度降低,直到发生异常。
通过添加ILA信号抓取srio相关状态发现,在dsp批量写入复杂数据的时候,AXIS请求接口的ready信号一直被拉低不能恢复,同时buf_lcl_response_only_out信号(该信号表示srio_ip内部fifo仅响应,不能输入数据)会被拉高,详见下图,同时phy_lcl_phy_rewind_out信号反复触发,srio端口状态信号均正常,初步推断为dsp在写ddr3时占用数据带宽,导致swirte请求阻塞。
解决方法
在AXIS请求端口侧逻辑中增加“& (~buf_response_only)”信号,确保该信号有效时不再发送任何请求,经测试ddr带宽恢复后能够恢复srio传输,问题解决。