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

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

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

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

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

前言

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

事故現(xiàn)場(chǎng)

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

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

此時(shí)RTL的波形如下,vld信號(hào)置起一拍:

圖片

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

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

為了進(jìn)一步確定行為,在wait和@之后分別加入打?。?/p>

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時(shí)刻wait生效了2次,事故現(xiàn)場(chǎng)還原結(jié)束。

事故分析

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

圖片

順便在把time slot的圖搬出來(lái)對(duì)著看,因?yàn)榄h(huán)境搭建并啟動(dòng)于于module中,只需要module regions的就夠了:

圖片

那么在2010ns時(shí)間點(diǎn),進(jìn)程上在做哪些事呢?

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

圖片

時(shí)間線也就理清楚了:

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

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

責(zé)任劃分

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

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

    關(guān)注

    1

    文章

    384

    瀏覽量

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

    關(guān)注

    0

    文章

    2

    瀏覽量

    7157
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    個(gè)IO模擬串口的,外部中斷進(jìn)一次自動(dòng)執(zhí)行兩次怎么解決?

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

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

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

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

    翻轉(zhuǎn)。這不就是外部中斷一次,執(zhí)行了兩次外部中斷函數(shù)??測(cè)試程序#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)庫(kù)的方式不對(duì)嗎?另外有塊207的板子,同樣的依照官網(wǎng)例程移植,只發(fā)了
    發(fā)表于 07-01 04:35

    PIC32MZ Timer2觸發(fā)兩次

    我正在運(yùn)行簡(jiǎn)單的代碼來(lái)測(cè)試Time2,但是它看起來(lái)是兩次火。我編程定時(shí)器2以每1000nsec觸發(fā)一次,并在RE4上切換I/O線路,但它似乎在800nsec觸發(fā),然后再次在1000nsec觸發(fā)。如果
    發(fā)表于 03-31 07:01

    請(qǐng)問(wèn)為什么我在C6455板子上跑EDMA完成中斷會(huì)進(jìn)入兩次中斷程序?

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

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

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

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

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

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

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

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

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

    馬斯克:4新冠病毒檢測(cè) 兩次陰性 兩次陽(yáng)性

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

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

    關(guān)于STM32F407一次事件觸發(fā)兩次中斷問(wèn)題描述“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)生兩次中斷問(wèn)題

    正常情況下一次紅外遙控按鍵應(yīng)該產(chǎn)生16外部中斷。診斷代碼卻顯示執(zhí)行了32外部中斷服務(wù)函數(shù),也就是說(shuō)一次中斷事件,產(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>中斷問(wèn)題

    python怎么將list輸入兩次

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

    說(shuō)說(shuō)TCP三握手的過(guò)程?為什么是三而不是兩次、四?

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