Verilog中的阻塞賦值和非阻塞賦值

2021-08-11 14:15:50 字數 1522 閱讀 7223

verilog中阻塞賦值和非阻塞賦值的異同:

一  阻塞賦值

操作符「 = 」

把賦值運算看做

lhs = rhs

在阻塞賦值時,先計算等號右手方向(rhs)的值,這時候賦值語句不允許別的verilog語句的干擾,直到現行的賦值過程完成,即將rhs計算得到的值賦給lhs(左手方向),然後才允許別的語句執行。

從理論上來說,阻塞賦值的過程雖然分先後(先rhs後lhs),但是確實是一步完成,中間不能有延遲(即使是零延遲也不行),計算rhs和對lhs賦值,只有概念上的先後,沒有實質上的延遲。

如果加了延遲,這種verilog**不能被綜合。

如果乙個過程塊中的rhs變數恰好是另乙個過程塊的lhs變數,且兩個過程塊是用同乙個時鐘沿觸發的,則可能引起競爭。怎麼理解呢?

如果這兩個過程塊是用同乙個時鐘沿觸發的,賦值操作都是一步完成,但是不一定哪乙個先完成,如下:

always @(posedge clock)

begin alw1

a = b;

endalways @(posedge clock)

begin alw2

b=c;

end

如果alw1的時鐘沿先到,那麼其中的賦值語句一步執行完成,則a的值是b,如果alw2先執行完成,則a的值是c,兩個賦值語句是序列執行的

二 非阻塞賦值

操作符號: 「 <= 」

分成兩步:

(1)在賦值開始的時刻,計算非阻塞賦值rhs的表示式

(2)在賦值結束的時刻,更新非阻塞賦值lhs的表示式

在計算非阻塞賦值rhs 和更新lhs期間,允許其他的verilog語句執行

alway @(posedge clock or posedge rst)

if(rst) y1<=0; //預置值

else y1<=yu2;

always @(posedge clock or posedge rst)

if(rst) y2<=1; // 預置值

else y2<=y1;

非阻塞賦值語句執行時,不影響其他verilog語句的執行,

rst置位訊號由1到0後,y1為0,y2為1,當下乙個時鐘上公升沿到來時,無論哪個always塊的時鐘上公升沿先到幾個皮秒,第一步計算rhs,y1為0,y2為1,是確定的,所以第二步對lhs賦值時y1和y2的值都是確定的,由rst置位或者上乙個時鐘上公升沿確定的值。在使用者看,這兩個賦值語句是並行執行的。

Verilog阻塞賦值和非阻塞賦值個人理解

為 module block a,b,l1,l2,l3,l4,clk input a,b input clk output reg l1,l2,l3,l4 always posedge clk begin l1 a l2 l1 endalways posedge clk begin l3 a l4 ...

verilog中的阻塞賦值與非阻塞賦值詳解

網上看到的覺得不錯分享下 組合邏輯的always模組中使用阻塞賦值 時序邏輯的always模組中使用非阻塞賦值 可以這樣理解,組合中計算馬上賦值,時序邏輯中上公升沿計算,下降沿賦值關鍵是組合邏輯中是實時變化的,而時序邏輯中乙個cycle才變化一次 比如 always a or b begin c a...

阻塞賦值和非阻塞賦值

阻塞賦值 阻塞賦值操作符用等號 即 表示。為什麼稱這種賦值為阻塞賦值呢?這是因為在賦值時先計算等號右手方向 rhs 部分的值,這時賦值語句不允許任何別的verilog 語句的干擾,直到現行的賦值完成時刻,即把rhs 賦值給 lhs 的時刻,它才允許別的賦值語句的執行。一般可綜合的阻塞賦值操作在rhs...