任务和函数主要有以下一些不同:
(1)函数只能与主模块共用一个仿真单位时间,而任务可以定义自己的仿真时间单位。
(2)函数不能启动任务,可以启动其它函数。而任务可以启动其他任务和函数。
(3)函数至少有一个输入变量(不能有inout或out)等,而任务可以没有或有任意个(输入或输出变量)。
(4)函数返回一个值,而任务不返回值。
函数的目的是通过返回一个值来响应输入信号的值。任务却能支持多种目的,能计算多个结果值,这些值只能通过被调用的任务的输出或总线端口送出。
任务不可综合,函数可综合。
函数的使用规则:
(1)函数的定义不能包含有任何的时间控制语句,即任何用#,@,wait来标识的语句。
(2)函数不能启动任务。
(3)定义函数至少有一个输入变量。
(4)在函数的定义中必须有一条赋值语句给函数中的一个内部变量赋以函数的结果值,该内部变量具有和函数名相同的名字。
1、函数和任务都要用begin和end。
如:task light;
output color; //声明端口顺序,任务调用时也要按这个顺序对应
input [31:0] tics;
begin
#(10*tics) color=off; //函数体只有一句,begin和end可有可无
end
endtask
task light;
output color;
input [31:0] tics;
begin
#(10*tics); color=off; //函数体有两句(以上),begin和end必须有
end
endtask
2、上述任务可写成这样,把端口声明写成这样。
task light(output color,input [31:0] tics);
begin
#(10*tics); color=off; //函数体有两句(以上),begin和end必须有
end
endtask