Verilog中的任何過程都可以屬於以下四種結構的說明語句;
1) initial; 2) always; 3) task; 4) function;
1) initial說明語句;
一個程序中的 initial 和 always 的次數是不受限制的,他們都是在仿真的一開始同時開始運行的。initial 只執行一次,而 always語句則是不斷地重複活動,直到仿真活動結束、但是always 後面的過程快是否運行,則要看他的觸發條件是否滿足,滿足則運行一次,再滿足再運行,直至仿真結束。
格式:
initial
begin
語句1;
語句2;
...
語句n;
end
一個模塊中可以有多個initial塊,他們都是並行運行的。 initial 塊常用於測試文件和虛擬模塊的編寫,用來產生仿真測試信號和設置信號記錄等仿真環境。
2)always說明語句
其聲明格式如下:
always <時序控制> <語句>
如果always沒有時序控制,則會產生仿真器的死鎖。 如:always areg=~areg;這將產生0延遲的無限循環跳變過程,這時發生仿真死鎖。
always 的時序控制可以是邊沿觸發也可以是電平觸發,可以單個信號亦可以十多個信號,中間用關鍵詞or鏈接。
A) always @(posedge clock or posedge reset)
begin
....
end
B) always @(posedge clock or posedge reset)
begin
....
end
上述中,A是由兩個邊沿觸發的always只要其中一個沿出現,就立即執行一次過程塊。B是有a b c 三個信號電平觸發的,只要a b c 中任何一個發生變化,從高到低或從低到高都會執行過程塊。
邊沿觸發的always 塊常常描述時序行爲,如有限狀態機,通常對應於寄存器組和門級組合邏輯的結構。而電平觸發的always塊常常用來描述組合邏輯的行爲。
在always語句中,由關鍵詞or 鏈接的多個事件名或者信號名組成的列表稱爲敏感列表。用關鍵詞or或者','表示這種關係。如果輸入的邏輯變量較多,那麼編寫敏感列表會很繁瑣而且容易出錯。針對這種情況,Verilog中可以用@* 和 @(*),他們表示對後面語句塊中所有的輸入變量的變化是敏感的。
電平敏感的時序控制:
Verilog用關鍵字wait 來表示等待電平敏感的條件爲真:
如: always
wait (count_enabal) #20 count = count+1;
這個例子中,仿真器連續見識count_enable的值,其值爲0,則不執行後面語句。如果其值爲1,則20個單位後執行這個語句,如果count_enable始終爲1,那麼count每20個單位時間+1。
在always中,被賦值的只能是寄存器類型的變量,如reg,integer, real, time, realtime.等