0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

一個(gè)req-ack接口引發(fā)的問題分析

CHANBAEK ? 來源:FPGA的現(xiàn)今未 ? 作者:FPGA的現(xiàn)今未 ? 2023-09-06 17:36 ? 次閱讀

最近定位了一個(gè)bug,代碼是以前的同事留下的,沒有經(jīng)過太多充分的測(cè)試,且沒有仿真平臺(tái),定位的過程是相當(dāng)?shù)耐纯?,前后花了差不多一個(gè)星期。但是解決這個(gè)bug后,回頭看,其實(shí)也是一個(gè)很簡單的問題,就是請(qǐng)求應(yīng)答(req_ack)接口處理不正確造成的……

問題現(xiàn)象

項(xiàng)目在上板測(cè)試過程中必現(xiàn)報(bào)文被丟棄的現(xiàn)象,方案不是很復(fù)雜。FPGACPU獲取報(bào)文索引,然后根據(jù)索引讀取CPU內(nèi)存的報(bào)文(為了描述簡單,這里省去項(xiàng)目相關(guān)信息)。

定位過程

1、該模塊以前沒有問題,后繼模塊工作頻率降低后,給該模塊反壓了,才會(huì)出現(xiàn)該問題,首先是各種統(tǒng)計(jì),上板測(cè)試沒有發(fā)現(xiàn)問題,說明邏輯內(nèi)部處理報(bào)文的時(shí)候沒有丟包;

2、這里省略1萬字各種懷疑各種測(cè)試,多方位證實(shí)了邏輯內(nèi)部處理報(bào)文的時(shí)候確實(shí)是沒有丟包的;

3、懷疑是不是CPU丟了索引,或者FPGA丟了索引?但是都不太好證實(shí),因?yàn)閬G棄報(bào)文的時(shí)候FPGA本身不感知,也不知道軟件下發(fā)了多少索引。

4、在和同事一起討論懷疑點(diǎn),檢視代碼的時(shí)候,看到CPU告知FPGA描述符的時(shí)候,通過寫寄存器的方式來告知,F(xiàn)PGA處理采用的是req_ack接口。如下圖所示:其實(shí)這也不是一個(gè)標(biāo)準(zhǔn)的req_ack接口,因?yàn)檎?qǐng)求方只給一拍的wen信號(hào),req和ack的處理都是應(yīng)答方內(nèi)部的一種處理方式。

圖片

所以有一個(gè)大膽猜想,會(huì)不會(huì)是上一次req還沒有處理完,CPU又來了下一個(gè)req導(dǎo)致有索引丟棄,從而導(dǎo)致了報(bào)文丟棄了?這個(gè)現(xiàn)象很好監(jiān)測(cè),當(dāng)wen和req同時(shí)為1時(shí),即為錯(cuò)誤,監(jiān)測(cè)代碼如下所示:

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信號(hào)后,再次測(cè)試的過程中,果然error信號(hào)拉高了。

解決方案

首先CPU在寫寄存器的過程中,并不知道FPGA是否正確處理上一個(gè)索引,其次FPGA處理一個(gè)索引和報(bào)文的時(shí)間是未知的,和后繼模塊的性能有關(guān)。所以解決這個(gè)問題的方案就是先緩存CPU寫入的索引,然后再讀出來慢慢處理。如下圖所示:

圖片

CPU寫入索引后,先不處理,全部緩存到一個(gè)fifo中,然后再從fifo中讀出每一個(gè)索引依次處理。修改后的方案再次做穩(wěn)定性測(cè)試,上述問題不再出現(xiàn)。

這里會(huì)有一個(gè)問題,該fifo不會(huì)溢出嗎?在這個(gè)項(xiàng)目中,是不會(huì)的,因?yàn)镃PU連續(xù)寫入索引的最大個(gè)數(shù)是32個(gè),所以只要fifo的深度大于32即可。那如果CPU連續(xù)寫入索引的個(gè)數(shù)沒有限制呢?上述方案也就無效了,必須和CPU之間建立一個(gè)發(fā)壓的機(jī)制,保證CPU寫入的索引不會(huì)丟失。

總結(jié)

本案例中的問題,是使用req_ack接口時(shí),常見的一個(gè)問題,請(qǐng)求方和應(yīng)答方要保持好握手,在上一個(gè)任務(wù)處理結(jié)束前,不可以發(fā)起下一個(gè)任務(wù)。

