verilog中function用法_verilog中的function用法与例子
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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(是否⼀般只能⽤begin...end过程块?)
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)函数调⽤语句不能单独作为⼀条语句出现,只能作为赋值语句的右端操作数。