Verilog學習筆記基本語法篇(四)·········塊語句
http://www.cnblogs.com/SYoong/archive/2016/09/08/5852128.html
塊語句是指將兩條或者兩條以上的語句組合在一起,使其在格式上更像一條語句。塊語句分為兩種:
1)用begin_end語句,通常用來標識順序執行的語句,用它標識的塊稱作順序塊;
2)用fork_join語句,通常用來標識並行執行的語句,用它標識的塊稱作並行塊。
A)順序塊
begin
語句1;
語句2;
....
語句n;
end
begin:塊名
塊內宣告語句
語句1;
語句2;
....
語句n;
end
特點:
1)塊內的語句是按照順序執行的,即只有上面一條語句執行完後下面的語句才能執行;
2)每條語句的延遲時間都是相對於前一條語句的模擬時間而言的;
3)直到最後一條語句執行完,程式流程控制才跳出該語句塊。
在begin-end語句塊中,begin-end和fork-join塊可以相互巢狀,也可以自我巢狀。如果begin-end中包含有區域性宣告,則他必須被命名(必須有一個標誌)。如果要禁止一個begin-end塊,那麼被禁止的begin-end必須有名字。
B)並行塊
fork
語句1;
語句2;
....
語句n;
join
fork:塊名
塊內宣告語句
語句1;
語句2;
....
語句n;
join
特點:
1)塊內語句是同時執行的,即程式流程控制進入該塊時刻,塊內語句則開始同時並行執行;
2)塊內每條語句的延遲時間都是相對於程式流程進入到塊內的時刻。
3)延遲時間是用來給賦值語句提供執行時序的;
4)當按時間排序在最後的語句執行完成後,或者一個disable語句執行時,程式流程控制跳出該模組。
塊名:
1)可以在塊內定義區域性變數,即只在塊內使用的變數;
2)可以允許被其他的語句呼叫,也可以通過層次名進行呼叫;
3)在Verilog中,所有的變數都是靜態的,即所有的變數都只有一個唯一的儲存地址,因此進入或者跳出塊並不影響儲存在變數內的值。
4)命令塊可以被禁用,關鍵詞為disable,可以用disable跳出迴圈,處理錯誤條件以及根據控制訊號來控制某些程式碼是否執行。
順序塊和並行塊的性質對比
對比性質 | 順序塊 | 並行塊 |
塊內宣告語句變數型別 | parameter、reg、integer、real | parameter、reg、integer、real、time、event |
開始時間 | 第一條語句開始執行的時間 | 流程控制進入該塊的時間 |
結束時間 | 最後一條語句結束執行時間 | 按時間排在最後的語句執行結束時間 |
舉例:(程式功能相同的順序塊和並行塊)
parameter d=50;
reg [7:0] r;
begin
#d r='h35;
#d r='hE2;
#d r='h00;
#d r='hF7;
#d ->end_wave; //->表示觸發事件end_wave使其翻轉
end
(如果d=0,則這個順序塊的執行不需要時間。若d=50,則塊語句完成的時間為250,因為每個語句都要等待50個時間單位)
fork
#250 ->end_wave;
#200 r='hF7;
#150 r='h00;
#100 r='hE2;
#50 r='h35;
join
(在並行塊中,所有語句都是在程式流程進入並行塊時同時開始的,因此這個語句結束的時間為250)