精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

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

3天內不再提示

環境wait了一次為啥執行了兩次?

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

前言

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

事故現場

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

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

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

圖片

當時出現的錯誤是,發現只有一拍的valid信號,但是卻發生了兩次取值行為,且發生在兩拍,那么對應打印行為就是說發生了兩次打印且在不同時刻:

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

打印結果為:

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次,事故現場還原結束。

事故分析

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

圖片

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

圖片

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

1.2010ns ts之前的1ps(interface中設置的skew)采樣rtl vld信號為1,在active-observed之間bus.mon.vld值跳變為1;
2.時鐘bus.mon在observed域跳變為1;對應的時序結構如下圖,那么也就不難發現為什么wait會判定成功2次了:

圖片

時間線也就理清楚了:

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

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

責任劃分

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

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • RTL
    RTL
    +關注

    關注

    1

    文章

    385

    瀏覽量

    59706
  • VLD
    VLD
    +關注

    關注

    0

    文章

    2

    瀏覽量

    7172
收藏 人收藏

    評論

    相關推薦

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

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

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

    個循環不停的產生數據,如何實現比較前后兩次數據的大小問題,如果兩次相差小于1說明數據有效,那么就保留這次的值;反之如果前后數相差大于1說明數據無效,則繼續取前
    發表于 11-02 20:04

    stc12c5a60s2的外部中斷 為什么會執行兩次外部中斷函數???

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

    STM32F107以太網每次發數據都連發了兩次

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

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

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

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

    為什么串口DMA中斷在接受一次數據時會進入兩次中斷呢?其代碼該如何去實現呢?
    發表于 12-07 07:26

    ARM按鍵中斷時中斷一次響應兩次怎么回事

    ARM按鍵中斷時中斷一次響應兩次怎么回事,調試時單步運行正常,全速時就出現這樣的結果還有ARM按鍵中斷時要求中斷處理函數的第件事是清除
    發表于 07-14 11:53

    e203軟件代碼中斷為什么會觸發兩次

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

    LED的一次與二光學設計

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

    關于一次儀表、二儀表、就地儀表、遠傳儀表的概念及區分

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

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

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

    關于STM32F407一次事件觸發兩次中斷

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

    Cortex-M3/M4內核處理器一次中斷事件可能產生兩次中斷問題

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

    python怎么將list輸入兩次

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

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

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