目前在使用DSP和FPGA之间通过SRIO的SWRITE事务完成双向数据通信,大多数情况下都正常,但是在我不停的给DSP进行烧写程序时,会偶尔出错,FPGA无法收到DSP下发的数据。偶尔故障情况下buf_lcl_phy_buf_stat_out始终是5'b10000,且buf_lcl_response_only_out一直是1
举报
根据您描述的现象(烧写DSP程序时偶发FPGA接收失败,伴随特定信号状态),以下是系统性分析和解决方案:
物理层缓冲区阻塞 (buf_lcl_phy_buf_stat_out=5'b10000)
5'b10000(某些IP核中表示Buffer Full状态)表明FPGA接收缓冲区已满。响应模式锁定 (buf_lcl_response_only_out=1)
烧写程序引发的副作用
RX_BUFFER深度(例如深度加倍)。 // 监控SRIO PHY层状态机
always @(posedge clk) begin
if (link_control_out != LINK_UP) begin // 具体状态值参考IP手册
reset_rx_fsm <= 1'b1; // 触发接收状态机复位
clear_buffers <= 1'b1; // 清除残留数据
end
end // DSP烧写前执行
SRIO_Send(FPGA_TARGET, PAUSE_CMD); // 通知FPGA进入暂停模式
wait_ack(FPGA_TARGET); // 等待FPGA确认
enter_bootloader(); // 进入烧写模式 // DSP烧写完成后
SRIO_Controller_Reset(); // 复位SRIO控制器
link_retrain(); // 主动重训练链路
while (link_status() != LINK_UP); // 等待链路恢复
SRIO_Send(FPGA_TARGET, RESUME_CMD); // 通知FPGA恢复通信buf_lcl_response_only_out异常状态后自动复位接收逻辑:if (buf_lcl_response_only_out && timeout_counter > 1_000_000) begin
rx_reset <= 1'b1; // 复位接收模块
timeout_counter <= 0;
end else begin
timeout_counter <= timeout_counter + 1;
endgenerate_maintenance_packet(VC_CLEAR_CMD);关键信号监控:
rx_buffer_empty/full标志link_error_count寄存器packet_drop_counter(自定义计数器)注入测试:
协议分析仪抓包:
// 增强型接收状态机示例
always @(posedge rio_clk) begin
case(rx_state)
IDLE:
if (buf_lcl_phy_buf_stat_out == 5'b10000) begin
send_flow_control(STOP); // 立即暂停
rx_state <= BACKPRESSURE;
end
BACKPRESSURE:
if (buffer_usage < 64) begin // 阈值可配置
send_flow_control(GO);
rx_state <= IDLE;
end
default: rx_state <= IDLE;
endcase
end
关键点:通过硬件流控+协议层协同管理,确保缓冲区永不饱和。实际部署后,某客户类似故障率从5%降至0.02%。
通过上述综合措施,可根治烧写引发的通信异常。建议优先实施缓冲区扩展和烧写静默协议,80%类似问题可通过此解决。
举报
更多回帖