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

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

3天内不再提示

一个req-ack接口引发的问题分析

CHANBAEK 来源:FPGA的现今未 作者:FPGA的现今未 2023-09-06 17:36 次阅读

最近定位了一个bug,代码是以前的同事留下的,没有经过太多充分的测试,且没有仿真平台,定位的过程是相当的痛苦,前后花了差不多一个星期。但是解决这个bug后,回头看,其实也是一个很简单的问题,就是请求应答(req_ack)接口处理不正确造成的……

问题现象

项目在上板测试过程中必现报文被丢弃的现象,方案不是很复杂。FPGACPU获取报文索引,然后根据索引读取CPU内存的报文(为了描述简单,这里省去项目相关信息)。

定位过程

1、该模块以前没有问题,后继模块工作频率降低后,给该模块反压了,才会出现该问题,首先是各种统计,上板测试没有发现问题,说明逻辑内部处理报文的时候没有丢包;

2、这里省略1万字各种怀疑各种测试,多方位证实了逻辑内部处理报文的时候确实是没有丢包的;

3、怀疑是不是CPU丢了索引,或者FPGA丢了索引?但是都不太好证实,因为丢弃报文的时候FPGA本身不感知,也不知道软件下发了多少索引。

4、在和同事一起讨论怀疑点,检视代码的时候,看到CPU告知FPGA描述符的时候,通过写寄存器的方式来告知,FPGA处理采用的是req_ack接口。如下图所示:其实这也不是一个标准的req_ack接口,因为请求方只给一拍的wen信号,req和ack的处理都是应答方内部的一种处理方式。

图片

所以有一个大胆猜想,会不会是上一次req还没有处理完,CPU又来了下一个req导致有索引丢弃,从而导致了报文丢弃了?这个现象很好监测,当wen和req同时为1时,即为错误,监测代码如下所示:

always@(posedge clk_sys or posedge rst)
begin
    if(rst == 1'b1) begin
        error <= 1'b0;
    end
    else if((wen == 1'b1) && (req == 1'b1)) begin
        error <= 1'b1;
    end
end

增加error信号后,再次测试的过程中,果然error信号拉高了。

解决方案

首先CPU在写寄存器的过程中,并不知道FPGA是否正确处理上一个索引,其次FPGA处理一个索引和报文的时间是未知的,和后继模块的性能有关。所以解决这个问题的方案就是先缓存CPU写入的索引,然后再读出来慢慢处理。如下图所示:

图片

CPU写入索引后,先不处理,全部缓存到一个fifo中,然后再从fifo中读出每一个索引依次处理。修改后的方案再次做稳定性测试,上述问题不再出现。

这里会有一个问题,该fifo不会溢出吗?在这个项目中,是不会的,因为CPU连续写入索引的最大个数是32个,所以只要fifo的深度大于32即可。那如果CPU连续写入索引的个数没有限制呢?上述方案也就无效了,必须和CPU之间建立一个发压的机制,保证CPU写入的索引不会丢失。

总结

本案例中的问题,是使用req_ack接口时,常见的一个问题,请求方和应答方要保持好握手,在上一个任务处理结束前,不可以发起下一个任务。

另外这种接口在高性能场景下,是有一定的性能损耗,尽可能采用流式接口来处理。

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

    关注

    68

    文章

    10803

    浏览量

    210791
  • 接口
    +关注

    关注

    33

    文章

    8444

    浏览量

    150709
  • 仿真
    +关注

    关注

    50

    文章

    4021

    浏览量

    133330
  • 内存
    +关注

    关注

    8

    文章

    2965

    浏览量

    73808
  • 代码
    +关注

    关注

    30

    文章

    4721

    浏览量

    68216
收藏 人收藏

    评论

    相关推荐

    TC377中如何使用这个SCU接口信号-SMU_EMGSTP_REQ

    TC377中如何使用这个 SCU 接口信号-SMU_EMGSTP_REQ? 它是触发微控制器中的任何引脚还是它的处理方式...??
    发表于 01-31 06:48

    PCM3168的I2C接口访问不回ACK是怎么回事?

    我在用DSP的I2C接口访问PCM3168A的时候遇到了问题:发完从地址以后,发现PCM3168不回ACK,请问要想让这个片子的控制接口工作在I2C模式下,除了配置MODE、ADR0、ADR1以外
    发表于 10-31 06:48

    BLE中的ACK机制

    ACK
    橙群微电子
    发布于 :2023年03月31日 09:52:36

    CC2530 等待ack回复时间内如何处理其它帧?

    CC2530 等待ack回复时间内如何处理其它帧?CC2530 发送ack.req的帧时,发送完成后会在段时间内等待
    发表于 03-30 10:19

    为什么不发送SCAN-REQ事件?

    嗨,我正在使用带有DTM固件的BlueNRG-2芯片。它通过SPI连接到主处理器STM32。该蓝牙设备在外围设备中起作用(某些传感器)。 广告工作正常:作为主设备的另一个设备接收ADV_IND
    发表于 09-26 17:50

    ACK电路图

    ACK电路图
    发表于 01-01 05:36 1334次阅读
    <b class='flag-5'>ACK</b>电路图

    什么是ACK (ACKnowledge Character)

    什么是ACK (ACKnowledge Character)  英文缩写: ACK (ACKnowledge Character) 中文译名: 确认字符 分  类: 传输与接入
    发表于 02-22 10:12 1794次阅读

    24C02中IIC总线的应答信号(ACK)时序图分析

    24C02中IIC总线的应答信号(ACK)时序图分析,很好的单片机学习资料。
    发表于 03-21 17:30 93次下载

    CAN总线波形中为什么ACK电平偏高?

    CAN总线直以实时性强、传输距离远、抗干扰能力强、数据保证到达等特点而广泛应用于高可靠性的场合。但常常在观察CAN通信波形时,我们会发现差分电平在ACK段突然增高,这是什么原因导致的呢?这里结合测试实例对ACK电平偏高的原因做
    发表于 07-05 15:08 9371次阅读
    CAN总线波形中为什么<b class='flag-5'>ACK</b>电平偏高?

    Ack/Nak机制详细介绍

    Ack/Nak是种由硬件实现的,完全自动的机制,目的是保证TLP有效可靠地传输。Ack DLLP用于确认TLP被成功接收,Nak DLLP则用于表明TLP传输中遇到了错误。
    的头像 发表于 05-29 14:46 1.5w次阅读
    <b class='flag-5'>Ack</b>/Nak机制详细介绍

    简单地分析几个Ack/Nak机制的例子

    设备B接收到了TLP4095,但是该TLP并未通过CRC校检(即存在错误)。此时无论AckNak_LATENCY_TIMER处于何种状态,设备B都会立即向设备A返回Ack4094(注意返回的Ack
    的头像 发表于 05-30 09:16 6327次阅读
    简单地<b class='flag-5'>分析</b>几个<b class='flag-5'>Ack</b>/Nak机制的例子

    I2C接口配置ES7243录音芯片,MCU(STM32)收不到I2C ACK的问题

    I2C接口配置ES7243录音芯片,MCU(STM32)收不到I2C ACK的问题
    发表于 12-08 16:36 10次下载
    I2C<b class='flag-5'>接口</b>配置ES7243录音芯片,MCU(STM32)收不到I2C <b class='flag-5'>ACK</b>的问题

    ngx_dynamic_limit_req_module IP动态锁定工具

    ./oschina_soft/ngx_dynamic_limit_req_module.zip
    发表于 05-07 09:29 0次下载
    ngx_dynamic_limit_<b class='flag-5'>req</b>_module IP动态锁定工具

    ack文本查找工具

    ./oschina_soft/ack3.zip
    发表于 05-25 09:24 0次下载
    <b class='flag-5'>ack</b>文本查找工具

    CAN总线波形中为什么ACK电平偏高?

    在观察CAN通信波形时,我们会发现差分电平在ACK段突然增高,这是什么原因导致的呢?本文结合测试实例对ACK电平偏高的原因做简单分析ACK简介AC
    的头像 发表于 03-28 08:23 1009次阅读
    CAN总线波形中为什么<b class='flag-5'>ACK</b>电平偏高?