[TOC]
Verilog Blocking and Nonblocking Assignment
阻塞式賦值(Blocking Assignment)
阻塞式賦值用法示例(使用=
)
a = b + c;
a = #10 b + c; // 延遲10個(gè)時(shí)間單位
理解
和普通的C語(yǔ)言一樣。
- 計(jì)算右邊表達(dá)式的值
- 若有延時(shí)則延時(shí)
- 賦值給左部
- 繼續(xù)執(zhí)行下面的語(yǔ)句
非阻塞式賦值(Nonblocking Assignment)
非阻塞式賦值用法示例(使用<=
)
always @(posedge clk) begin
a <= b; // line a
b <= a; // line b
end
理解
- 計(jì)算右邊表達(dá)式的值,但是不賦值給左部戈稿,值被暫存(cached)力图,左部的值不發(fā)生改變送火。即實(shí)際上的賦值行為還沒有發(fā)生屡萤。
- 于此同時(shí)(這個(gè)同時(shí)可以從這條非阻塞語(yǔ)句開始執(zhí)行時(shí)算)姻氨,別的verilog語(yǔ)句也可以執(zhí)行。 對(duì)于別的語(yǔ)句來說缕溉,仿佛這條非阻塞語(yǔ)句壓根不存在似的考传。所以稱作非阻塞的。
ps.對(duì)于暫存倒淫,不要想存在哪里的問題伙菊,沒必要了解。因?yàn)閂erilog是硬件描述語(yǔ)言敌土,這個(gè)是為了描述一些硬件中數(shù)據(jù)變化之類的行為镜硕。
那么,左邊的值什么時(shí)候發(fā)生改變返干,即賦值行為什么時(shí)候發(fā)生呢兴枯?
答案是直到碰到一條阻塞式語(yǔ)句。
對(duì)于上面這個(gè)例子矩欠,alwasy的語(yǔ)句塊是在時(shí)鐘信號(hào)clk的上升沿時(shí)會(huì)執(zhí)行财剖。執(zhí)行:
- line a執(zhí)行(a值不變,賦值行為不發(fā)生)癌淮;
- 同時(shí)躺坟,line b也執(zhí)行(b也不變,同時(shí)a還是不變)乳蓄;
因?yàn)閘ine b的語(yǔ)句對(duì)于line a的語(yǔ)句來講就是別的語(yǔ)句咪橙。所以line a執(zhí)行時(shí)line b也可以執(zhí)行。
最終表現(xiàn)出來就是執(zhí)行完畢之后a,b都沒變虚倒,仿佛沒有這兩條語(yǔ)句一般美侦。
那么對(duì)于這個(gè)例子什么時(shí)候會(huì)變呢?
當(dāng)下一次時(shí)鐘信號(hào)clk上升沿時(shí),在執(zhí)行這個(gè)always的語(yǔ)句塊時(shí)魂奥,賦值行為會(huì)發(fā)生(a,b的值發(fā)生改變)菠剩。于是最終表現(xiàn)出來的總效果就是每當(dāng)?shù)竭_(dá)時(shí)鐘上升沿時(shí),a與b的值就會(huì)發(fā)生交換耻煤。
帶延遲的非阻塞賦值語(yǔ)句用法示例
always @(*)
a <= #10 b + c;
帶延遲的非阻塞語(yǔ)句通常用于實(shí)現(xiàn)傳輸延遲具壮。比如下面的波形圖。
波形圖