另外這種接口在高性能場(chǎng)景下,是有一定的性能損耗,盡可能采用流式接口來處理。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10782

    瀏覽量

    210541
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    8381

    瀏覽量

    150581
  • 仿真
    +關(guān)注

    關(guān)注

    50

    文章

    4006

    瀏覽量

    133255
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    8

    文章

    2952

    瀏覽量

    73757
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4701

    瀏覽量

    68121
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    TC377中如何使用這個(gè)SCU接口信號(hào)-SMU_EMGSTP_REQ?

    TC377中如何使用這個(gè) SCU 接口信號(hào)-SMU_EMGSTP_REQ? 它是觸發(fā)微控制器中的任何引腳還是它的處理方式...??
    發(fā)表于 01-31 06:48

    BLE中的ACK機(jī)制

    ACK
    橙群微電子
    發(fā)布于 :2023年03月31日 09:52:36

    CC2530 等待ack回復(fù)時(shí)間內(nèi)如何處理其它幀?

    CC2530 等待ack回復(fù)時(shí)間內(nèi)如何處理其它幀?CC2530 發(fā)送個(gè)ack.req的幀時(shí),發(fā)送完成后會(huì)在段時(shí)間內(nèi)等待
    發(fā)表于 03-30 10:19

    為什么不發(fā)送SCAN-REQ事件?

    嗨,我正在使用帶有DTM固件的BlueNRG-2芯片。它通過SPI連接到主處理器STM32。該藍(lán)牙設(shè)備在外圍設(shè)備中起作用(某些傳感器)。 廣告工作正常:作為主設(shè)備的另一個(gè)設(shè)備接收ADV_IND
    發(fā)表于 09-26 17:50

    ACK電路圖

    ACK電路圖
    發(fā)表于 01-01 05:36 ?1332次閱讀
    <b class='flag-5'>ACK</b>電路圖

    什么是ACK (ACKnowledge Character)

    什么是ACK (ACKnowledge Character)  英文縮寫: ACK (ACKnowledge Character) 中文譯名: 確認(rèn)字符 分  類: 傳輸與接入
    發(fā)表于 02-22 10:12 ?1785次閱讀

    24C02中IIC總線的應(yīng)答信號(hào)(ACK)時(shí)序圖分析

    24C02中IIC總線的應(yīng)答信號(hào)(ACK)時(shí)序圖分析,很好的單片機(jī)學(xué)習(xí)資料。
    發(fā)表于 03-21 17:30 ?93次下載

    CAN總線波形中為什么ACK電平偏高?

    CAN總線直以實(shí)時(shí)性強(qiáng)、傳輸距離遠(yuǎn)、抗干擾能力強(qiáng)、數(shù)據(jù)保證到達(dá)等特點(diǎn)而廣泛應(yīng)用于高可靠性的場(chǎng)合。但常常在觀察CAN通信波形時(shí),我們會(huì)發(fā)現(xiàn)差分電平在ACK段突然增高,這是什么原因?qū)е碌哪??這里結(jié)合測(cè)試實(shí)例對(duì)ACK電平偏高的原因做
    發(fā)表于 07-05 15:08 ?9354次閱讀
    CAN總線波形中為什么<b class='flag-5'>ACK</b>電平偏高?

    Ack/Nak機(jī)制詳細(xì)介紹

    Ack/Nak是種由硬件實(shí)現(xiàn)的,完全自動(dòng)的機(jī)制,目的是保證TLP有效可靠地傳輸。Ack DLLP用于確認(rèn)TLP被成功接收,Nak DLLP則用于表明TLP傳輸中遇到了錯(cuò)誤。
    的頭像 發(fā)表于 05-29 14:46 ?1.5w次閱讀
    <b class='flag-5'>Ack</b>/Nak機(jī)制詳細(xì)介紹

    簡單地分析幾個(gè)Ack/Nak機(jī)制的例子

    設(shè)備B接收到了TLP4095,但是該TLP并未通過CRC校檢(即存在錯(cuò)誤)。此時(shí)無論AckNak_LATENCY_TIMER處于何種狀態(tài),設(shè)備B都會(huì)立即向設(shè)備A返回Ack4094(注意返回的Ack
    的頭像 發(fā)表于 05-30 09:16 ?6310次閱讀
    簡單地<b class='flag-5'>分析</b>幾個(gè)<b class='flag-5'>Ack</b>/Nak機(jī)制的例子

    I2C接口配置ES7243錄音芯片,MCU(STM32)收不到I2C ACK的問題

    I2C接口配置ES7243錄音芯片,MCU(STM32)收不到I2C ACK的問題
    發(fā)表于 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動(dòng)態(tài)鎖定工具

    ./oschina_soft/ngx_dynamic_limit_req_module.zip
    發(fā)表于 05-07 09:29 ?0次下載
    ngx_dynamic_limit_<b class='flag-5'>req</b>_module IP動(dòng)態(tài)鎖定工具

    ack文本查找工具

    ./oschina_soft/ack3.zip
    發(fā)表于 05-25 09:24 ?0次下載
    <b class='flag-5'>ack</b>文本查找工具

    I2C子系統(tǒng)ACK error

    在應(yīng)該收到 ACK 信號(hào)的時(shí)候沒有收到 ACK 信號(hào),i2c controller 就會(huì)產(chǎn)生個(gè) ACK error 的中斷,告訴 i2cd
    的頭像 發(fā)表于 07-22 14:39 ?1690次閱讀
    I2C子系統(tǒng)<b class='flag-5'>ACK</b> error

    CAN總線波形中為什么ACK電平偏高?

    在觀察CAN通信波形時(shí),我們會(huì)發(fā)現(xiàn)差分電平在ACK段突然增高,這是什么原因?qū)е碌哪??本文結(jié)合測(cè)試實(shí)例對(duì)ACK電平偏高的原因做簡單分析。ACK簡介AC
    的頭像 發(fā)表于 03-28 08:23 ?958次閱讀
    CAN總線波形中為什么<b class='flag-5'>ACK</b>電平偏高?