天天看點

Verilog中的任務和函數

任務和函數的共同點

1.任務和函數必須在子產品内定義,其作用範圍僅适用于該子產品,可以在子產品内多次調用。

2.任務和函數中可以聲明局部變量,如寄存器,時間,整數,實數和事件,但是不能聲明線網類型的變量。

3.任務和函數中隻能使用行為級語句,但是不能包含always和initial塊,設計者可以在always和initial塊中調用任務和函數。

任務和函數的不同點

函數能調用另一個函數,但是不能調用任務 任務可以調用另一個任務,也可以調用函數

函數總是在仿真時刻0開始 任務可以在非零時刻開始執行

函數一定不能包含任何延遲,事件或者時序控制聲明語句 任務可以包含延遲,事件或者時序控制聲明語句

函數至少要有一個輸入變量,也可以有多個輸入變量 任務可以沒有或者有多個輸入,輸出,輸入輸出變量

函數隻能傳回一個值,函數不能有輸出或者雙向變量 任務不傳回任何值,或者傳回多個輸出或雙向變量值

由上述的特點決定:函數用于替代純組合邏輯的verilog代碼,而任務可以代替verilog的任何代碼。

任務

任務使用關鍵字task和endtask來進行聲明,如果子程式滿足下面任何一個條件,則必須使用任務而不能使用函數。

1.子程式中包含有延遲,時序或者事件控制結構

2.沒有輸出或者輸出變量超過一個

3.沒有輸入變量

自動(可重入)任務:verilog任務中所有聲明的變量位址空間都是靜态配置設定的,是以如果在一個子產品中多次調用任務時,可能會造成位址空間的沖突,為了避免這個問題,verilog通過在task關鍵字後面添加automatic使任務稱為可重入的,這時在調用任務時,會自動給任務聲明變量配置設定動态位址空間,這樣有效避免了位址空間的沖突。

函數

函數使用關鍵字function和endfunction定義,對于子程式,如果滿足下述所有條件則可以用函數來完成:

1.在子程式中不含有延遲時序或者控制結構。

2.子程式隻有一個傳回值。

3.至少有一個輸入變量。

4.沒有輸出或者雙向變量。

5.不含有非阻塞指派語句。

跟任務調用一樣,在子產品中如果調用多次函數,也會碰到位址沖突的問題,是以也引入automatic關鍵字來對函數可重用性聲明。沒有進行可重用性聲明的函數不可以多次或者遞歸調用,進行了可重用性聲明的函數可以遞歸調用。

常量函數和帶符号函數(函數聲明時加signed關鍵字說明)

繼續閱讀