4.3 Verilog HDL高档语法结构—函数(function)
函数的意图是回来一个用于表达式的值。
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 //模块完毕