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

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

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

環(huán)境wait了一次為啥執(zhí)行了兩次?

冬至子 ? 來源:芯時代青年 ? 作者:尼德蘭的喵 ? 2023-12-04 10:54 ? 次閱讀

前言

副標(biāo)題 —— 驗證環(huán)境中bus.mon.sig與@bus.mon同時使用的反面案例哈哈哈。這個bug是在是過于經(jīng)典了所以每過一段時間我就會拿出來跟人聊聊,要是沒有這個的激勵,我一定不會走上記錄bug的道路的。

事故現(xiàn)場

先來還原出錯的場景。代碼示意如下,驗證環(huán)境構(gòu)建于module中,這段代碼的本意是希望對齊rtl的時鐘沿,因此在wait到bus.mon.vld(bus是interface,mon是clocking block)后@時鐘,之后從隊列中取數(shù)進行處理,下面的代碼我將取數(shù)調(diào)整成打印信息,本質(zhì)都是執(zhí)行一個操作:

initial begin
    forever begin
        wait (bus.mon.vld == 1'b1);
        @bus.mon;
        $display("%t, pop_front this cyc", $realtime);
    end
end

此時RTL的波形如下,vld信號置起一拍:

圖片

當(dāng)時出現(xiàn)的錯誤是,發(fā)現(xiàn)只有一拍的valid信號,但是卻發(fā)生了兩次取值行為,且發(fā)生在兩拍,那么對應(yīng)打印行為就是說發(fā)生了兩次打印且在不同時刻:

2010.000ns, pop_front this cyc
2020.000ns, pop_front this cyc

為了進一步確定行為,在wait和@之后分別加入打印:

initial begin
    forever begin
        wait (bus.mon.vld == 1'b1);
        $display("%t, wait dao le!", $realtime);
        @bus.mon;
        $display("%t, pop_front this cyc", $realtime);
    end
end

打印結(jié)果為:

2010.000ns, wait dao le!
2010.000ns, pop_front this cyc
2010.000ns, wait dao le!
2020.000ns, pop_front this cyc

可以確定在2010ns時刻wait生效了2次,事故現(xiàn)場還原結(jié)束。

事故分析

明確下,這個現(xiàn)象是不符合代碼本意的,本意應(yīng)該是一拍有效取一個數(shù)據(jù)出來,那么接下來具體分析下為什么是這種現(xiàn)象,由本靈魂畫手把波形畫一下!

圖片

順便在把time slot的圖搬出來對著看,因為環(huán)境搭建并啟動于于module中,只需要module regions的就夠了:

圖片

那么在2010ns時間點,進程上在做哪些事呢?

1.2010ns ts之前的1ps(interface中設(shè)置的skew)采樣rtl vld信號為1,在active-observed之間bus.mon.vld值跳變?yōu)?;
2.時鐘bus.mon在observed域跳變?yōu)?;對應(yīng)的時序結(jié)構(gòu)如下圖,那么也就不難發(fā)現(xiàn)為什么wait會判定成功2次了:

圖片

時間線也就理清楚了:

*2010ns, bus.mon.vld跳變?yōu)? -->
*wait(bus.mon.vld)在observed之前生效 -->
*@bus.mon成功(observed域)-->
*執(zhí)行環(huán)境語句,不消耗時間,forever回wait語句 -->
*wait(bus.mon.vld)再次成功,此時仍為2010ns -->
*@bus.mon不成功(關(guān)于@和wait的區(qū)別請查詢綠皮書吧),該進程等待在這里,等下一次bus.mon上升沿-->

  • 時間推進到2020ns,@bus.mon成功,再一次執(zhí)行下面的語句。

責(zé)任劃分

該波形是符合systemVerilog仿真規(guī)則的,但是不符合本人意圖,最好就別這么搞。乖乖的@bus.mon (if bus,mon.vld) 是最安全的。

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

    關(guān)注

    1

    文章

    386

    瀏覽量

    60183
  • VLD
    VLD
    +關(guān)注

    關(guān)注

    0

    文章

    2

    瀏覽量

    7202
