大家好,又到了每日學習的時間了,今天我們來聊一聊FPGA 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)函數調用語句不能單獨作為一條語句出現,只能作為賦值語句的右端操作數。
今天就聊到這里,各位,加油。
-
FPGA
+關注
關注
1629文章
21729瀏覽量
603024 -
Verilog
+關注
關注
28文章
1351瀏覽量
110077
發布評論請先 登錄
相關推薦
評論