簡介
塊語句通常用來將兩條或多條語句組合在一起,使其在格式上看更像一條語句。塊語句有兩種,一種是begin—end語句,通常用來標識順序執行的語句,用它來標識的塊稱為順序塊,一種是fork—join語句,通常用來標識並行執行的語句,用它來標識的塊稱為並行塊。
而在Java語言中,塊語句也稱複合語句,是用(花括弧{})括起來的語句集合。
順序塊
特點
順序塊有以下特點:
●塊內的語句是按順序執行的,即只有上面一條語句執行完後下面的語句才能執行。
●每條語句的延遲時間是相對於前一條語句的仿真時間而言的。
●直到最後一條語句執行完,程式流程控制才跳出該語句塊。
順序塊的格式如下:begin
語句1;
語句2;
語句n;end或begin:塊名
塊內聲明語句
語句1;
語句2,
;
語句n;end
其中:
●塊名即該塊的名字,一個標識名,其作用後面再詳細介紹。
●塊內聲明語句可以是參數聲明語句、reg型變數聲明語句、integer型變數聲明語句和real型變數聲明語句。
實例
下面是一個實例:
parameter d=50; //聲明d是一個參數
reg[7:0] r; //聲明r是一個8位的暫存器變數
begin //由一系列延遲產生的波形
#dr=’h35;
#dr=’hE2;
#dr=’h00;
#dr=’hF7;
#d—>end—wave; //觸發事件end—wave
end
這個例子中用順序塊和延遲控制組合來產生一個時序波形。
並行塊
特點
並行塊有以下4個特點:
(1)塊內語句是同時執行的,即程式流程控制一進人到該並行塊,塊內語句則開始同時並行地執行。.
(2)塊內每條語句的延遲時間是相對於程式流程控制進入到塊內的仿真時間的。
(3)延遲時間是用來給賦值語句提供執行時序的。
(4)當按時間時序排序在最後的語句執行完後,或一個disable語句執行時,程式流程控制跳出該程式塊。並行塊的格式如下:
fork
語句1;
語句2;
:
語句n;或fork:塊名塊內聲明語句
語句1;
語句2;
:語句n;
其中:
●塊名即該塊的名字,一個標識名
●塊內聲明語句可以是參數聲明語句、reg型變數聲明語句、integer型變數聲明語句、real型變數聲明語句、time型變數聲明語句和event型變數聲明語句。
實例
下面舉例說明:
fork
#50r = ’h35;
#100r = ’hE2;
#150r = ’h00;
#200r = ’ hF7;
#250—>end_wave;//觸發事件end_wave
join
在這個例子中用並行塊替代了前面例子中的順序塊來產生波形,用這兩種方法生成的波形是一樣的。
塊名
在Verilg HDL語言中,可以給每個塊取一個名字,只需將名字加在關鍵字begin或fork後面即可。這樣做的原因有以下幾點:
1)可以在塊內定義局部變數,即只在塊內使用的變數。
2)可以允許塊被其他語句調用,如disable語句。
3)在Verilog語言裡,所有的變數都是靜態的,即所有的變數都只有一個惟一的存儲地址,因此進入或跳出塊並不影響存儲在變數內的值。
基於以上原因,塊名就提供了一個在任何仿真時刻確認變數值的方法。
起始時間和結束時間
在並行塊和順序塊中都有一個起始時間和結束時間的概念。對於順序塊,起始時間就是第一條語句開始被執行的時間,結束時間就是最後一條語句執行完的時間。而對於並行塊來說,起始時間對於塊內所有的語句是相同的,即程式流程控制進入該塊的時間,其結束時間是按時間排序在最後的語句執行結束的時間。
當一個塊嵌入另一個塊時,塊的起始時間和結束時間是很重要的。至於跟在塊後面的語句只有在該塊的結束時間到了才能開始執行,也就是說,只有該塊完全執行完後,後面的語句才可以執行。
在fork—join塊內,各條語句不必按順序給出,因此在並行塊里,各條語句在前還是在後是無關緊要的。
fork
#250–>end_wave;
#200r = ’hF7;
#150r = ’h00;
#100r = ’hE2;
#50 r = ’h35;
join
在這個例子中,各條語句並不是按被執行的先後順序給出的,但同樣可以生成前面例子中的波形。