任務與函數結構
verilog HDL語言引入任務與函數兩種模塊化程序的描述方式,使之便於理解和調試另外簡化了程序的結構,增強了代碼的易讀性。任務和函數一般用於行為建模,編寫驗證程序(Test Bench)
1.任務
任務(task)類似於一般的編程語言中的過程(process),它可以從程序的不同位置執行共同的代碼,通常把需要共用的代碼段定義為任務,然后通過調用任務來使用它。在任務中可以包含時序控制等,還可以調用其他的任務和函數。任務的使用包括任務定義
和任務調用。
在進行任務定義時,必須注意以下幾點:
(1)任務定義結構不能出現在任何一個過程塊的內部;
(2)和模塊定義不一樣,在第一行"task"語句中不能列出端口名列表;
(3)一個任務可以沒有輸入輸出端口;
(4)一個任務可以沒有返回值,也可以通過輸出端口或雙向端口返回一個或多個值;
(5)除任務參數外,任務還能夠引用說明任務所在的模塊中定義的任何變量。
任務調用:
一個任務由任務調用語句調用,任務調用語句給出傳入任務的參數值和接收結果的變量值,其語法為
<任務名> (端口1,端口2,...,端口n) ;
在進行任務調用時,必須注意下面幾點:
(1)任務調用語句是過程性語句,因此只能出現在always過程塊和initial過程塊;
(2)任務調用語句中參數列表必須與任務定義時的輸入、輸出和雙向端口參數說明的順序相匹配;
(3)進行任務調用時,參數要按值傳遞,而不能按地址傳遞(這一點與其他高級語言不同);
(4)由於任務調用語句是過程性語句,因此任務調用的輸入與輸出參數必須是寄存器類型;
(5)一個任務中可以直接訪問上一級調用模塊中的任何寄存器;
(6)可以使用disable語句來中斷任務的執行,在任務被中斷后,程序流程將返回到調用任務的地方繼續往下執行。
2.函數
函數(function)同任務一樣,也可以在模塊的不同位置執行共同的代碼。函數與任務的差別在於
(1)函數只能返回一個值,而任務卻可以有多個或者沒有返回值;
(2)一個任務塊可以包含時間控制結構,而函數塊則沒有,也就是說函數塊從零仿真時刻開始執行,結束后立即返回(相當於組合邏輯);
(3)一個任務塊就可以有也可以沒有輸入和輸出,而函數必須有一個輸入,而沒有任何輸出:
(4)任務塊的觸發是通過一條語句來實現,而函數塊只有當它在一個表達式中被引用時才會生效
(5)在一個函數內可以調用其他的函數,但是不可以調用其他任務,而在任務中則可以調用其他的函數和任務。