91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

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

簡(jiǎn)述Verilog HDL中阻塞語(yǔ)句和非阻塞語(yǔ)句的區(qū)別

FPGA設(shè)計(jì)論壇 ? 來(lái)源:博客園 ? 作者: elegang ? 2021-12-02 18:24 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

Verilog中有兩種類(lèi)型的賦值語(yǔ)句:阻塞賦值語(yǔ)句(“=”)和非阻塞賦值語(yǔ)句(“<=”)。正確地使用這兩種賦值語(yǔ)句對(duì)于Verilog的設(shè)計(jì)和仿真非常重要。

Verilog語(yǔ)言中講的阻塞賦值與非阻塞賦值,但從字面意思來(lái)看,阻塞就是執(zhí)行的時(shí)候在某個(gè)地方卡住了,等這個(gè)操作執(zhí)行完在繼續(xù)執(zhí)行下面的語(yǔ)句,而非阻塞就是不管執(zhí)行完沒(méi)有,我不管執(zhí)行的結(jié)果是什么,反正我繼續(xù)下面的事情。而Verilog中的阻塞賦值與非阻塞賦值正好也是這個(gè)意思,通過(guò)執(zhí)行一個(gè)例子,就可以簡(jiǎn)單地明白了:
1、阻塞賦值可以理解為語(yǔ)句的順序執(zhí)行,因此語(yǔ)句的執(zhí)行順序很重要
2、非阻塞賦值可以理解為語(yǔ)句的并行執(zhí)行,所以語(yǔ)句的執(zhí)行不考慮順序
3、在assign的結(jié)構(gòu)中,必須使用的是阻塞賦值

也就是說(shuō):

阻塞:在本語(yǔ)句中“右式計(jì)算”和“左式更新”完全完成之后,才開(kāi)始執(zhí)行下一條語(yǔ)句;
非阻塞:當(dāng)前語(yǔ)句的執(zhí)行不會(huì)阻塞下一語(yǔ)句的執(zhí)行。

下面給出實(shí)例來(lái)說(shuō)明:

給出相應(yīng)的案例來(lái)幫助理解:

module prj1(in,b,c,d,clk,rst_n);

input in;
input clk;
input rst_n;
output b,c,d;
reg b,c,d;

