📅  最后修改于: 2021-01-11 14:49:37             🧑  作者: Mango
函数的目的是返回要在表达式中使用的值。函数定义始终以函数关键字开头,后跟括号中的返回类型,名称和端口列表。它以endfunction关键字结束。
函数应该至少有一个输入声明和一条语句,该语句为寄存器赋一个与函数相同名称的值。如果函数不返回任何内容,则返回类型可以为空。
函数只能在模块声明中声明,并且可以通过始终块,连续赋值或其他函数来调用。在连续分配中,当其任何声明的输入发生更改时,将对它们进行评估。在过程中,将在调用它们时对其进行评估。
函数描述组合逻辑。函数是重用过程代码的绝佳方法,因为无法从过程中调用模块。
返回的类型或范围声明,后跟函数标识符和分号,应出现在函数关键字之后。函数可以包含返回类型,参数,范围,寄存器,事件和输入参数的声明。这些声明类似于模块项的声明。
净申报是非法的。不需要声明寄存器,参数,事件,范围和返回的类型。没有范围或返回类型声明的函数将返回一位值。
任何表达式都可以用作函数调用参数。函数不能包含任何时间控制的语句,并且它们不能启用任务。函数只能返回一个值。
当我们发现特定的代码段在RTL中是重复的并被多次调用时,它们通常不消耗模拟时间。它们可能涉及复杂的计算,需要使用不同的数据值来完成。
在这种情况下,我们可以声明一个函数并将重复的代码放入该函数,并允许其返回结果。
它将减少RTL中的行数。现在,我们需要执行一个函数调用并传递需要在其上执行计算的数据。
句法
以下是在Verilog中使用函数的语法:
function [automatic] [return_type] name ([port_list]);
[statements]
endfunction
关键字自动将使可重入函数和任务中声明的项目动态分配,而不是在任务的不同调用之间共享。这对于递归函数以及N个进程同时执行相同的函数很有用。
函数声明指定函数的名称,函数输入参数,函数内使用的变量(reg),函数返回值的宽度以及函数局部参数和整数。
句法
以下是在Verilog中声明函数的指定语法:
function [msb: lsb] function_name;
input [msb: lsb] input_arguments;
reg [msb: lsb] reg_variable_list;
parameter [msb: lsb] parameter_list;
integer [msb: lsb] integer_list;
[statements]
Endfunction
例
function [7:0] sum;
input [7:0] a, b;
begin
sum = a + b;
end
函数定义将隐式创建一个与该函数同名的内部变量。
因此,在函数范围内声明另一个同名变量是非法的。通过将函数结果分配给内部变量来初始化返回值。
sum = a + b;
函数调用是带有表达式的操作数。函数调用必须在其终端列表中指定所有输入参数。
例
reg [7:0] result;
reg [7:0] a, b;
initial begin
a = 4;
b = 5;
#10 result = sum (a, b);
end
以下是Verilog功能的一些一般规则: