verilog中always塊延時總結


  在上一篇博文中 verilog中連續性賦值中的延時中對assign的延時做了討論,現在對always塊中的延時做一個討論。

觀測下面的程序,@0時刻,輸入的數據分別是0x13,0x14 。

        @2時刻,輸入數據分別是0x14,,0x14 。

        四個輸出應該是什么樣子呢?

 1 always @ (iDat1 or iDat2)
 2 #5 oDat_1 = iDat1 + iDat2;
 3 
 4 always @ (iDat1 or iDat2)
 5 oDat_2 = #5 iDat1 + iDat2;        
 6 
 7 always @ (iDat1 or iDat2)
 8 #5 oDat_3 <= iDat1 + iDat2;        
 9 
10 always @(iDat1 or iDat2)
11 oDat_4 <= #5 iDat1 + iDat2;

 

直接上圖吧

 

作為阻塞性賦值語句,延時放在前面,就是先延時,再取值賦值。所以oData_1延時之后取了新值。

延時放在后面,就是先取值,再延時賦值。oData_2 是先取了舊值,再延時賦值,中間如果等號右邊有變化,被阻塞了。所以oData_2是舊值 。

1 always @ (iDat1 or iDat2)
2 #5 oDat_1 = iDat1 + iDat2;
3 
4 always @ (iDat1 or iDat2)
5 oDat_2 = #5 iDat1 + iDat2;

 

作為非阻塞性賦值語句,延時放在前面,就是先延時,再取值賦值。所以oData_3延時之后取了新值。

延時放在后面,就是先取值,再延時賦值。oData_4 是先取了舊值,再延時賦值,中間如果等號右邊有變化,沒有被阻塞,新建event,所以oData_2是舊值之后再更新為新值 。

1 always @ (iDat1 or iDat2)
2 #5 oDat_3 <= iDat1 + iDat2;        
3 
4 always @(iDat1 or iDat2)
5 oDat_4 <= #5 iDat1 + iDat2;

 

所以,這以后寫TB的時候要慎重啊。

 

 

歡迎加入: FPGA廣東交流群:162664354

      FPGA開發者聯盟: 485678884


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM