always
always語句塊從仿真0時刻開始執行其中的行為語句;最后一條執行完成后,再開始執行其中的第一條語句,如此往復循環,直到整個仿真結束。因此,always語句塊常用於對數字電路中一組反復執行的活動進行建模。
always 和 always@(*) 的區別
- 有@時,是每次執行語句時,必須滿足括號內的條件才能繼續執行語句,否則不執行。
- always@(敏感事件列表) 用於描述時序邏輯;敏感事件(上升沿 posedge、下降沿 negedge);或電平。
- verilog規定,always@()中的是指該always塊內的所有輸入信號的變化為敏感列表,也就是仿真時只有當always@(*)塊內的輸入信號產生變化,該塊內描述的信號才會產生變化。
- 若沒有@,則是一般在teastbench 中產生時鍾信號,指不會滿足特定的條件,執行完一次后立馬繼續執行下一次,一直重復執行。
always #10 CLK=~CLK; - 有@時,是每次執行語句時,必須滿足括號內的條件才能繼續執行語句,否則不執行。
3種模式
always@()語句的意思是always模塊中的任何一個輸入信號或電平發生變化時,該語句下方的模塊將被執行。
1、always語句有兩種觸發方式。第一種是電平觸發,例如always @(a or b or c),a、b、c均為變量,當其中一個發生變化時,下方的語句將被執行。
2、第二種是沿觸發,例如always @(posedge clk or negedge rstn),即當時鍾處在上升沿或下降沿時,語句被執行。
3、而對於always@(),意思是以上兩種觸發方式都包含在內,任意一種發生變化都會觸發該語句。
補充initial
Verilog語言中的兩種過程:always過程和initial過程(執行一次)。
補充assign
assign 用於描述組合邏輯,所有的assign 和 always 塊都是並行發生。
