• 【通用设计方法】之接收异常保护


    目录

    前言

    一、接收异常保护

    二、超短包、背靠背的支持

    后记


    前言

            为了系统的鲁棒性,我们常常会做一系列的异常保护功能,避免系统挂死。

            这里仅仅介绍接收保护的某些设计思路,抛砖引玉。

    一、接收异常保护

            设计思路:通过可配置的门限阈值来对超长包/异常包进行截断处理,并将异常情况上报。

            这里门限可分为两种,一是数据包的长度,二是时间。

            当接收数据超过门限(超长/超时)而还没收到eop信号的时候,就截断报文,并自行产生一个eop信号。

            下面以超时为例,简单写下代码:

    1. input [31:0] i_cut_cycle_threshold;//寄存器配置,可加使能信号
    2. input [31:0] i_cut_len_threshold;
    3. output reg [31:0] o_rpt_cycle_cut_cnt;//异常上报
    4. output reg [31:0] o_rpt_len_cut_cnt;
    5. reg s_frm_running;
    6. reg [31:0] s_cycle_cnt;
    7. assign s_rx_sop = i_rx_sop && i_rx_vld && o_rx_rdy;
    8. assign s_rx_eop = (i_rx_eop && i_rx_vld && o_rx_rdy) || s_cycle_cut_en;
    9. assign s_cycle_cut_en = s_cycle_cnt >= i_cut_cycle_threshold;
    10. always@(posedge clk or negedge rst_n)begin
    11. if(~rst_n)
    12. s_frm_running <= 1'b0;
    13. else if(s_rx_eop)
    14. s_frm_running <= 1'b0;
    15. else if(s_rx_sop)
    16. s_frm_running <= 1'b1;
    17. end
    18. always@(posedge clk or negedge rst_n)begin
    19. if(~rst_n)
    20. s_cycle_cnt <= 32'b0;
    21. else if(s_rx_eop || s_rx_sop)
    22. s_cycle_cnt <= 32'b0;
    23. else if(s_frm_running)
    24. s_cycle_cnt <= s_cycle_cnt + 32'd1;
    25. end
    26. always@(posedge clk or negedge rst_n)begin
    27. if(~rst_n)
    28. o_rpt_cycle_cut_cnt <= 32'b0;
    29. else if(s_cycle_cut_en)
    30. o_rpt_cycle_cut_cnt <= o_rpt_cycle_cut_cnt + 32'd1;
    31. end

            超长包截断代码大致相同,就不啰嗦了,重点是设计时要有这种异常保护的意识。

            另外一种做法可以是在超过门限时,将running信号拉低,再由running&&rx_vld作为最终的vld信号,同时产生一个eop信号。

    二、超短包、背靠背的支持

    超短包就是包长为1,sop,eop重叠,如下图:

            背靠背就是两个包之间没有间隔,如下图:

             因为内部接收到数据后进行处理都是需要时间的,而这两种情况恰恰都没有提供足够的时间给到我们。

    情况1,超短包的情况,可以考虑根据数据处理所需时钟周期进行打拍处理。

    情况2,可以考虑在接收到每一包的eop信号后,强制拉低一个时钟周期的rdy信号来反压前级。

    具体代码就懒得写了,也没什么东西;但是有没有其他更好的处理方式?

    后记

            这是一个爬坡的过程,需要我们不断积累经验。

            欢迎分享交流。

  • 相关阅读:
    应用软件安全编程--21避免使用不安全的哈希算法
    面试笔试题之Linux部分58题(第二部分)
    C++从零开始的打怪升级之路(day38)
    Java1.8+ JUC包的ConcurrentHashMap源码分析
    数据中心容灾考题
    【C语言】变量占用内存的大小&&内存对齐
    关键词分析-对同行网站进行全面的分析-免费关键词分析工具
    Redis 面霸篇:从高频问题透视核心原理
    面向对象【Package与Import】
    C# 自定义控件库之Lable组合控件
  • 原文地址:https://blog.csdn.net/m0_52840978/article/details/128029092