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

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

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

在testbench中如何使用阻塞賦值和非阻塞賦值

FPGA設(shè)計(jì)論壇 ? 來源:CSDN技術(shù)社區(qū) ? 2025-04-15 09:34 ? 次閱讀

本文詳細(xì)闡述了在一個testbench中,應(yīng)該如何使用阻塞賦值與非阻塞賦值。首先說結(jié)論,建議在testbench中,對時鐘信號(包括分頻時鐘)使用阻塞賦值,對其他同步信號使用非阻塞賦值。

下面是一個簡單的D觸發(fā)器模塊,本文將針對它的testbench進(jìn)行討論。

moduleDff(inputclk, rst_n, data_in,outputregdata_out);  always@(posedgeclk,negedgerst_n)begin    if(!rst_n)       data_out <=?1'b0; ? ? ? ?else? ? ? ? ? ? ?data_out <= data_in; ? ?endendmodule

Verilog仿真時,仿真波形與真實(shí)波形是有一定差距的,這體現(xiàn)在同步信號的改變與時鐘沿一直是對齊的,而真實(shí)情況下,數(shù)據(jù)信號在時鐘沿后需要延遲一段時間才會發(fā)生改變。

體現(xiàn)在上面的模塊中就是數(shù)據(jù)信號data_in的改變是與時鐘信號clk同步的,data_out的改變也是與時鐘信號clk同步的。

圖1展示了一個簡單的仿真波形,其中信號data_in和信號data_out的改變都與時鐘沿同步,需要注意的是在時鐘沿處,信號data_out得到的是信號data_in在時鐘沿處的原值,而不是改變后的值。

c4aae130-1743-11f0-9310-92fbcf53809c.png

圖1 仿真波形

也就是說,一個更加真實(shí)的波形可能如圖2所示。

c4c06e42-1743-11f0-9310-92fbcf53809c.png

圖2 真實(shí)波形

下面給出圖1所示波形的testbench。

moduleDff_t;  regrst_n =1;  regclk =0;  regdata_in =0;  wiredata_out;   Dff dff(.clk(clk),.rst_n(rst_n),.data_in(data_in),.data_out(data_out));  //時鐘產(chǎn)生  alwaysbegin    #10clk = ~clk;  end  //異步復(fù)位信號  initialbegin    #3rst_n =0;     #3rst_n =1;  end  //同步數(shù)據(jù)輸入  initialbegin    #10data_in <=?1; ? ? ? ? #20?data_in <=?0; ? ? ? ? #20?data_in <=?1; ? ? ? ? #20?data_in <=?0; ? ?end? ? ?endmodule

其中時鐘信號和異步復(fù)位信號使用了阻塞賦值,而數(shù)據(jù)信號使用了非阻塞賦值。如果不是這樣,就無法保證產(chǎn)生如圖1所示的仿真波形,下面將分別討論。

1、如時鐘信號使用非阻塞賦值,數(shù)據(jù)信號也使用非阻塞賦值

moduleDff_t;  regrst_n =1;  regclk =0;  regdata_in =0;  wiredata_out;   Dff dff(.clk(clk),.rst_n(rst_n),.data_in(data_in),.data_out(data_out));  //時鐘產(chǎn)生  alwaysbegin    #10clk <= ~clk; ? ?end? ? ??//異步復(fù)位信號? ? ?initial?begin? ? ? ? ?#3?rst_n =?0; ? ? ? ? #3?rst_n =?1; ? ?end? ? ??//同步數(shù)據(jù)輸入? ? ?initial?begin? ? ? ? ?#10?data_in <=?1; ? ? ? ? #20?data_in <=?0; ? ? ? ? #20?data_in <=?1; ? ? ? ? #20?data_in <=?0; ? ?end? ? ?endmodule

c4cfd030-1743-11f0-9310-92fbcf53809c.png

圖3 錯誤的波形(一種可能)

此時進(jìn)行仿真,可能會出現(xiàn)圖3所示的錯誤波形,信號data_out得到的是信號data_in在時鐘沿處改變后的值。

拿第一個時鐘上升沿即10ns時舉例,此時時鐘信號clk被非阻塞賦值,同時data_in被非阻塞賦值。首先說明非阻塞賦值的過程,非阻塞賦值是分兩步進(jìn)行的,第一步是將賦值號<=右表達(dá)式求值,在當(dāng)前仿真時間的所有賦值和非阻塞賦值右表達(dá)式求值(活躍事件)完成后,再進(jìn)行第二步,即非阻塞賦值的賦值(非阻塞賦值的賦值順序由求值順序決定),即非阻塞賦值分為兩步:求值與賦值,后文僅使用“賦值”一詞代表非阻塞賦值中的賦值這個步驟,注意其與阻塞賦值的區(qū)別。

