国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

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

3天內不再提示

簡述Verilog HDL中阻塞語句和非阻塞語句的區別

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

掃碼添加小助手

加入工程師交流群

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

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

也就是說:

阻塞:在本語句中“右式計算”和“左式更新”完全完成之后,才開始執行下一條語句;
非阻塞:當前語句的執行不會阻塞下一語句的執行。

下面給出實例來說明:

給出相應的案例來幫助理解:

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

這個目的是為了展示非阻塞賦值過程中的時序變化,對應的RTL電路圖和仿真波形如下圖:

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

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

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

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

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

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

下面我們來看看兩者代碼之間到底是怎么運行的。

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

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

always語句塊對Clk的上升沿敏感,當發生Clk 0~1的跳變時,執行該always語句。

在begin...end語句塊中所有語句是順序執行的,而且最關鍵的是,阻塞賦值是在本語句中“右式計算”和“左式更新”完全完成之后,才開始執行下一條語句的。

在本例中,in的值賦給m以后,再執行n = m;同樣在n的值更新以后,才執行c = n。這樣,最終的計算結果就是in = c。也就是說時鐘上升沿到來的時候,整個語句塊執行完后,in,m,n,c的值都是一樣的,這也就是我們前面說的,in變化之后,m,n,c都跟著變化。所有的語句執行完以后,該always語句等待Clk的上升沿,從而再一次觸發begin...end語句。

總結

完成阻塞賦值的過程為:首先計算等號右邊表達式的結果;接著這個結果存入仿真系統的內部臨時寄存器中,這個寄存器也稱為賦值事件隊列和調度的臨時寄存器。如果賦值時沒有延遲信息,則這個事件立即被調度執行。

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

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

首先執行e <= in,產生一個更新事件,將in的當前值賦給e,但是這個賦值過程并沒有立刻執行,而是在事件隊列中處于等待狀態。

然后執行f <= e,同樣產生一個更新事件,將e的當前值(注意上一語句中將in值賦給e的過程并沒有完成,e還是舊值)賦給f,這個賦值事件也將在事件隊列中處于等待狀態。

再執行b <= f,產生一個更新事件,將f的當前值賦給b,這個賦值事件也將在事件隊列中等待執行。

這時always語句塊執行完成,開始對下一個Clk上升沿敏感。也就是說,使用非阻塞賦值方式進行賦值時,各個賦值語句同步執行;因此,通常在一個時鐘沿對臨時變量進行賦值,而在另一個時鐘沿對其進行采樣。

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

注:

*仿真器首先按照仿真時間對事件進行排序,然后再在當前仿真時間里按照事件的優先級順序進行排序。

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

總結 :

非阻塞語句的執行過程為:首先,它會把非阻塞賦值放入調度隊列中;接著,仿真工具開始執行下一條語句而不等待當前這條語句執行完畢。也就是說,先計算出等號右邊表達式的結果,再把這個結果的賦值操作保存在事件隊列中,等輪到事件被調度的時候,把這個結果賦值給等號左邊。如果沒有指定等號右邊的延遲,賦值的操作會發生在當前時間單位的最后時刻。

知道了阻塞賦值和非阻塞賦值的區別之后,大家肯定就會關心什么時候該用阻塞賦值什么時候該用非阻塞賦值,下面我簡單的說幾句:

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


希望大家在懂得了阻塞和非阻塞語句的區別之后,能夠很好的在自己的項目中靈活地運用,這也是大家面試的時候,必須會面對的一個問題,希望大家能夠掌握

編輯:jq


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

    關注

    30

    文章

    1373

    瀏覽量

    114452
  • HDL
    HDL
    +關注

    關注

    8

    文章

    331

    瀏覽量

    48937
  • 阻塞
    +關注

    關注

    0

    文章

    24

    瀏覽量

    8424

原文標題:Verilog HDL中阻塞語句和非阻塞語句的區別