always @(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
        b <=0;
        c <=0;
        d <=0;
    end
    else begin
        b <=in;
        c <=b;
        d <=c;
        end
    end
endmodule

這個(gè)目的是為了展示非阻塞賦值過(guò)程中的時(shí)序變化,對(duì)應(yīng)的RTL電路圖和仿真波形如下圖:

65318f7e-417c-11ec-b939-dac502259ad0.jpg

從仿真圖可以看書(shū),b,c,d是在每個(gè)時(shí)鐘后依次傳遞的,如果采用阻塞賦值,如果in改變,那么b,c,d立刻改變,這個(gè)就在這里不給出仿真。

阻塞賦值和非阻塞賦值的另外一個(gè)區(qū)別在于綜合的時(shí)候,如果輸出只有d,bc作為中間變量,阻塞賦值在綜合的過(guò)程中會(huì)自動(dòng)省略掉中間過(guò)程。給出如下仿真,理解更為清楚

module prj1(in,b,c,clk,rst_n);

input in;
input clk;
input rst_n;
output b,c;
reg b,c, e,f, m,n;
/* <= */
always @(posedge clk or negedge rst_n) begin
    if(!rst_n) b <=0;
    else begin
        e <=in;
        f <=e;
        b <=f;
        end
    end
/* = */
always @(posedge clk or negedge rst_n) begin
    if(!rst_n) c=0;
    else begin
        m = in;
        n = m;
        c = n;
        end
    end    
endmodule

綜合后結(jié)果如圖,可以看出,采用阻塞賦值,綜合后的邏輯單元只有一個(gè),中間變量m,n直接省去了。

65b31b3e-417c-11ec-b939-dac502259ad0.jpg

下面我們來(lái)看看兩者代碼之間到底是怎么運(yùn)行的。

(1)對(duì)于阻塞賦值的情況:

always @(posedge clk or negedge rst_n) begin
    if(!rst_n) c=0;
    else begin
        m = in;
        n = m;
        c = n;
        end
    end

always語(yǔ)句塊對(duì)Clk的上升沿敏感,當(dāng)發(fā)生Clk 0~1的跳變時(shí),執(zhí)行該always語(yǔ)句。

在begin...end語(yǔ)句塊中所有語(yǔ)句是順序執(zhí)行的,而且最關(guān)鍵的是,阻塞賦值是在本語(yǔ)句中“右式計(jì)算”和“左式更新”完全完成之后,才開(kāi)始執(zhí)行下一條語(yǔ)句的。

在本例中,in的值賦給m以后,再執(zhí)行n = m;同樣在n的值更新以后,才執(zhí)行c = n。這樣,最終的計(jì)算結(jié)果就是in = c。也就是說(shuō)時(shí)鐘上升沿到來(lái)的時(shí)候,整個(gè)語(yǔ)句塊執(zhí)行完后,in,m,n,c的值都是一樣的,這也就是我們前面說(shuō)的,in變化之后,m,n,c都跟著變化。所有的語(yǔ)句執(zhí)行完以后,該always語(yǔ)句等待Clk的上升沿,從而再一次觸發(fā)begin...end語(yǔ)句。

總結(jié)

完成阻塞賦值的過(guò)程為:首先計(jì)算等號(hào)右邊表達(dá)式的結(jié)果;接著這個(gè)結(jié)果存入仿真系統(tǒng)的內(nèi)部臨時(shí)寄存器中,這個(gè)寄存器也稱為賦值事件隊(duì)列和調(diào)度的臨時(shí)寄存器。如果賦值時(shí)沒(méi)有延遲信息,則這個(gè)事件立即被調(diào)度執(zhí)行。

(2)對(duì)于非阻塞賦值的情況

always @(posedge clk or negedge rst_n) begin
    if(!rst_n) b <=0;
    else begin
        e <=in;
        f <=e;
        b <=f;
        end
    end

首先執(zhí)行e <= in,產(chǎn)生一個(gè)更新事件,將in的當(dāng)前值賦給e,但是這個(gè)賦值過(guò)程并沒(méi)有立刻執(zhí)行,而是在事件隊(duì)列中處于等待狀態(tài)。

然后執(zhí)行f <= e,同樣產(chǎn)生一個(gè)更新事件,將e的當(dāng)前值(注意上一語(yǔ)句中將in值賦給e的過(guò)程并沒(méi)有完成,e還是舊值)賦給f,這個(gè)賦值事件也將在事件隊(duì)列中處于等待狀態(tài)。

再執(zhí)行b <= f,產(chǎn)生一個(gè)更新事件,將f的當(dāng)前值賦給b,這個(gè)賦值事件也將在事件隊(duì)列中等待執(zhí)行。

這時(shí)always語(yǔ)句塊執(zhí)行完成,開(kāi)始對(duì)下一個(gè)Clk上升沿敏感。也就是說(shuō),使用非阻塞賦值方式進(jìn)行賦值時(shí),各個(gè)賦值語(yǔ)句同步執(zhí)行;因此,通常在一個(gè)時(shí)鐘沿對(duì)臨時(shí)變量進(jìn)行賦值,而在另一個(gè)時(shí)鐘沿對(duì)其進(jìn)行采樣。

那么什么時(shí)候才執(zhí)行那3個(gè)在事件隊(duì)列中等待的事件呢?只有當(dāng)當(dāng)前仿真時(shí)間內(nèi)的所有活躍事件和非活躍事件都執(zhí)行完成后,才開(kāi)始執(zhí)行這些非阻塞賦值的更新事件。這樣就相當(dāng)于將in、e和f的值同時(shí)賦給了e、f和b。

注:

*仿真器首先按照仿真時(shí)間對(duì)事件進(jìn)行排序,然后再在當(dāng)前仿真時(shí)間里按照事件的優(yōu)先級(jí)順序進(jìn)行排序。

*活躍事件是優(yōu)先級(jí)最高的事件。在活躍事件之間,它們的執(zhí)行順序是隨機(jī)的。阻塞賦值(=)、連續(xù)賦值(assign)以及非阻塞賦值的右式計(jì)算等都屬于活躍事件。

總結(jié) :

非阻塞語(yǔ)句的執(zhí)行過(guò)程為:首先,它會(huì)把非阻塞賦值放入調(diào)度隊(duì)列中;接著,仿真工具開(kāi)始執(zhí)行下一條語(yǔ)句而不等待當(dāng)前這條語(yǔ)句執(zhí)行完畢。也就是說(shuō),先計(jì)算出等號(hào)右邊表達(dá)式的結(jié)果,再把這個(gè)結(jié)果的賦值操作保存在事件隊(duì)列中,等輪到事件被調(diào)度的時(shí)候,把這個(gè)結(jié)果賦值給等號(hào)左邊。如果沒(méi)有指定等號(hào)右邊的延遲,賦值的操作會(huì)發(fā)生在當(dāng)前時(shí)間單位的最后時(shí)刻。

知道了阻塞賦值和非阻塞賦值的區(qū)別之后,大家肯定就會(huì)關(guān)心什么時(shí)候該用阻塞賦值什么時(shí)候該用非阻塞賦值,下面我簡(jiǎn)單的說(shuō)幾句:

賦值的類(lèi)型的選擇取決于建模的邏輯類(lèi)型。一般情況是這樣的(也有特殊情況):
(1)在時(shí)序邏輯電路中一般使用非阻塞賦值。
非阻塞賦值在塊結(jié)束后才完成賦值操作,此賦值方式可以避免在仿真出現(xiàn)冒險(xiǎn)和競(jìng)爭(zhēng)現(xiàn)象。
(2)在組合邏輯電路中一般使用阻塞賦值。
使用阻塞方式對(duì)一個(gè)變量進(jìn)行賦值時(shí),此變量的值在在賦值語(yǔ)句執(zhí)行完后就立即改變。
(3)在assign語(yǔ)句中必須使用阻塞賦值語(yǔ)句


希望大家在懂得了阻塞和非阻塞語(yǔ)句的區(qū)別之后,能夠很好的在自己的項(xiàng)目中靈活地運(yùn)用,這也是大家面試的時(shí)候,必須會(huì)面對(duì)的一個(gè)問(wèn)題,希望大家能夠掌握

編輯:jq


聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(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)投訴
  • Verilog
    +關(guān)注

    關(guān)注

    30

    文章

    1374

    瀏覽量

    114542
  • HDL
    HDL
    +關(guān)注

    關(guān)注

    8

    文章

    332

    瀏覽量

    48986
  • 阻塞
    +關(guān)注

    關(guān)注

    0

    文章

    24

    瀏覽量

    8437

原文標(biāo)題:Verilog HDL中阻塞語(yǔ)句和非阻塞語(yǔ)句的區(qū)別

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Verilog HDL語(yǔ)法學(xué)習(xí)筆記

    Verilog HDL 語(yǔ) 言 最 初 是 作為 Gateway Design Automation 公 司 ( Gateway DesignAutomation 公司后來(lái)被著名的 Cadence Design Systems 公司收購(gòu))模擬器產(chǎn)品開(kāi)發(fā)的硬件建模語(yǔ)言。
    的頭像 發(fā)表于 03-04 15:04 ?5347次閱讀
    <b class='flag-5'>Verilog</b> <b class='flag-5'>HDL</b>語(yǔ)法學(xué)習(xí)筆記

    解析SN65LVDS125A和SN65LVDT125A:4x4阻塞交叉點(diǎn)開(kāi)關(guān)的卓越性能

    解析SN65LVDS125A和SN65LVDT125A:4x4阻塞交叉點(diǎn)開(kāi)關(guān)的卓越性能 在電子設(shè)計(jì)領(lǐng)域,高速信號(hào)處理和靈活的信號(hào)路由是許多應(yīng)用的關(guān)鍵需求。德州儀器(TI)的SN65LVDS125A
    的頭像 發(fā)表于 12-29 17:40 ?615次閱讀

    探索SN65LVDS125A和SN65LVDT125A:4x4阻塞交叉點(diǎn)開(kāi)關(guān)的卓越性能

    和SN65LVDT125A這兩款由德州儀器(TI)推出的4x4阻塞交叉點(diǎn)開(kāi)關(guān),憑借其出色的性能,在眾多應(yīng)用場(chǎng)景展現(xiàn)出強(qiáng)大的競(jìng)爭(zhēng)力。今天,我們就一起來(lái)深入了解這兩款器件的特點(diǎn)、應(yīng)用及相關(guān)技術(shù)細(xì)節(jié)。 文件下載
    的頭像 發(fā)表于 12-29 17:40 ?633次閱讀

    條件的執(zhí)行語(yǔ)句

    條件執(zhí)行語(yǔ)句大多在if語(yǔ)句中使用,也在使用關(guān)系運(yùn)算符(<,==,>等) 或者布爾值表達(dá)式(,!等)計(jì)算復(fù)雜表達(dá)式時(shí)使用。對(duì)于包含函數(shù)調(diào) 用的代碼片段,由于函數(shù)返回值會(huì)被
    發(fā)表于 12-12 08:25

    飛凌嵌入式ElfBoard-文件I/O的深入學(xué)習(xí)之阻塞I/O與阻塞I/O

    可能會(huì)使程序阻塞等待,直到有數(shù)據(jù)可讀時(shí)才會(huì)被喚醒返回。 普通文件的讀寫(xiě)操作是不會(huì)阻塞的,不管讀寫(xiě)多少個(gè)字節(jié)數(shù)據(jù),read或 write一定會(huì)在有限的時(shí)間內(nèi)返回,所以普通文件一定是以阻塞
    發(fā)表于 12-01 13:07

    如何利用Verilog HDL在FPGA上實(shí)現(xiàn)SRAM的讀寫(xiě)測(cè)試

    本篇將詳細(xì)介紹如何利用Verilog HDL在FPGA上實(shí)現(xiàn)SRAM的讀寫(xiě)測(cè)試。SRAM是一種非易失性存儲(chǔ)器,具有高速讀取和寫(xiě)入的特點(diǎn)。在FPGA實(shí)現(xiàn)SRAM讀寫(xiě)測(cè)試,包括設(shè)計(jì)SRAM接口模塊
    的頭像 發(fā)表于 10-22 17:21 ?4369次閱讀
    如何利用<b class='flag-5'>Verilog</b> <b class='flag-5'>HDL</b>在FPGA上實(shí)現(xiàn)SRAM的讀寫(xiě)測(cè)試

    CH32V307 串口發(fā)送阻塞的原因?怎么解決?

    */ modbus_set_rx_mode(master); modbus發(fā)送,不知為何阻塞在rt_device_write,初始化 find open 正常
    發(fā)表于 09-18 06:06

    人工智能行業(yè)如何使用for循環(huán)語(yǔ)句進(jìn)行循環(huán)

    : 支持range()函數(shù)生成數(shù)字序列 可結(jié)合else語(yǔ)句使用 Java的for循環(huán): 傳統(tǒng)結(jié)構(gòu):for(初始化; 條件; 增量) 增強(qiáng)for循環(huán):for(類(lèi)型 變量 : 集合) 主要用于數(shù)組和集合
    的頭像 發(fā)表于 09-10 12:55 ?577次閱讀

    Unicore標(biāo)準(zhǔn)NEMA語(yǔ)句GSA及說(shuō)明

    本文介紹和芯星通的NEMA語(yǔ)句說(shuō)明。
    的頭像 發(fā)表于 07-16 11:39 ?694次閱讀
    Unicore標(biāo)準(zhǔn)NEMA<b class='flag-5'>語(yǔ)句</b>GSA及說(shuō)明

    基礎(chǔ)篇3:掌握Python的條件語(yǔ)句與循環(huán)

    在Python編程語(yǔ)言中,條件語(yǔ)句和循環(huán)是構(gòu)成復(fù)雜邏輯和數(shù)據(jù)處理的基石。本篇基礎(chǔ)教程將幫助您深入了解Python的條件語(yǔ)句和循環(huán)結(jié)構(gòu),讓您能夠更好地控制程序流程。 條件語(yǔ)句 條件
    發(fā)表于 07-03 16:13

    詳解TIA Portal SCL編程語(yǔ)言中的IF語(yǔ)句

    IF 語(yǔ)句是編程中最基本和最重要的控制結(jié)構(gòu)之一,它的主要作用是根據(jù)條件決定程序的執(zhí)行路徑,IF 語(yǔ)句是編程實(shí)現(xiàn)邏輯判斷和決策的基礎(chǔ)。
    的頭像 發(fā)表于 05-24 15:01 ?1900次閱讀
    詳解TIA Portal SCL編程語(yǔ)言中的IF<b class='flag-5'>語(yǔ)句</b>

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

    本文詳細(xì)闡述了在一個(gè)testbench,應(yīng)該如何使用阻塞賦值與阻塞賦值。首先說(shuō)結(jié)論,建議在testbench,對(duì)時(shí)鐘信號(hào)(包括分頻時(shí)鐘
    的頭像 發(fā)表于 04-15 09:34 ?1218次閱讀
    在testbench<b class='flag-5'>中</b>如何使用<b class='flag-5'>阻塞</b>賦值和<b class='flag-5'>非</b><b class='flag-5'>阻塞</b>賦值

    在S32DS上使用JLINK調(diào)試S32K341,被阻塞了,怎么處理?

    我正在嘗試使用 S32K341 在新板上刷寫(xiě)程序,但在 S32K3X4EVB 上運(yùn)行并為 S32K341配置的相同代碼出現(xiàn)錯(cuò)誤。具體來(lái)說(shuō),當(dāng)我使用 S32DS 的 J-Link 探針運(yùn)行調(diào)試時(shí),它在此地址被阻塞,并且不會(huì)將其閃存到內(nèi)存。有人遇到同樣的問(wèn)題或可以幫助我嗎?
    發(fā)表于 04-03 08:13

    FPGA Verilog HDL語(yǔ)法之編譯預(yù)處理

    語(yǔ)句)。Verilog HDL編譯系統(tǒng)通常先對(duì)這些特殊的命令進(jìn)行“預(yù)處理”,然后將預(yù)處理的結(jié)果和源程序一起在進(jìn)行通常的編譯處理。
    的頭像 發(fā)表于 03-27 13:30 ?1454次閱讀
    FPGA <b class='flag-5'>Verilog</b> <b class='flag-5'>HDL</b>語(yǔ)法之編譯預(yù)處理

    一文詳解Verilog HDL

    Verilog HDL(Hardware Description Language)是一種硬件描述語(yǔ)言,用于從算法級(jí)、門(mén)級(jí)到開(kāi)關(guān)級(jí)的多種抽象設(shè)計(jì)層次的數(shù)字系統(tǒng)建?!,F(xiàn)實(shí)生活多用于專(zhuān)用集成電路
    的頭像 發(fā)表于 03-17 15:17 ?4317次閱讀
    一文詳解<b class='flag-5'>Verilog</b> <b class='flag-5'>HDL</b>