Verilog 阻塞賦值與非阻塞賦值 Blocking assignment和NonBlocking assignment

[TOC]

Verilog Blocking and Nonblocking Assignment

官方文檔原文傳送門 https://www.verilogams.com/refman/modules/discrete-procedural/assignment.html?highlight=assign

阻塞式賦值(Blocking Assignment)

阻塞式賦值用法示例(使用=

a = b + c;
a = #10 b + c; // 延遲10個(gè)時(shí)間單位

理解

和普通的C語言一樣。

  1. 計(jì)算右邊表達(dá)式的值
  2. 若有延時(shí)則延時(shí)
  3. 賦值給左部
  4. 繼續(xù)執(zhí)行下面的語句

非阻塞式賦值(Nonblocking Assignment)

非阻塞式賦值用法示例(使用<=

always @(posedge clk) begin
   a <= b; // line a
   b <= a; // line b
end

理解

  1. 計(jì)算右邊表達(dá)式的值,但是不賦值給左部,值被暫存(cached),左部的值不發(fā)生改變。即實(shí)際上的賦值行為還沒有發(fā)生。
  2. 于此同時(shí)(這個(gè)同時(shí)可以從這條非阻塞語句開始執(zhí)行時(shí)算),別的verilog語句也可以執(zhí)行。 對(duì)于別的語句來說,仿佛這條非阻塞語句壓根不存在似的。所以稱作非阻塞的。

ps.對(duì)于暫存,不要想存在哪里的問題,沒必要了解。因?yàn)閂erilog是硬件描述語言,這個(gè)是為了描述一些硬件中數(shù)據(jù)變化之類的行為。


那么,左邊的值什么時(shí)候發(fā)生改變,即賦值行為什么時(shí)候發(fā)生呢?
答案是直到碰到一條阻塞式語句。
對(duì)于上面這個(gè)例子,alwasy的語句塊是在時(shí)鐘信號(hào)clk的上升沿時(shí)會(huì)執(zhí)行。執(zhí)行:

  1. line a執(zhí)行(a值不變,賦值行為不發(fā)生);
  2. 同時(shí),line b也執(zhí)行(b也不變,同時(shí)a還是不變);

因?yàn)閘ine b的語句對(duì)于line a的語句來講就是別的語句。所以line a執(zhí)行時(shí)line b也可以執(zhí)行。

最終表現(xiàn)出來就是執(zhí)行完畢之后a,b都沒變,仿佛沒有這兩條語句一般。
那么對(duì)于這個(gè)例子什么時(shí)候會(huì)變呢?
當(dāng)下一次時(shí)鐘信號(hào)clk上升沿時(shí),在執(zhí)行這個(gè)always的語句塊時(shí),賦值行為會(huì)發(fā)生(a,b的值發(fā)生改變)。于是最終表現(xiàn)出來的總效果就是每當(dāng)?shù)竭_(dá)時(shí)鐘上升沿時(shí),a與b的值就會(huì)發(fā)生交換。

帶延遲的非阻塞賦值語句用法示例

always @(*)
    a <= #10 b + c;

帶延遲的非阻塞語句通常用于實(shí)現(xiàn)傳輸延遲。比如下面的波形圖。


波形圖
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容