文章出處:【微信號:gh_9d70b445f494,微信公眾號:FPGA設計論壇】歡迎添加關注!文章轉載請注明出處。

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    電信接收機 IF/RF 前端 SAW 濾波方案:70–300MHz 選擇性提升 + 阻塞防護 + 匹配驗證全流程(FSF-5050 系列)

    電信接收機 IF/RF 前端易受強帶外干擾引發壓縮、互調與阻塞,DSP 難補救。本方案以 SAW 濾波器為“門禁”,覆蓋 70–300MHz IF 規劃,給出放置位置、IL/阻帶/群時延取舍、匹配與 PCB 要點,并提供 VNA+阻塞測試驗證流程,適配 FSF 5×5mm
    的頭像 發表于 01-29 14:00 ?898次閱讀
    電信接收機 IF/RF 前端 SAW 濾波方案:70–300MHz 選擇性提升 + <b class='flag-5'>阻塞</b>防護 + 匹配驗證全流程(FSF-5050 系列)

    解析SN65LVDS125A和SN65LVDT125A:4x4阻塞交叉點開關的卓越性能

    解析SN65LVDS125A和SN65LVDT125A:4x4阻塞交叉點開關的卓越性能 在電子設計領域,高速信號處理和靈活的信號路由是許多應用的關鍵需求。德州儀器(TI)的SN65LVDS125A
    的頭像 發表于 12-29 17:40 ?576次閱讀

    探索SN65LVDS125A和SN65LVDT125A:4x4阻塞交叉點開關的卓越性能

    和SN65LVDT125A這兩款由德州儀器(TI)推出的4x4阻塞交叉點開關,憑借其出色的性能,在眾多應用場景展現出強大的競爭力。今天,我們就一起來深入了解這兩款器件的特點、應用及相關技術細節。 文件下載
    的頭像 發表于 12-29 17:40 ?571次閱讀

    條件的執行語句

    條件執行語句大多在if語句中使用,也在使用關系運算符(<,==,>等) 或者布爾值表達式(,!等)計算復雜表達式時使用。對于包含函數調 用的代碼片段,由于函數返回值會被
    發表于 12-12 08:25

    飛凌嵌入式ElfBoard-文件I/O的深入學習之阻塞I/O與阻塞I/O

    可能會使程序阻塞等待,直到有數據可讀時才會被喚醒返回。 普通文件的讀寫操作是不會阻塞的,不管讀寫多少個字節數據,read或 write一定會在有限的時間內返回,所以普通文件一定是以阻塞
    發表于 12-01 13:07

    如何利用Verilog HDL在FPGA上實現SRAM的讀寫測試

    本篇將詳細介紹如何利用Verilog HDL在FPGA上實現SRAM的讀寫測試。SRAM是一種非易失性存儲器,具有高速讀取和寫入的特點。在FPGA實現SRAM讀寫測試,包括設計SRAM接口模塊
    的頭像 發表于 10-22 17:21 ?4310次閱讀
    如何利用<b class='flag-5'>Verilog</b> <b class='flag-5'>HDL</b>在FPGA上實現SRAM的讀寫測試

    CH32V307 串口發送阻塞的原因?怎么解決?

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

    人工智能行業如何使用for循環語句進行循環

    : 支持range()函數生成數字序列 可結合else語句使用 Java的for循環: 傳統結構:for(初始化; 條件; 增量) 增強for循環:for(類型 變量 : 集合) 主要用于數組和集合
    的頭像 發表于 09-10 12:55 ?543次閱讀

    Unicore標準NEMA語句GSA及說明

    本文介紹和芯星通的NEMA語句說明。
    的頭像 發表于 07-16 11:39 ?650次閱讀
    Unicore標準NEMA<b class='flag-5'>語句</b>GSA及說明

    基礎篇3:掌握Python的條件語句與循環

    在Python編程語言中,條件語句和循環是構成復雜邏輯和數據處理的基石。本篇基礎教程將幫助您深入了解Python的條件語句和循環結構,讓您能夠更好地控制程序流程。 條件語句 條件
    發表于 07-03 16:13

    詳解TIA Portal SCL編程語言中的IF語句

    IF 語句是編程中最基本和最重要的控制結構之一,它的主要作用是根據條件決定程序的執行路徑,IF 語句是編程實現邏輯判斷和決策的基礎。
    的頭像 發表于 05-24 15:01 ?1832次閱讀
    詳解TIA Portal SCL編程語言中的IF<b class='flag-5'>語句</b>

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

    本文詳細闡述了在一個testbench,應該如何使用阻塞賦值與阻塞賦值。首先說結論,建議在testbench,對時鐘信號(包括分頻時鐘
    的頭像 發表于 04-15 09:34 ?1192次閱讀
    在testbench<b class='flag-5'>中</b>如何使用<b class='flag-5'>阻塞</b>賦值和<b class='flag-5'>非</b><b class='flag-5'>阻塞</b>賦值

    在S32DS上使用JLINK調試S32K341,被阻塞了,怎么處理?

    我正在嘗試使用 S32K341 在新板上刷寫程序,但在 S32K3X4EVB 上運行并為 S32K341配置的相同代碼出現錯誤。具體來說,當我使用 S32DS 的 J-Link 探針運行調試時,它在此地址被阻塞,并且不會將其閃存到內存。有人遇到同樣的問題或可以幫助我嗎?
    發表于 04-03 08:13

    FPGA Verilog HDL語法之編譯預處理

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

    一文詳解Verilog HDL

    Verilog HDL(Hardware Description Language)是一種硬件描述語言,用于從算法級、門級到開關級的多種抽象設計層次的數字系統建模。現實生活多用于專用集成電路
    的頭像 發表于 03-17 15:17 ?4219次閱讀
    一文詳解<b class='flag-5'>Verilog</b> <b class='flag-5'>HDL</b>