0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于共享缓存的架构的系统“假性卡死”问题分析

电子设计 来源:网络交换FPGA 作者:高志凯 2020-11-26 11:08 次阅读

作者:高志凯

一次常规调试中发现上电后交换机多个口同时打流会导致卡死的现象,最后一步步分析问题出现的原因是位宽不够导致的溢出。这让我回想起团队已经量产的某款芯片,也是因为某个寄存器位宽设置过小的原因,导致组播组设置的时候不能超过31,否则就会溢出,只能想办法通过软件来解决这个问题。这次出现问题的交换机是基于共享缓存的架构,希望后面引以为戒,设计每个小的寄存器时都要考虑全面。

背景

在使用verilog进行程序设计时,尤其需要注意数据位宽问题。当我们将程序烧入fpga的时候电路已经固定,不能像C语言那样动态改变数组长度,因此数据位宽设计不恰当会引入意想不到的问题。例如我们使用二进制进行计数时,位宽为5的数据表示范围为0-31,当数据为32时由于位宽不够,实际显示则为0,如果此时你需要对这个数进行大小判断,那么可能会得到错误的结果。笔者在交换机功能调试、解决bug的过程中对此深有体会。

首先我们来看一下交换机对数据的处理流程,网络测试仪发出的数据首先经过接口进入分流模块,我们的交换机支持TT业务(时间触发)和ET业务(普通以太网),本文就ET业务进行分析。以太网帧进入MAC核进行CRC校验,

并将8位输入数据转32位输出,转换模块将数据转换为128位总线数据,并支持反压。接着数据经过轮询进入分组处理模块,分组处理模块一方面将数据帧传入接收总线,另一方面根据帧信息提取结果和流分类信息将接受帧信息传入入队模块进行逻辑入队,逻辑入队模块管理着一个虚拟的存储块,每一个虚拟的存储块对应着真实的物理数据,也就是数据帧。缓存管理模块根据入队和出队情况更新存储块信息,同时更新的还有队列的长度等信息。数据帧出队时首先由逻辑预出队模块根据优先级轮询队列,并给出出队号,逻辑出队模块根据端口号查询出队信息,然后控制总线发送数据,数据经过转换模块转32位然后经mac核输出。

粗略了解了交换机的结构,言归正传,数据溢出为什么会导致交换机“假性卡死”?

现象

首先我们需要深入了解一下逻辑出队预出队模块,这个模块会产生出队号,并将出队号传入schedule_dequeue模块,然后schedlue_dequeue模块根据出队号获得出队帧首地址,并查询虚拟块地址,从而获得数据的物理存储地址,进行数据搬移。

现在我们说一下现象,上板时,交换机4个口接到testcenter,每个口打1Gbps数据流,固定帧长为64Bytes,其中1、2口打对流,3、4口打对流。当testcenter准备好后直接给交换机4个口同时打数据流,这时有两个口正常工作,但是另外两个口卡死,没有帧出来。如果在一开始将数据流速率控制在90%,打一阵流之后在将4个口速率提升到100%,则不会出现上述卡死现象。我们经过分析,认为交换机是能够处理每个端口1Gbps速率的数据流,否则另外两个正常工作的队列便无法解释。那么问题出在哪里了?

我们根据经验,首先对入队和出队关于帧长信息的更新,入队与出队产生冲突时队列头部和尾部信息的更新等等进行了检查,经过仿真和对比更新数据,确实发现了一些小bug,本以为这就是最终bug,结果兴冲冲的跑了一版程序去上板测试,发现还是上述现象!这说明我们没有找到关键点。

发现问题

这里要为大家介绍一种调试代码的方法,就是计数法。为了找出问题出在哪里,我们对逻辑入队、物理入队的各队列帧数进行统计,将其与逻辑出队、物理出队的各队列帧数进行对比。这时我们发现,逻辑入队和物理入队帧数目一致,

逻辑出队和物理出队帧数目一致,但是入队和出队数目不一致,两者相差256,但是队列里显示有255个帧,这是由队列门限决定的,那么其实有经验的你就能大概猜到这个差值256有点问题。是的没错,问题就出在这里。

我们查看代码发现,

这里的port_state_data_in_b会根据优先级更新相应队列的帧数目,顾名思义,它的低8位代表的是优先级为0帧的数目。当入队的队列号为00并且入队成功后,其低8位会加1,出队成功则减1,上图展示的便是出队时的代码。但是我们要知道,优先级为0的队列最多有8个,因为队列号是由{端口号,优先级}的形式组成的,也就是说一个优先级对应8个端口号。前面我们说了一个队列的门限是256,也就是0-255。那么当优先级为0的a队列已满,这时优先级为0的b队列再来一个帧,port_state_data_out_b的值就会达到256,由于其只有8位,所以port_state_data_out_b的值其实是0!这就很麻烦了,因为机器不够智能,只能够按照你的代码按部就班的执行。


所以卡死的原因出来了,由于port_state_data_out_b溢出置0,导致pri_val一直为0,所以状态机一直在进行一个循环,不能完成正常跳转!而这个模块提供了出队号,当其没有提供出队号时,schedule_dequeue模块就无法产生出队指令,总线也没办法进行数据搬移,从而对外显示为“卡死状态”。

解决问题

发现了问题,解决起来就很简单了,我们只需要将优先级对应的队列计数器计数上限设置到八个端口的最大值2048即可,也就是12位的数据位宽。如下图:

写在最后,往往最微不足道的问题最不容易让人发现。这个位宽不足所导致的问题笔者找了很久,检查过很多模块,虽然这其中发现了一些其他bug,但是解决这个大bug的过程却是费时费力的,但是设计者在设计代码时只需要认真考虑承载功能所需要的位宽,便能为后续调试减轻许多麻烦!原我们都养成一个良好的习惯。

编辑:hfy


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 以太网
    +关注

    关注

    40

    文章

    5069

    浏览量

    166190
  • 交换机
    +关注

    关注

    19

    文章

    2431

    浏览量

    95620
  • Verilog
    +关注

    关注

    28

    文章

    1325

    浏览量

    109293
  • C语言
    +关注

    关注

    180

    文章

    7527

    浏览量

    128131
收藏 人收藏

    评论

    相关推荐

    当PLC程序卡死时我们该如何解决?

    当PLC程序卡死时,可以尝试以下几种方法来解决问题
    的头像 发表于 01-25 09:16 567次阅读

    如何选择合适的本地缓存

    小编最近在使用系统的时候,发现尽管应用已经使用了 redis 缓存提高查询效率,但是仍然有进一步优化的空间,于是想到了比分布式缓存性能更好的本地缓存,因此对领域内常用的本地
    的头像 发表于 01-18 11:19 503次阅读
    如何选择合适的本地<b class='flag-5'>缓存</b>?

    基于物联网的智能建筑能耗监测系统架构参考模型分析

    电子发烧友网站提供《基于物联网的智能建筑能耗监测系统架构参考模型分析.docx》资料免费下载
    发表于 01-03 10:33 0次下载

    Redis缓存预热+缓存雪崩+缓存击穿+缓存穿透要点简析

    缓存预热就是系统上线后,提前将相关的缓存数据直接加载到缓存系统
    的头像 发表于 12-25 09:41 299次阅读
    Redis<b class='flag-5'>缓存</b>预热+<b class='flag-5'>缓存</b>雪崩+<b class='flag-5'>缓存</b>击穿+<b class='flag-5'>缓存</b>穿透要点简析

    mybatis一级缓存和二级缓存的原理

    MyBatis是一种轻量级的持久化框架,它提供了一级缓存和二级缓存的机制来优化数据库操作性能。一级缓存是默认开启的,而二级缓存需要手动配置启用。 一、一级
    的头像 发表于 12-03 11:55 515次阅读

    如何使用缓存

    中存放一个副本,当该内容下次被访问时,不必连接到驻留网站,而是由Cache中保留的副本提供。 在企业Web应用中,通过缓存技术能够提高请求的响应速度;减少系统IO开销;降低系统数据读写压力...
    的头像 发表于 10-08 14:07 328次阅读

    共享、可扩展的SAS基础架构

    电子发烧友网站提供《可共享、可扩展的SAS基础架构.pdf》资料免费下载
    发表于 08-17 16:23 0次下载
    可<b class='flag-5'>共享</b>、可扩展的SAS基础<b class='flag-5'>架构</b>

    ARM Corstone™参考系统架构规范MA1

    Corstone参考系统架构规范MA1规定了一个子系统架构,该子系统集成了ARM提供的关键组件,这些组件可以集成到更大的
    发表于 08-17 06:53

    ARM Cortex-A510核心技术参考手册

    核心在DSU-110Dynamiq™集群内实施,并始终连接到Dynamiq™共享单元-110(DSU-110)。DSU-110与L3缓存和监听控制完全互连。此连接配置也可用于具有不同类型内核的系统,其中
    发表于 08-09 07:50

    ARM Cortex-X3核心技术参考手册

    计算应用。 Cortex®-X3核心在Dynamiq™-110群集中实施,并始终连接到Dynamiq™共享单元-110(DSU-110),该共享单元与L3缓存和监听控制完全互连。此配置还可用于具有不同类型内核的
    发表于 08-09 07:39

    ARM Dynamiq共享单元-120型技术参考手册

    DynamIQ™ 共享单元-120(DSU-120)提供了一个共享的L3存储系统、窥探控制和过滤以及其他控制逻辑,以支持a级架构核心的集群。该集群被称为DSU-120 DynamIQ™
    发表于 08-08 06:29

    L220高速缓存控制器技术参考手册

    : •用于增强操作系统安全性的TrustZone架构•专为高性能系统设计的主、从和外围AXI/AMBA接口•智能能源管理器(IEM)支持。 高速缓存控制器是一个统一的、物理寻址的、物理
    发表于 08-02 15:09

    通用缓存引擎cachelib介绍

    网络服务几乎在系统架构的每一层都依赖于缓存。大型网络服务依靠缓存系统来实现高性能和高效率。例如,在Facebook,CDN
    的头像 发表于 07-27 09:02 657次阅读
    通用<b class='flag-5'>缓存</b>引擎cachelib介绍

    在linux共享库下,调用共享库函数时,程序卡死在函数中的pid=fork()这里的原因?

    在linux共享库下,调用共享库函数时,程序卡死在函数中的pid=fork()这里,来个大佬指导指导原因...
    发表于 06-20 06:55

    聊聊本地缓存和分布式缓存

    本地缓存 :应用中的缓存组件,缓存组件和应用在同一进程中,缓存的读写非常快,没有网络开销。但各应用或集群的各节点都需要维护自己的单独缓存,无
    发表于 06-11 15:12 579次阅读
    聊聊本地<b class='flag-5'>缓存</b>和分布式<b class='flag-5'>缓存</b>