4.3 verilog中的function用法与例子

摘要:
函数的定义和调用也存在于Verilog HDL语法中。1.函数定义函数由关键字函数和endfunction定义。不允许输出端口声明,但可以有多个输入端口。2.与任务一样,函数仅在调用时执行。调用函数的语句形式如下:func_Id其中,func_Id是要调用的函数的名称,expr1,expr2 ExprN是传递给函数的输入参数列表。输入参数列表的顺序必须与定义函数时声明其输入的顺序相同。

函数的功能和任务的功能类似,但二者还存在很大的不同。在 Verilog HDL 语法中也存在函数的定义和调用。 

1.函数的定义 
函数通过关键词 function 和 endfunction 定义,不允许输出端口声明(包括输出和双向端口) ,但可以有多个输入端口。函数定义的语法如下: 
function [range] function_id; 
   input_declaration 
   other_declarations 
   procedural_statement 
endfunction

其中,function 语句标志着函数定义结构的开始;[range]参数指定函数返回值的类型或位宽,是一个可选项,若没有指定,默认缺省值为 1 比特的寄存器数据;function_id 为所定义函数的名称,对函数的调用也是通过函数名完成的,并在函数结构体内部代表一个内部变量,函数调用的返回值就是通过函数名变量传递给调用语句;input_declaration 用于对寒暑各个输入端口的位宽和类型进行说明,在函数定义中至少要有一个输入端口;endfunction为函数结构体结束标志。

下面给出一个函数定义实例。定义函数实例。 
function  AND;   //定义输入变量 
input A, B; //定义函数体 
begin 
   AND = A  && B; 
end 
endfunction

函数定义在函数内部会隐式定义一个寄存器变量, 该寄存器变量和函数同名并且位宽也一致。函数通过在函数定义中对该寄存器的显式赋值来返回函数计算结果。此外,还有下列几点需要注意: 
(1)函数定义只能在模块中完成,不能出现在过程块中; 
(2)函数至少要有一个输入端口;不能包含输出端口和双向端口; 
(3) 在函数结构中, 不能使用任何形式的时间控制语句 (#、 wait 等) , 也不能使用 disable中止语句; 
(4)函数定义结构体中不能出现过程块语句(always 语句) ; 
(5)函数内部可以调用函数,但不能调用任务。 

2.函数调用 
和任务一样,函数也是在被调用时才被执行的,调用函数的语句形式如下: 
func_id(expr1, expr2, ........., exprN) 
其中,func_id 是要调用的函数名,expr1, expr2, ......exprN是传递给函数的输入参数列表,该输入参数列表的顺序必须与函数定义时声明其输入的顺序相同。下面给出一个函数调用实例。

函数调用实例。 

module comb15 (A, B, CIN, S, COUT);  
input [3:0] A, B; 
input CIN; 
output [3:0] S; 
output COUT; 
wire [1:0] S0, S1, S2, S3; 

function signed [1:0] ADD; 
input A, B, CIN;
reg S, COUT; 
begin 
S = A ^ B ^ CIN; 
COUT = (A&B) | (A&CIN) | (B&CIN); 
ADD = {COUT, S}; 
end 
endfunction 
 
assign S0 = ADD (A[0], B[0], CIN), 
S1 = ADD (A[1], B[1], S0[1]), 
S2 = ADD (A[2], B[2], S1[1]), 
S3 = ADD (A[3], B[3], S2[1]), 
S = {S3[0], S2[0], S1[0], S0[0]}, 
COUT = S3[1]; 
endmodule

在函数调用中,有下列几点需要注意: 
(1)函数调用可以在过程块中完成,也可以在 assign 这样的连续赋值语句中出现。 
(2)函数调用语句不能单独作为一条语句出现,只能作为赋值语句的右端操作数。
--------------------- 
作者:a14730497 
来源:CSDN 
原文:https://blog.csdn.net/a14730497/article/details/8032804 
版权声明:本文为博主原创文章,转载请附上博文链接!

免责声明:文章转载自《4.3 verilog中的function用法与例子》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇JavaScript的三种代码书写格式listview 设置数组为空下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

2019-2-14SQLserver中function函数和存储过程、触发器、CURSOR

Sqlserver 自定义函数 Function使用介绍 前言:         在SQL server中不仅可以可以使用系统自带的函数(时间函数、聚合函数、字符串函数等等),还可以根据需要自定义函数。 一、定义: 用户自定义函数的类型: 1、标量值函数(返回一个标量值) 2、表格值函数(内联表格值函数、多语句表值函数,返回一个结果集即返回多个值...

function类型(c++11)

1.c++五大可调用的对象   可调用的对象常常作为泛型算法的实参 1)函数 2)函数指针 函数名其实也是函数指针,只不过函数名是一个常量指针,它的值不能改变,只能指向该函数,不能改变它的值让它指向别的函数 void fun1(int a) { cout << a << endl; } void fun2(int a)...

偏函数(partial function)

如果一个函数带了一些参数,在大部分使用场景中,某个参数的值是固定的,那我们有两种简化办法: 参数默认值 即在原始函数定义的地方,对应参数处设置paramx=default。 但是有一点不好,如果paramx设置了默认值,这个参数之后的其他参数也要跟着设置默认值。 整体而言,对原有函数有改动。 偏函数 使用functools.partial(orig...