function函数的使用
规则:
- 函数必须至少含有一个输入变量,不能有任何输出或输入/输出双向变量。
- 函数不能包含时钟控制语句(如延迟#、事件控制@或者等待wait)。
- 函数是通过对函数名赋值的途径返回其值的,就好比是一个寄存器。
- 函数不能启动任务。
- 函数不能被禁用。
注意:
- 函数的输入变量不能像模块的端口那样列在函数名后的括弧里;在声明输入时把这些输入端列出即可。
- 如果函数包含一条以上的语句,这些语句必须包含在begin-end或fork-join块中。
可综合性问题:
函数每一次调用都被综合为一个独立的组合逻辑电路块。
module tryfunct(clk,n,result,reset);
output [31 : 0] result;
input [3 : 0] n;
input reset,clk;
reg [31 : 0] result;
always@(posedge clk)
begin
if(!reset)
result <= 0;
else
begin
result <= n*factorial(n)/((n*2)+1);
end //verilog在整数除法运算结果中不考虑余数
end
function [31 : 0] factorial;//函数定义,返回的是一个32位的数
input [3:0] operand;//输入只有一个4位的操作数
reg [3:0] index;//函数内部计数用中间变量
begin
factorial = operand ? 1 : 0;//先定义操作数为零时函数的输出为零,不为零时为1
for(index = 2;index <= operand ; index = index +1)
factorial = index * factorial; //表示阶乘的算术迭代运算
end
endfunction
endmodule
欢迎关注我,关于FPGA的问题欢迎留言讨论!