由于initial結(jié)構(gòu)和always結(jié)構(gòu)是并行的,因此無法確定哪一個非阻塞賦值的右表達(dá)式求值是先進(jìn)行的,但可以確定的是,信號clk的賦值和信號data_in的賦值以某種先后順序被調(diào)度到之后(非阻塞賦值更新區(qū))執(zhí)行。當(dāng)進(jìn)行第二步時,clk的賦值和data_in的賦值都從非阻塞賦值更新區(qū)激活到活躍事件區(qū)執(zhí)行,此時有多種執(zhí)行方式:

1、如果clk的賦值先執(zhí)行(即之前clk非阻塞賦值右表達(dá)式先求值),則其又觸發(fā)了@(posedge clk),接著是執(zhí)行data_out非阻塞賦值右表達(dá)式求值,還是執(zhí)行data_in的賦值,是不確定的,它們都是活躍事件。如果先執(zhí)行data_out非阻塞賦值右表達(dá)式求值,則data_out得到的是data_in的舊值即0;如果先執(zhí)行data_in的賦值,則data_out得到的是data_in的新值即1(圖3可能就是這種情況)。

2、如果data_in的賦值先執(zhí)行(即之前data_in非阻塞賦值右表達(dá)式先求值),則最后data_out得到的一定是data_in的新值即1(圖3可能就是這種情況)。

2、如時鐘信號使用阻塞賦值,數(shù)據(jù)信號也使用阻塞賦值

moduleDff_t;  regrst_n =1;  regclk =0;  regdata_in =0;  wiredata_out;   Dff dff(.clk(clk),.rst_n(rst_n),.data_in(data_in),.data_out(data_out));  //時鐘產(chǎn)生  alwaysbegin    #10clk = ~clk;  end  //異步復(fù)位信號  initialbegin    #3rst_n =0;     #3rst_n =1;  end  //同步數(shù)據(jù)輸入  initialbegin    #10data_in =1;     #20data_in =0;     #20data_in =1;     #20data_in =0;  end  endmodule

c4ed63f2-1743-11f0-9310-92fbcf53809c.png

圖4 錯誤的波形(一種可能)

此時進(jìn)行仿真,可能會出現(xiàn)圖4所示的錯誤波形,信號data_out得到的是信號data_in在時鐘沿處改變后的值。

拿第一個時鐘上升沿即10ns時舉例,此時時鐘信號clk被阻塞賦值,同時data_in被阻塞賦值。由于initial結(jié)構(gòu)和always結(jié)構(gòu)是并行的,因此無法確定哪一個阻塞賦值是先進(jìn)行的,此時有多種執(zhí)行方式。

1、如果clk的阻塞賦值先進(jìn)行,則其又觸發(fā)了@(posedge clk),接著是執(zhí)行data_out非阻塞賦值右表達(dá)式求值,還是執(zhí)行data_in的阻塞賦值,是不確定的,它們都是活躍事件。如果先執(zhí)data_out非阻塞賦值右表達(dá)式求值,則data_out首先得到的是data_in的舊值即0;如果先執(zhí)行data_in的阻塞賦值,則則data_out得到的是data_in的新值即1(圖4可能就是這種情況)。

2、如果data_in的阻塞賦值先進(jìn)行則最后data_out得到的一定是data_in的新值即1(圖4可能就是這種情況)。

3、如時鐘信號使用非阻塞賦值,數(shù)據(jù)信號使用阻塞賦值

moduleDff_t;  regrst_n =1;  regclk =0;  regdata_in =0;  wiredata_out;   Dff dff(.clk(clk),.rst_n(rst_n),.data_in(data_in),.data_out(data_out));  //時鐘產(chǎn)生  alwaysbegin    #10clk <= ~clk; ? ?end? ? ??//異步復(fù)位信號? ? ?initial?begin? ? ? ? ?#3?rst_n =?0; ? ? ? ? #3?rst_n =?1; ? ?end? ? ??//同步數(shù)據(jù)輸入? ? ?initial?begin? ? ? ? ?#10?data_in =?1; ? ? ? ? #20?data_in =?0; ? ? ? ? #20?data_in =?1; ? ? ? ? #20?data_in =?0; ? ?end? ? ?endmodule

c4f947e4-1743-11f0-9310-92fbcf53809c.png

圖5 錯誤的波形

此時進(jìn)行仿真,一定會出現(xiàn)圖5所示的錯誤波形,信號data_out得到的是信號data_in在時鐘沿處改變后的值。

拿第一個時鐘上升沿即10ns時舉例,此時時鐘信號clk被非阻塞賦值,同時data_in被阻塞賦值。由于initial結(jié)構(gòu)和always結(jié)構(gòu)是并行的,因此無法確定是非阻塞賦值的右表達(dá)式求值先進(jìn)行還是阻塞賦值先進(jìn)行,但是阻塞賦值一定是在非阻塞賦值的賦值前進(jìn)行的(根據(jù)非阻塞賦值的定義),所以不管有多少種執(zhí)行方式,此時只有一種結(jié)果。

