always語句總是循環執行,或者說此語句重復執行。
只有寄存器類型數據能夠在這種語句中被賦值。寄存器類型數據在被賦新值前保持原有值不變。所有的初始化語句和always語句在0時刻並發執行。

下例為always語句對1位全加器電路建模的示例,如圖2-4。
- module FA_Seq(A,B,Cin,Sum,Cout);
- input A,B,Cin;
- output Sum,Cout;
- reg Sum,Cout;
- reg T1,T2,T3;
- always @(A or B or Cin) begin
- Sum = (A^B)^Cin;
- T1 = A & Cin;
- T2 = B & Cin;
- T3 = A & B;
- Cout=(T1 | T2) | T3;
- end
- endmodule
模塊FA_Seq有三個輸入和兩個輸出。由於Sum、Cout、T1、T2和T3在always語句中被賦值,它們被說明為reg類型(reg是寄存器數據類型的一種)。
always語句中有一個與事件控制(緊跟在字符@后面的表達式)。相關聯的順序過程(begin-end對)。這意味着只要A、B或Cin上發生事件,即A、B或Cin之一的值發生變化,順序過程就執行。在順序過程中的語句順序執行,並且在順序過程執行結束后被掛起。順序過程執行完成后,always語句再次等待A、B或Cin上發生的事件。
在順序過程中出現的語句是過程賦值模塊化的實例。模塊化過程賦值在下一條語句執行前完成執行。過程賦值可以有一個可選的時延。
時延可以細分為兩種類型:
1)語句間時延:這是時延語句執行的時延。
2)語句內時延:這是右邊表達式數值計算與左邊表達式賦值間的時延。
下面是語句間時延的示例:
- Sum=(A^B)^Cin;
- #4T1=A&Cin;
在第二條語句中的時延規定賦值延遲4個時間單位執行。就是說,在第一條語句執行后等待4個時間單位,然后執行第二條語句。下面是語句內時延的示例。
- Sum=#3(A^B)^Cin;
這個賦值中的時延意味着首先計算右邊表達式的值,等待3個時間單位,然后賦值給Sum。
