📜  Verilog函数

📅  最后修改于: 2021-01-11 14:49:37             🧑  作者: Mango

Verilog功能

函数的目的是返回要在表达式中使用的值。函数定义始终以函数关键字开头,后跟括号中的返回类型,名称和端口列表。它以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功能的一些一般规则:

  • 函数不能包含任何时间控制的语句,例如#,@,wait,posegenegedge
  • 函数无法启动任务,因为它可能会消耗模拟时间,但可以调用其他函数。
  • 一个函数应至少有一个输入参数。
  • 函数不能具有非阻塞分配或强制释放或分配-取消分配。
  • 一个函数不能有任何触发器。
  • 函数不能具有inout输出声明。
  • 函数必须包含将返回值分配给隐式函数名称寄存器的语句。