verilog中function用法_verilog中的function用法与例子-阿里云开发者社区

函数的功能和任务的功能类似,但二者还存在很大的不同。在 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)函数调用语句不能单独作为一条语句出现,只能作为赋值语句的右端操作数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值