📅  最后修改于: 2021-01-11 14:50:33             🧑  作者: Mango
函数旨在对输入进行一些处理并返回单个值。相反,任务比较笼统,可以计算多个结果值,并使用output和inout类型参数返回它们。
任务可以包含耗时的模拟元素,例如@,posege和其他元素。任务在所有编程语言(通常称为过程或子例程)中使用。
数据传递到任务,完成处理,并返回结果。必须使用数据输入和输出来专门调用它们,而不仅仅是将其连接到常规网表中。
它们包含在代码主体中,可以多次调用,从而减少了代码重复。
必须使用语句专门调用任务。它不能作为函数使用在表达式中。
句法
任务以关键字task开始,以关键字endtask结尾。输入和输出在关键字task之后声明。
局部变量在输入和输出声明之后声明。
// Style 1
task [name];
input [port_list];
inout [port_list];
output [port_list];
begin
[statements]
end
endtask
// Style 2
task [name] (input [port_list], inout [port_list], output [port_list]);
begin
[statements]
end
endtask
关键字自动将使任务重入。否则,默认情况下它将是静态的。如果任务是静态的,则其所有成员变量将在同时启动的同一任务的不同调用之间共享。
注意:层次结构引用不能访问自动任务项目。
如果任务不需要任何参数,则可以避免使用参数列表。如果任务需要参数,则可以在其调用的同一语句中提供它们。
//Style 1
task sum (input [7:0] a, b, output [7:0] c);
begin
c = a + b;
end
endtask
// Style 2
task sum;
input [7:0] a, b;
output [7:0] c;
begin
c = a + b;
end
endtask
initial begin
reg [7:0] x, y , z;
sum (x, y, z);
end
启用任务的参数(x,y,z)对应于任务定义的参数(a,b,c)。
由于a和b是输入,因此x和y的值将分别放在a和b中。因为c被声明为输出并在调用期间与z连接,所以总和将自动从c传递到变量z 。
在所有模块外部声明的任务称为全局任务,因为它们具有全局作用域,并且可以在任何模块内调用。
// This task is outside all modules
task display();
$display("Hello");
endtask
module des;
initial begin
display();
end
endmodule
执行以上代码后,将产生以下输出。
xcelium> run
Hello
xmsim: *W,RNQUIE: Simulation is complete.
Function | Task |
---|---|
It cannot have time-controlling statements/delay and hence executes in the same simulation time unit. | It can contain time-controlling statements/delay and may only complete at some other time. |
It cannot enable a task. | It can enable other tasks and functions. |
The function should have atleast one input argument and cannot have output or inout arguments. | Tasks can have zero or more arguments of any type. |
A function can return only a single value. | It cannot return a value but can achieve the same effect using output arguments. |