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

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


一  阻塞賦值

操作符  “ = ”

把賦值運算看做

LHS = RHS

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

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

如果加了延遲,這種Verilog代碼不能被綜合。

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

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

always @(posedge clock)
 begin alw1
  a = b;
 end

always @(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置位或者上一個時鐘上升沿確定的值。在用戶看,這兩個賦值語句是並行執行的。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章