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


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

    关注

    41

    文章

    6177

    浏览量

    181532
  • 交换机
    +关注

    关注

    23

    文章

    2930

    浏览量

    104851
  • Verilog
    +关注

    关注

    31

    文章

    1374

    浏览量

    114713
  • C语言
    +关注

    关注

    183

    文章

    7646

    浏览量

    146126
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    技术探讨|直线电机模组卡死原因与处理方案

    直线电机模组因其高速度、高精度和高响应特性,在自动化设备中应用广泛。然而,运行中可能出现的“卡死”故障会严重影响生产效率和设备寿命。卡死通常表现为模组无法启动、运动阻力剧增或运行中突然停止。系统
    的头像 发表于 04-07 15:55 88次阅读
    技术探讨|直线电机模组<b class='flag-5'>卡死</b>原因与处理方案

    京东缓存中间件架构缓存内核优化

    一、京东缓存中间件架构 1、背景 在当今高并发、分布式的系统架构中,缓存已成为提升应用性能、降低数据库负载的核心组件。随着业务规模的扩大与
    的头像 发表于 04-03 16:18 1811次阅读
    京东<b class='flag-5'>缓存</b>中间件<b class='flag-5'>架构</b>与<b class='flag-5'>缓存</b>内核优化

    800V直流架构下AI数据中心多端口共享架构固态断路器(MP-SSCB)与SiC模块技术及经济性分析报告

    800V直流架构下AI数据中心多端口共享架构固态断路器(MP-SSCB)与SiC模块技术及经济性分析报告 大模型时代AI数据中心配电架构的演
    的头像 发表于 03-15 15:23 234次阅读
    800V直流<b class='flag-5'>架构</b>下AI数据中心多端口<b class='flag-5'>共享</b><b class='flag-5'>架构</b>固态断路器(MP-SSCB)与SiC模块技术及经济性<b class='flag-5'>分析</b>报告

    XC7Z020-2CLG484I 双核异构架构 全能型 SoC

    / 数据缓存 + 512KB L2 共享缓存” 的配置,配合 256KB 片上存储器,大幅提升数据访问效率。​ 可编程逻辑(PL):基于 28nm Artix-7 FPGA 架构
    发表于 02-28 23:37

    C语言的缓冲区(缓存)详解

    ,这并没有告诉我们如果标准输入和输出涉及交互作用设备时,它们是不带缓存的还是行缓存的,以及标准输出是不带缓存的,还是行缓存的。   大部分系统
    发表于 01-14 07:30

    国产RISC-V架构MCU在工控系统中的节能性分析

    摘要 :随着工业4.0与"双碳"目标的深入推进,工业控制系统的能效优化已成为制约制造业可持续发展的关键技术指标。本文以国科安芯研制的AS32I601系列RISC-V架构MCU芯片为研究对象,系统分析
    的头像 发表于 12-11 16:46 1590次阅读

    零信任架构赋能芯片制造:安全共享数据,破解协作风险!

    架构已成为新设备部署与数据分析平台搭建的硬性要求:客户亟需通过这一架构达成双重目标,既保障敏感数据安全,又能选择性地与合作伙伴共享数据;几乎所有企业都视其为实现生产
    的头像 发表于 12-11 16:37 1239次阅读
    零信任<b class='flag-5'>架构</b>赋能芯片制造:安全<b class='flag-5'>共享</b>数据,破解协作风险!

    缓存之美:万文详解 Caffeine 实现原理(上)

    用于统计元素访问频率的 Count-Min Sketch 数据结构、理解内存屏障和如何避免缓存共享问题、MPSC 多线程设计模式、高性能缓存的设计思想和多线程间的协调方案等等,文章最后会对全文内容进行总结,希望大家能有所收获的
    的头像 发表于 08-05 14:49 801次阅读
    <b class='flag-5'>缓存</b>之美:万文详解 Caffeine 实现原理(上)

    恒讯科技分析:Ubuntu云服务器数据共享高效方案

    ,帮助您根据实际需求选择最适合的解决方案。 一、NFS(Network File System)共享方案 NFS是Linux系统中最常用的文件共享协议之一,适用于Linux服务器之间的数据共享
    的头像 发表于 07-09 21:40 1648次阅读

    RFID标签在共享经济的应用

    :通过RFID系统,可以实时获取共享资源的位置和状态信息,便于及时调整管理计划。4.自动化:RFID可以与自动管理系统结合,实现共享资源管理的自动化,减少人力成本
    的头像 发表于 07-07 15:22 631次阅读
    RFID标签在<b class='flag-5'>共享</b>经济的应用

    高性能缓存设计:如何解决缓存共享问题

    在多核高并发场景下, 缓存共享(False Sharing) 是导致性能骤降的“隐形杀手”。当不同线程频繁修改同一缓存行(Cache Line)中的独立变量时,CPU缓存一致性协议会
    的头像 发表于 07-01 15:01 883次阅读
    高性能<b class='flag-5'>缓存</b>设计:如何解决<b class='flag-5'>缓存</b>伪<b class='flag-5'>共享</b>问题

    STM32G473 flash擦除时程序卡死,为什么?

    我在进行双bank升级的时候,会先进行FLASH的批量擦除。在连续的升级过程中发现成功几次后出现了执行擦除flash操作时程序卡死的情况,直观上看灯没有闪烁。成功次数不规律,可能更新2次后才卡死一次
    发表于 06-12 08:05

    STM32G473 flash擦除时程序卡死的原因?

    我在进行双bank升级的时候,会先进行FLASH的批量擦除。在连续的升级过程中发现成功几次后出现了执行擦除flash操作时程序卡死的情况,直观上看灯没有闪烁。成功次数不规律,可能更新2次后才卡死一次
    发表于 06-09 07:23

    MCU缓存设计

    MCU 设计通过优化指令与数据的访问效率,显著提升系统性能并降低功耗,其核心架构与实现策略如下: 一、缓存类型与结构 指令缓存(I-Cache)与数据
    的头像 发表于 05-07 15:29 1281次阅读

    Nginx缓存配置详解

    Nginx 是一个功能强大的 Web 服务器和反向代理服务器,它可以用于实现静态内容的缓存缓存可以分为客户端缓存和服务端缓存
    的头像 发表于 05-07 14:03 1378次阅读
    Nginx<b class='flag-5'>缓存</b>配置详解