1、data_out得到的一定是data_in的新值即1(圖5就是這種情況)。

4、時鐘信號使用阻塞賦值,數(shù)據(jù)信號使用非阻塞賦值

moduleDff_t;  regrst_n =1;  regclk =0;  regdata_in =0;  wiredata_out;   Dff dff(.clk(clk),.rst_n(rst_n),.data_in(data_in),.data_out(data_out));  //時鐘產(chǎn)生  alwaysbegin    #10clk = ~clk;  end  //異步復(fù)位信號  initialbegin    #3rst_n =0;     #3rst_n =1;  end  //同步數(shù)據(jù)輸入  initialbegin    #10data_in <=?1; ? ? ? ? #20?data_in <=?0; ? ? ? ? #20?data_in <=?1; ? ? ? ? #20?data_in <=?0; ? ?end? ? ?endmodule

最后分析正確的testbench,拿第一個時鐘上升沿即10ns時舉例,此時時鐘信號clk被阻塞賦值,同時data_in被非阻塞賦值。由于initial結(jié)構(gòu)和always結(jié)構(gòu)是并行的,因此無法確定是非阻塞賦值的右表達(dá)式求值先進(jìn)行還是阻塞賦值先進(jìn)行。

1、如果clk的阻塞賦值先進(jìn)行,則其又觸發(fā)了@(posedge clk),接著是執(zhí)行data_out非阻塞賦值右表達(dá)式求值,還是執(zhí)行data_in非阻塞賦值右表達(dá)式求值,是不確定的,它們都是活躍事件。但是可以肯定的是,data_out得到的一定是data_in的舊值,因?yàn)榉亲枞x值的賦值一定在所有非阻塞賦值的求值后進(jìn)行(根據(jù)非阻塞賦值的定義)。

2、如果data_in非阻塞賦值右表達(dá)式求值先進(jìn)行,則在之后clk阻塞賦值進(jìn)行后,其又觸發(fā)了@(posedge clk),接著執(zhí)行data_out非阻塞賦值右表達(dá)式求值,但求值時是使用data_in的舊值,因?yàn)榉亲枞x值的賦值一定在所有非阻塞賦值的求值后進(jìn)行(根據(jù)非阻塞賦值的定義)。

來源:https://blog.csdn.net/weixin_45791458/article/details/137046594

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

    關(guān)注

    51

    文章

    4202

    瀏覽量

    135002
  • Verilog
    +關(guān)注

    關(guān)注

    28

    文章

    1363

    瀏覽量

    111356
  • 阻塞賦值
    +關(guān)注

    關(guān)注

    0

    文章

    10

    瀏覽量

    9213
  • 非阻塞賦值
    +關(guān)注

    關(guān)注

    0

    文章

    11

    瀏覽量

    10052

原文標(biāo)題:在testbench中使用阻塞賦值和非阻塞賦值的區(qū)別

