function is meant to do some processing on the input and return a single value, whereas a
task is more general and can calculate multiple result values and return them using output and inout type arguments. Tasks can contain simulation time consuming elements such as @, posedge and others. There are two ways in which tasks can be written, which we'll see next.
// 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
automatic will make the task reentrant, otherwise it will be static by default. If a task is static, then all its member variables will be shared across different invocations of the same task that has been launched to run concurrently. Note that
auomatic task items cannot be accessed by hierarchical references.
Calling a task
If the task does not need any arguments, then a list of arguments can be avoided. If the task needs arguments, they can be provided in the same statement as its invocation.
task sum (input [7:0] a, b, output [7:0] c); begin c = a + b; end endtask // or 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
The task-enabling arguments (x, y, z) correspond to the arguments (a, b, c) defined by the task. Since a and b are inputs, values of x and y will be placed in a and b respectively. Because c is declared as an output and connected with z during invocation, the sum will automatically be passed to the variable z from c.
Tasks that are declared outside all modules are called global tasks as they have a global scope and can be called within any module.
// This task is outside all modules task display(); $display("Hello World !"); endtask module des; initial begin display(); end endmodule
xcelium> run Hello World ! xmsim: *W,RNQUIE: Simulation is complete.
|Cannot have time-controlling statements/delay, and hence executes in the same simulation time unit||Can contain time-controlling statements/delay and may only complete at some other time|
|Cannot enable a task||Can enable other tasks and functions|
|Should have atleast one input argument and cannot have output or inout arguments||Can have zero or more arguments of any type|
|Can return only a single value||Cannot return a value, but can achieve the same effect using output arguments|