文章目录
-
-
-
- 语法
- 函数的定义
- 函数的调用
- 递归调用
- 多文件调用
-
-
语法
function [automatic] [return_type]name([port_list]);
[statements]
endfunction
Verilog中的Function函数和C中的函数非常类似,它可以根据你的输入,返回计算的结果,函数的实现只能是组合逻辑,不能包括时间控制,例如#100,可以指定返回值的类型,应该包含至少1个输入,输入只能是input类型,不能是inout或output,只能返回一个值。
当task/function定义为automatic,其变量也是隐式automatic的。 因此,在多次调用task/function时,变量每次都会分配内存并不会覆盖。
函数的定义 支持以下两种定义方式:
function [7:0] sum;
input [7:0] a, b;
begin
sum = a + b;
end
endfunctionfunction [7:0] sum (input [7:0] a, b);
begin
sum = a + b;
end
endfunction
可以看出,指定函数名称的同时,也生成了一个同名的返回变量。
函数的调用
reg [7:0] result;
reg [7:0] a, b;
initial begin
a = 4;
b = 5;
#10 result = sum (a, b);
end
递归调用 【verilog|Verilog function 函数】Function可以被自己调用,实现递归操作。下面这个示例是计算阶乘的实现方法:
module tb;
initial begin
integer result = factorial(4);
$display("factorial(4) = %0d", result);
endfunction automatic integer factorial(integer i);
integer result = i;
// This function is called within the body of this
// function with a different argument
if (i) begin
result = i * factorial(i-1);
$display("i=%0d result=%0d", i, result);
end
else
result = 1;
return result;
endfunctionendmodule
仿真结果:
xcelium> run
i=1 result=1
i=2 result=2
i=3 result=6
i=4 result=24
factorial(4) = 24
xmsim: *W,RNQUIE: Simulation is complete
多文件调用
声明fun_lib.v文件,内容如下
module fun_lib();
//function1;
//function2;
//function3;
endmodule
在另一个top.v文件引用:
module top(
//port declare
);
//instance module
fun_lib fun_lib_ut0();
always @ () begin
//
out1 <= fun_lib_ut0.function1(/* param */ );
out2 <= fun_lib_ut0.function2(/* param */);
endendmodule
FROM:verilog-functions
推荐阅读
- Verilog|Verilog学习心得之三-----task与function的区别
- ZYNQ7000|ZYNQ7000 学习(二十一)ZYNQ7 双核处理的运行机制的原理和实现步骤
- ZYNQ7000|ZYNQ7000 学习 (十七)GPIO中断源的配置以及中断试验
- FPGA|基于SDSoC的软硬件协同设计
- Xilinx|Xilinx RTL编码指南(一)
- Verilog|(127)Verilog HDL(设计一个优先编码器之Always case2)
- Verilog|(128)Verilog HDL(设计一个优先编码器之Always casez)
- 监控|基于阿里云物联网平台实现的简易出入监控
- FPGA学习手册|FPGA学习记录(5)<低通&带通FIR滤波器FPGA实现>