收藏 人收藏

    評論

    相關(guān)推薦

    個IO模擬串口的,外部中斷進一次自動執(zhí)行兩次怎么解決?

    最近在做個IO模擬串口的。 外部中斷進一次自動執(zhí)行兩次,而且實驗發(fā)現(xiàn),第一次進中斷有問題,串口顯示的內(nèi)容不符合,第二
    發(fā)表于 05-11 08:35

    如何比較前后兩次輸入值的大小

    個循環(huán)不停的產(chǎn)生數(shù)據(jù),如何實現(xiàn)比較前后兩次數(shù)據(jù)的大小問題,如果兩次相差小于1說明數(shù)據(jù)有效,那么就保留這次的值;反之如果前后數(shù)相差大于1說明數(shù)據(jù)無效,則繼續(xù)取前
    發(fā)表于 11-02 20:04

    stc12c5a60s2的外部中斷 為什么會執(zhí)行兩次外部中斷函數(shù)???

    翻轉(zhuǎn)。這不就是外部中斷一次,執(zhí)行了兩次外部中斷函數(shù)??測試程序#include "stc12c5a60s2.h"***it LED = P2^3;***it KEY2 = P2^0
    發(fā)表于 05-23 14:59

    STM32F107以太網(wǎng)每次發(fā)數(shù)據(jù)都連發(fā)了兩次

    ),不知道是為什么?已知應(yīng)用層只發(fā)了一次,協(xié)議底層調(diào)接口也只調(diào)了一次,但MAC層卻發(fā)了兩次,是我使用以太網(wǎng)庫的方式不對嗎?另外有塊207的板子,同樣的依照官網(wǎng)例程移植,只發(fā)了
    發(fā)表于 07-01 04:35

    請問為什么我在C6455板子上跑EDMA完成中斷會進入兩次中斷程序?

    執(zhí)行中斷的函數(shù)里加了打印語句printf("I'm datain_isr");,進行軟件仿真時只打印一次,用板子跑的時候卻打印兩次,后在中斷函數(shù)打斷點發(fā)現(xiàn)中斷函數(shù)
    發(fā)表于 05-22 08:49

    為什么串口DMA中斷在接受一次數(shù)據(jù)時會進入兩次中斷呢

    為什么串口DMA中斷在接受一次數(shù)據(jù)時會進入兩次中斷呢?其代碼該如何去實現(xiàn)呢?
    發(fā)表于 12-07 07:26

    ARM按鍵中斷時中斷一次響應(yīng)兩次怎么回事

    ARM按鍵中斷時中斷一次響應(yīng)兩次怎么回事,調(diào)試時單步運行正常,全速時就出現(xiàn)這樣的結(jié)果還有ARM按鍵中斷時要求中斷處理函數(shù)的第件事是清除
    發(fā)表于 07-14 11:53

    e203軟件代碼中斷為什么會觸發(fā)兩次

    如圖所示,然后串口輸出得到的printf執(zhí)行了兩次(按一次按鍵觸發(fā)兩次中斷) 如該圖只按一次
    發(fā)表于 08-16 08:12

    LED的一次與二光學(xué)設(shè)計

    大功率LED照明零組件在成為照明產(chǎn)品前,般要進行兩次光學(xué)設(shè)計:一次光學(xué)設(shè)計是把LED IC封裝成LED光電零組件時所進行的設(shè)計,以解決LED的出光角度、光強、光通量大小、光強分布、
    發(fā)表于 07-06 10:54 ?1528次閱讀

    關(guān)于一次儀表、二儀表、就地儀表、遠傳儀表的概念及區(qū)分

    計)轉(zhuǎn)換成指針移動的機械能時,進行了第二能量轉(zhuǎn)換就稱為二儀表。換能的次數(shù)超過兩次的往往都按兩次稱呼,如孔板測量流量,孔板本身是
    的頭像 發(fā)表于 06-15 15:39 ?1.5w次閱讀

    馬斯克:4新冠病毒檢測 兩次陰性 兩次陽性

    11月13日消息,據(jù)外媒報道,特斯拉CEO馬斯克剛剛在社交網(wǎng)絡(luò)上表示,今天做了4新冠病毒檢測,檢查結(jié)果兩次為陰性兩次為陽性。 馬斯克表示,相同的機器,相同的測試,相同的護士,同樣的抗原檢測
    的頭像 發(fā)表于 11-13 16:29 ?1899次閱讀

    關(guān)于STM32F407一次事件觸發(fā)兩次中斷

    關(guān)于STM32F407一次事件觸發(fā)兩次中斷問題描述“bug的提出”“bug的解決”功能快捷鍵合理的創(chuàng)建標(biāo)題,有助于目錄的生成如何改變文本的樣式插入鏈接與圖片如何插入段漂亮的代碼片生成
    發(fā)表于 11-24 17:21 ?9次下載
    關(guān)于STM32F407<b class='flag-5'>一次</b>事件觸發(fā)<b class='flag-5'>兩次</b>中斷

    Cortex-M3/M4內(nèi)核處理器一次中斷事件可能產(chǎn)生兩次中斷問題

    正常情況下一次紅外遙控按鍵應(yīng)該產(chǎn)生16外部中斷。診斷代碼卻顯示執(zhí)行了32外部中斷服務(wù)函數(shù),也就是說一次中斷事件,產(chǎn)生了
    發(fā)表于 01-25 19:00 ?3次下載
    Cortex-M3/M4內(nèi)核處理器<b class='flag-5'>一次</b>中斷事件可能產(chǎn)生<b class='flag-5'>兩次</b>中斷問題

    python怎么將list輸入兩次

    在Python中,有多種方法可以將個列表輸入兩次。下面是使用不同的方法來實現(xiàn)此功能的幾個示例: 方法1: 使用循環(huán)將列表復(fù)制兩次 這是種基本的方法,使用循環(huán)遍歷列表并復(fù)制其元素
    的頭像 發(fā)表于 11-21 16:17 ?1428次閱讀

    說說TCP三握手的過程?為什么是三而不是兩次、四?

    而不是兩次或四。 首先,我們需要了解TCP是種面向連接的協(xié)議。在進行數(shù)據(jù)傳輸之前,發(fā)送端和接收端需要建立個可靠的連接。TCP三
    的頭像 發(fā)表于 02-04 11:03 ?851次閱讀