文章出處:【微信號:gh_9d70b445f494,微信公眾號:FPGA設(shè)計(jì)論壇】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 0人收藏

    評論

    相關(guān)推薦

    Verilog語言中阻塞阻塞賦值的不同

    賦值何時使用阻塞賦值才能設(shè)計(jì)出符合要求的電路。 他們也不完全明白電路結(jié)構(gòu)的設(shè)計(jì),即可綜合風(fēng)格的Verilog模塊的設(shè)計(jì)
    的頭像 發(fā)表于 08-17 16:18 ?6553次閱讀

    Verilog阻塞賦值阻塞賦值的正確使用

    [table][tr][td] Verilog中有兩種為變量賦值的方法。一種叫做連續(xù)賦值,另一種叫做過程賦值。過程賦值又分為阻塞
    發(fā)表于 07-03 03:06

    【技巧分享】FPGA至簡設(shè)計(jì)-阻塞賦值阻塞賦值

    阻塞阻塞作者:小黑同學(xué)一、 概述1、阻塞賦值對應(yīng)的電路往往與觸發(fā)沿沒有關(guān)系,只與電平的變化有關(guān)系。
    發(fā)表于 04-24 14:49

    FPGA學(xué)習(xí)系列:5.阻塞賦值阻塞賦值

    設(shè)計(jì)背景: 阻塞 (=)和阻塞(=)一直是我們FPGA討論的問題,資深的學(xué)者都是討論的是賦值
    的頭像 發(fā)表于 05-31 11:40 ?7035次閱讀
    FPGA學(xué)習(xí)系列:5.<b class='flag-5'>阻塞</b><b class='flag-5'>賦值</b>與<b class='flag-5'>非</b><b class='flag-5'>阻塞</b><b class='flag-5'>賦值</b>

    阻塞賦值阻塞賦值的用法一篇文章就夠了

    對于VerilogHDL語言中,經(jīng)常在always模塊,面臨兩種賦值方式:阻塞賦值阻塞
    的頭像 發(fā)表于 01-30 17:41 ?2.2w次閱讀

    verilog阻塞賦值阻塞賦值到底有什么區(qū)別

    1、阻塞賦值操作符用等號(即 = )表示?!?b class='flag-5'>阻塞”是指在進(jìn)程語句(initial和always),當(dāng)前的賦值語句阻斷了其后的語句,也就是說
    發(fā)表于 04-25 08:00 ?0次下載
    verilog<b class='flag-5'>中</b><b class='flag-5'>阻塞</b><b class='flag-5'>賦值</b>和<b class='flag-5'>非</b><b class='flag-5'>阻塞</b><b class='flag-5'>賦值</b>到底有什么區(qū)別

    IEEE Verilog阻塞賦值阻塞賦值的區(qū)別

    阻塞賦值對應(yīng)的電路往往與觸發(fā)沿沒有關(guān)系,只與輸入電平的變化有關(guān)系。阻塞賦值對應(yīng)的電路結(jié)構(gòu)往往與觸發(fā)沿有關(guān)系,只有
    的頭像 發(fā)表于 06-17 11:57 ?1.2w次閱讀
    IEEE Verilog<b class='flag-5'>阻塞</b><b class='flag-5'>賦值</b>和<b class='flag-5'>非</b><b class='flag-5'>阻塞</b><b class='flag-5'>賦值</b>的區(qū)別

    VerilogHDL語言:清阻塞賦值阻塞賦值

    對于VerilogHDL語言中,經(jīng)常在always模塊,面臨兩種賦值方式:阻塞賦值阻塞
    發(fā)表于 11-19 15:48 ?1276次閱讀

    簡述阻塞賦值阻塞賦值的可綜合性

    ,所以基于的C的術(shù)語和概念出現(xiàn)在EDA,原本是一個“誤打誤撞”,但歷史造成的現(xiàn)實(shí)則是:必須理解和正確掌握它們的用法。 軟件阻塞進(jìn)程,是指調(diào)用返回之前,應(yīng)用進(jìn)程一直等待: 為了保證應(yīng)用進(jìn)程的效率,不至于被子程序的運(yùn)算過程“掛起
    的頭像 發(fā)表于 05-12 09:45 ?2883次閱讀
    簡述<b class='flag-5'>阻塞</b><b class='flag-5'>賦值</b>和<b class='flag-5'>非</b><b class='flag-5'>阻塞</b><b class='flag-5'>賦值</b>的可綜合性

    時序邏輯阻塞阻塞

    Verilog HDL的賦值語句分為阻塞賦值阻塞賦值兩種。
    的頭像 發(fā)表于 03-15 13:53 ?3239次閱讀

    verilog阻塞賦值阻塞賦值的區(qū)別

    阻塞賦值操作符用等號(即 = )表示。“阻塞”是指在進(jìn)程語句(initial和always),當(dāng)前的賦值語句阻斷了其后的語句,也就是說后面
    發(fā)表于 12-19 16:49 ?7933次閱讀

    Verilog阻塞阻塞賦值金規(guī)

    對于VerilogHDL語言中,經(jīng)常在always模塊,面臨兩種賦值方式:阻塞賦值阻塞
    的頭像 發(fā)表于 06-01 09:21 ?1698次閱讀

    一文了解阻塞賦值阻塞賦值

    今天給大家普及一下阻塞賦值阻塞賦值的相關(guān)知識
    的頭像 發(fā)表于 07-07 14:15 ?2417次閱讀
    一文了解<b class='flag-5'>阻塞</b><b class='flag-5'>賦值</b>與<b class='flag-5'>非</b><b class='flag-5'>阻塞</b><b class='flag-5'>賦值</b>

    阻塞賦值阻塞賦值

    ”=“阻塞賦值與”
    的頭像 發(fā)表于 09-12 09:06 ?1259次閱讀
    <b class='flag-5'>阻塞</b><b class='flag-5'>賦值</b>與<b class='flag-5'>非</b><b class='flag-5'>阻塞</b><b class='flag-5'>賦值</b>

    verilog同步和異步的區(qū)別 verilog阻塞賦值阻塞賦值的區(qū)別

    Verilog是一種硬件描述語言,用于設(shè)計(jì)和模擬數(shù)字電路。Verilog,同步和異步是用來描述數(shù)據(jù)傳輸和信號處理的兩種不同方式,而阻塞賦值
    的頭像 發(fā)表于 02-22 15:33 ?2100次閱讀

    電子發(fā)燒友

    中國電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會員交流學(xué)習(xí)
    • 獲取您個性化的科技前沿技術(shù)信息
    • 參加活動獲取豐厚的禮品