在上一篇博文中 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