【IC验证】systemverilog_函数和任务
函数和任务
- 一.作用
- 二.任务(function)和函数(task)的区别
- 三.注意点
- 四.函数(function)
- 1.`语法`
- 2.`注意点`
- 3.例子
- (1)乘法函数
- 五.任务(task)
- 1.`语法`
- 2.`注意点`
- 3.例子
一.作用
提高代码的复用性、简洁性,易于代码的阅读和维护。
二.任务(function)和函数(task)的区别
(1)function不可以执行需要消耗仿真时间的语句,task可以执行需要消耗仿真时间的语句(如**#10**,@);
(2)function有返回值且只能返回一个单一数值,task没有返回值;
(3)function只能调用function,task既可以调用function也可以调用task;
(4)function的返回值可以作为一个表达式中的操作数;
三.注意点
1.函数和任务可以定义在模块中,也可以定义在类中;
2.函数和任务可以有一个或者多个输入或输出,也可以没有输入和输出;
四.函数(function)
1.语法
(1)函数的定义
function 返回值类型 函数名(参数列表);
//函数主体
endfunction
(2)函数的调用
函数名作为返回值变量(参数);
2.注意点
(1)参数列表需要,声明参数的方向(input,output,inout,ref),和参数的类型(logic,bit,int),默认是input logic类型;
(2)参数可以指定默认值;
(3)函数可以没有返回值,没有返回值时,返回值类型为void;
(4)当函数具有返回值时,但是在调用函数时不适用返回值,建议添加void’(函数名());
3.例子
(1)乘法函数
代码:
module test_ft_tb;
logic [7:0] data1;
logic [7:0] data2;
logic [15:0] out;
function logic [15:0] mult(input logic [7:0] a,input logic [7:0] b);
mult = a*b;
endfunction
initial begin
data1 = 0;
data2 = 0;
out = mult(data1,data2);
$display("out is %d",out);
data1 = 10;
data2 = 2;
out = mult(data1,data2);
$display("out is %d",out);
end
endmodule
结果:
五.任务(task)
1.语法
(1)任务的定义:
task 任务名(参数列表);
//任务主体
endtask
(2)任务的调用
任务名(参数);
2.注意点
(1)参数列表需要,声明参数的方向(input,output,inout,ref),和参数的类型(logic,bit,int),默认是input logic类型;
(2)参数可以指定默认值(参数如果没有给默认值,那就必须传参);
(3)task没有返回值,也不需要void;
(4)任务需要执行完之后,才会输出,除非是ref类型;
(5)task中可以用return,执行到return会提前结束task;
(6)task执行完以后才会更新输出;
3.例子
代码:
module test_ft_tb;
task mt(input logic [7:0] a,input logic [7:0] b,output logic [15:0] c);
#5;
c = a*b;
#5;
endtask
logic [7:0] in1 = 3;
logic [7:0] in2 = 4;
logic [15:0] out = 0;
initial begin
repeat(15)begin
#1;
$display("@time %t: out is %d",$time,out);
end
end
initial begin
mt(in1,in2,out);
$display("@time %t: OUT is %d",$time,out);
end
endmodule
结果: