task:
(1)在模块中声明,实现参数的传递,可以与主模块共用一个仿真时间,也可以自己定义
(2)task没有返回值,执行结果返回调用它的环境中,例如task( input x,
input y, output z)与变量a,b,c为例; 当任务启动时,输入量通过x,y传递至a,b;当任务完成输出量由c传递给z。
(3)当任务调用时,按照input、output以及inout的次序,传递值
(4)任务可以启动任务和函数,也可以没有任何类型的变量
下面示例用task表示一个4位全加器;
module add4(
input cin,
input [3:0]a,
input [3:0]b,
output reg[4:0] sum,
output reg cout);
task add(
input cin,
input [3:0] a,
input [3:0] b,
output [4:0] sum,
output cout);
begin
{cout,sum}=a+b+cin;
end
endtask
always@(a or b or cin)
begin
add(cin,a,b,sum,cout);
end
endmodule
function:
(1)函数也可以由表达式实现。并且在函数标识符的位置上返回一个值。一个函数的定义隐含地定义一个与函数本身有同样名称、同样范围和同样类型定义的内部寄存器变量,这个变量必须在函数体内赋值,函数值可以通过函数名返回。
(2)函数中不可能包含时序控制操作(无 延时控制#,时间控制@