Verilog 中 function 的使用

Verilog 中 function 的使用

函數的功能和任務的功能類似,但二者還存在很大的不同。在 Verilog HDL 語法中也存在函數的定義和調用。

1.函數的定義

函數通過關鍵詞 function 和 endfunction 定義,不允許輸出端口聲明(包括輸出和雙向端口) ,但可以有多個輸入端口。函數定義的語法如下:

function [range] function_id; 
   input_declaration 
   other_declarations 
   procedural_statement 
endfunction

其中,function 語句標誌着函數定義結構的開始;[range]參數指定函數返回值的類型或位寬,是一個可選項,若沒有指定,默認缺省值爲 1 比特的寄存器數據;function_id 爲所定義函數的名稱,對函數的調用也是通過函數名完成的,並在函數結構體內部代表一個內部變量,函數調用的返回值就是通過函數名變量傳遞給調用語句;input_declaration 用於對寒暑各個輸入端口的位寬和類型進行說明,在函數定義中至少要有一個輸入端口;endfunction爲函數結構體結束標誌。下面給出一個函數定義實例。

定義函數實例。

function  AND; 
  //定義輸入變量 
input A, B; 
//定義函數體 
begin 
   AND = A  && B; 
end 
endfunction

函數定義在函數內部會隱式定義一個寄存器變量, 該寄存器變量和函數同名並且位寬也一致。函數通過在函數定義中對該寄存器的顯式賦值來返回函數計算結果。此外,還有下列幾點需要注意:

(1)函數定義只能在模塊中完成,不能出現在過程塊中; 
(2)函數至少要有一個輸入端口;不能包含輸出端口和雙向端口; 
(3) 在函數結構中, 不能使用任何形式的時間控制語句 (#、 wait 等) , 也不能使用 disable
中止語句; 
(4)函數定義結構體中不能出現過程塊語句(always 語句) ; 
(5)函數內部可以調用函數,但不能調用任務。 

2.函數調用

和任務一樣,函數也是在被調用時才被執行的,調用函數的語句形式如下:
func_id(expr1, expr2, ........., exprN)
其中,func_id 是要調用的函數名,expr1, expr2, …exprN是傳遞給函數的輸入參數列表,該輸入參數列表的順序必須與函數定義時聲明其輸入的順序相同。下面給出一個函數調
用實例。

函數調用實例。

module comb15 (A, B, CIN, S, COUT); 
input [3:0] A, B; 
input CIN; 
output [3:0] S; 
output COUT; 
 
wire [1:0] S0, S1, S2, S3; 
 
function signed [1:0] ADD; 
 
input A, B, CIN;

reg S, COUT; 
 
begin 
S = A ^ B ^ CIN; 
COUT = (A&B) | (A&CIN) | (B&CIN); 
ADD = {COUT, S}; 
end 
endfunction 
 
assign S0 = ADD (A[0], B[0], CIN), 
S1 = ADD (A[1], B[1], S0[1]), 
S2 = ADD (A[2], B[2], S1[1]), 
S3 = ADD (A[3], B[3], S2[1]), 
S = {S3[0], S2[0], S1[0], S0[0]}, 
COUT = S3[1]; 
endmodule

在函數調用中,有下列幾點需要注意:
(1)函數調用可以在過程塊中完成,也可以在assign 這樣的連續賦值語句中出現。
(2)函數調用語句不能單獨作爲一條語句出現,只能作爲賦值語句的右端操作數。

verilog 中function定義是裏面能用always嗎?

不能,

函數function的定義不能包含有任何的時間控制語句,即任何用#、@、或wait來標識的語句。

Verilog HDL中什麼叫做過程塊?

過程塊有兩種:initial塊(只執行一次) 、always塊(只要條件滿足,就循環執行)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章