任务
任务(task)几乎与函数类似,但任务可以计算多个变量并使用输出或 inout 语句返回它们,但不像函数那样必需,即任务不是返回类型,并且任务能够具有诸如 #、@、等待。任务也可以调用另一个任务和函数。
语法:
task_name(arguments);
task task_name(arguments);
statement1;
statement2;
.
.
statementN;
endtask
限制:
- 任务不可综合
流程图
automatic task#
每当声明为 automatic task 时,每次调用该任务时,模拟器都会分配新的内存。一般来说,任务在模块内部是静态的,要使其自动执行,需要添加 automatic 关键字,如下所示。
语法:
task automatic task_name()
示例:
task automatic factorial_automatic(int var1);
#1;
if(var1>=2)
begin
factorial_automatic(var1-1);
result=result*var1;
end
else
begin
result=1;
->a;
end
endtask
initial
begin
fork
factorial_static(5);
factorial_automatic(5);
join
fork
wait(a.triggered);
$display("@ %0t ns , factorial_automatic:%0d",$time,result);
end
流程图:
从任务中调用函数#
示例:
initial
begin
$display("\t ----output for func from task----");
$display("\t@ %0t ns, In the initial block",$time);
$display("\tcalling task");
task_sum;
$display("\treturned to initial from function");
end
task task_sum;
#1 $display( "\t@ %0t ns , I'm in task",$time);
$display("\tcalling func inside a task");
#1 void'(function_sum);
$display("\treturned to task from function");
endtask
function function_sum;
$display( "\t@ %0t ns I'm in function",$time);
endfunction
从函数中调用任务是非法的,但从任务中调用 func 是正常的,因为函数没有任何耗时的语句。
流程图:
全局任务#
如果一个任务是在模块和类之外声明的,则该任务被称为全局任务,默认的全局任务本质上是静态的。该全局任务可以从任何模块调用,通过以下示例可以更好地理解。
示例:
task mul(input int var1,var2,output int res);
#1 res=var1*var2;
endtask
module task1();
int multiplicand=5,multiplicator=6,result;
initial
begin
$display("\t ----output of global task----");
mul(multiplicand,multiplicator,result);
$display("\t @ %0t ns , %0d X %0d = %0d",$time,multiplicand,multiplicator,result);
end
endmodule
module task2();
int r;
initial
begin
#2 mul(7,8,r);
$display("\t @ %0t ns , 7 X 8 = %0d",$time,r);
end
endmodule
禁用任务#
可以通过在任务名称中使用关键字 disable 来禁用任务,这会在调用禁用时停止该特定任务。
示例:
module disable_task();
initial
begin
$display("\t ----output of disable task----");
fork
display_task();
#20 disable display_task.task_A;
join
end
task display_task();
begin : task_A
$display("\t @ %0t ns , task_A initiated",$time);
#30 $display("\t @ %0t ns , task_A finished",$time);
end :task_A
begin : task_B
$display("\t @ %0t ns , task_B initiated",$time);
#10 $display("\t @ %0t ns , task_B finished",$time);
end :task_B
endtask
endmodule