硬件描述語言Verilog HDL設計進階之:Verilog HDL高級語法結構--函數
4.3 Verilog HDL高級語法結構—函數(function)
本文引用地址:http://www.j9360.com/article/201706/348832.htm
函數的目的是返回一個用于表達式的值。
1.函數定義語法
function 返回值的類型或范圍> (函數名);
端口說明語句>
變量類型說明語句> begin
語句>
...
end
endfunction
請注意返回值的類型或范圍>這一項是可選項,如缺省則返回值為一位寄存器類型數據。下面用例子說明:
function [7:0] getbyte;
input [15:0] address;
begin
說明語句> //從地址字中提取低字節的程序
getbyte = result_expression; //把結果賦予函數的返回字節
end
endfunction
2.函數返回值
函數的定義蘊含聲明了與函數同名的、函數內部的寄存器。如在函數的聲明語句中返回值的類型或范圍>為缺省,則這個寄存器是一位的;否則是與函數定義中返回值的類型或范圍>一致的寄存器。
函數的定義把函數返回值所賦值寄存器的名稱初始化為與函數同名的內部變量。上面的例子說明了這個概念:getbyte被賦予的值就是函數的返回值。
3.函數調用
函數的調用是通過將函數作為表達式中的操作數來實現的,其調用格式如下:
函數名> (表達式>,表達式>>*)
其中函數名作為確認符。下面的例子中通過對兩次調用函數getbyte的結果值進行位拼接運算來生成一個字。
word = control? {getbyte(msbyte),getbyte(lsbyte)} : 0;
4.函數使用規則
與任務相比函數的使用有較多的約束,下面給出的是函數的使用規則。
• 函數的定義不能包含有任何的時間控制語句,即任何用#、@、或wait來標識的語句。
• 函數不能啟動任務。
• 定義函數時至少要有一個輸入參量。
• 在函數的定義中必須有一條賦值語句給函數中的一個內部變量賦以函數的結果值,該內部變量具有和函數名相同的名字。
5.實例詳解
下面的例子中定義了一個可進行階乘運算的名為factorial的函數,該函數返回一個32位的寄存器類型的值,該函數可后向調用自身,并且打印出部分結果值。
module tryfact; //模塊開始
//函數的定義-------------------------------
function[31:0]factorial; //函數開始
input[3:0]operand; //函數的入口
reg[3:0]index; //函數的寄存器
begin
factorial = operand? 1 : 0; //若operand全為0,則為0
for(index=2;index=operand;index=index+1) //循環語句
factorial = index * factorial; //乘法器
end
endfunction //函數結束
//函數的測試-------------------------------------
reg[31:0]result;
reg[3:0]n;
initial begin
result=1;
for(n=2;n=9;n=n+1) begin //循環語句(調用函數)
$display(Partial result n= %d result= %d, n, result); //每次函數的執行結果
result = n * factorial(n)/((n*2)+1); //調用函數
end
$display(Finalresult=%d,result); //打印結果
end
endmodule //模塊結束
評論