簡介
Verilog HDL中提供兩種過程賦值語句initial和always語句,用這兩種語句來實現行為的建模。這兩種語句之間的執行是並行的,即語句的執行與位置順序無關。這兩種語句通常與語句塊(begin ....end)相結合,則語句塊中的執行是按順序執行的。
initial語句
initial語句只執行一次,即在設計被開始模擬執行時開始(0時刻)。通常只用在對設計進行仿真的測試檔案中,用於對一些信號進行初始化和產生特定的信號波形。
語法如下:
initial
[timing_control] procedural_statement
procedural_statement是下列語句之一:
procedural_assignment (blocking or non-blocking ) / /阻塞或非阻塞性過程賦值語句/ /
procedural_continuous_assignment
conditional_statement
case_statement
loop_statement
wait_statement
disable_statement
event_trigger
task_enable (user or system)
事例如上產生一個信號波形:
initial
begin
#2 Stream = 1;
#5 Stream = 0;
#3 Stream = 1;
#4 Stream = 0;
#2 Stream = 1;
#5 Stream = 0;
end
always語句
always語句與initial語句相反,是被重複執行,執行機制是通過對一個稱為敏感變數表的事件驅動來實現的。always語句可實現組合邏輯或時序邏輯的建模。
方波
initial
Clk = 0;
always
#5 Clk = ~Clk;
因為always語句是重複執行的,因此,Clk是初始值為0的,周期為10的方波。
D觸發器
always @ ( posedge Clk or posedge Rst )
begin
if Rst
Q <= ‘ b 0;
else
Q <= D;
上面括弧內的內容稱為敏感變數,即整個always語句當敏感變數有變化時被執行,否則不執行。因此,當Rst為1時,Q被復位,在時鐘上升沿時,D被採樣到Q。有@的用來描述一個時序器件。
2選一分配器
always @( sel,a,b)
C = sel ? a:b;
這裡的sel,a,b同樣稱為敏感變數,當三者之一有變化時,always被執行,當sel為1,C被賦值為a,否則為b。描述的是一個組合邏輯mux器件。
特點
對組合邏輯的always語句,敏感變數必須寫全,敏感變數是指等式右邊出現的所有標識符。如上的a,b和條件表達式中出現的所以標識符如上例3的sel。
對組合邏輯器件的賦值採用阻塞賦值“=”
時序邏輯器件的賦值語句採用非阻塞賦值“<=”,如上的Q〈= D;
語法上,沒有關鍵字“assign”;
左側被賦值的數據類型必須是暫存器類型的變數(reg);
過程性連續賦值語句只能出現在過程塊中;
過程性連續賦值語句主要用來對時序邏輯電路進行行為描述;
在過程賦值語句的情況下,只有在過程賦值語句被執行時才執行賦值操作,語句執行完後被賦值變數的取值不再受到賦值表達式的影響;
行為建模
Verilog模型可以是實際電路不同級別的抽象,因此有多種不同的建模方法。其中最常用的建模方法有以下三種:
1)門級結構建模
2)行為描述建模
3)數據流建模
行為建模方式是通過對設計的行為的描述來實現對設計建模,一般是指用過程賦值語句(initial語句和always語句)來設計的稱為行為建模。
行為建模主要用initial和always語句,這些語句相互並行執行,,都在0時刻開始執行,與語句出現的順序無關,是通過對設計的行為的描述來實現對設計建模,一般是指用過程賦值語句(initial語句和always語句)來設計的稱為行為建模。
與連續賦值區別
●連續賦值用於數據流行為建模,多用於
組合邏輯電路,過程賦值用於順序行為建模,用於順序行為建模。
●連續賦值等號右邊運算元發生變化就需要執行(上電便一直執行),而過程性賦值語句只是執行一次,注意我這裡的一次是指:在initial塊中,過程性賦值只順序執行一次,而在always塊中,每一次滿足always的條件時,都要順序執行一次該 always塊中的語句。連續賦值適用於線網,過程賦值適用於暫存器。