Tarea Verilog
Un function
está destinado a realizar algún procesamiento en la entrada y devolver un valor único, mientras que un task
es más general y puede calcular múltiples valores de resultados y devolverlos usando salida y dentro-fuera argumentos de tipo. Las tareas pueden contener elementos que requieren mucho tiempo de simulación, como @ , pospuesto y otros.
Sintaxis
Una tarea no necesita tener un conjunto de argumentos en la lista de puertos, en cuyo caso puede mantenerse vacía.
// 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
// Empty port list
task [name] ();
begin
[statements]
end
endtask
Tarea estática
Si una tarea es estática, todas sus variables miembro se compartirán entre diferentes invocaciones de la misma tarea que se inició para ejecutarse simultáneamente
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
Los argumentos de habilitación de tareas (x, y, z) corresponden a los argumentos (a, b, c) definidos por la tarea. Desde un y b son entradas, valores de x y y se colocará en a y b respectivamente. Porque c se declara como una salida y se conecta con z durante la invocación, la suma se pasará automáticamente a la variable z de c .
Tarea automática
La palabra clave automatic
hará que la tarea sea reentrante, de lo contrario será estática por defecto. Todos los artículos dentro de automático las tareas se asignan dinámicamente para cada invocación y no se comparten entre invocaciones de la misma tarea que se ejecutan simultáneamente. Tenga en cuenta que automatic
no se puede acceder a los elementos de la tarea mediante referencias jerárquicas.
Por ejemplo, considere el estático pantalla de tareas que se llama desde diferentes initial
bloques que se ejecutan simultáneamente. En este caso, la variable entera declarada dentro de la tarea se comparte entre todas las invocaciones de la tarea y, por lo tanto, el valor mostrado debería incrementarse para cada invocación.
module tb;
initial display();
initial display();
initial display();
initial display();
// This is a static task
task display();
integer i = 0;
i = i + 1;
$display("i=%0d", i);
endtask
endmodule
Registro de simulación xcelium> run i=1 i=2 i=3 i=4 xmsim: *W,RNQUIE: Simulation is complete.
Si la tarea se hace automática, a cada invocación de la tarea se le asigna un espacio diferente en la memoria de simulación y se comporta de manera diferente.
module tb;
initial display();
initial display();
initial display();
initial display();
// Note that the task is now automatic
task automatic display();
integer i = 0;
i = i + 1;
$display("i=%0d", i);
endtask
endmodule
Registro de simulación xcelium> run i=1 i=1 i=1 i=1 xmsim: *W,RNQUIE: Simulation is complete.
Tareas globales
Las tareas que se declaran fuera de todos los módulos se denominan global tareas ya que tienen un alcance global y se pueden llamar dentro de cualquier módulo.
// This task is outside all modules
task display();
$display("Hello World !");
endtask
module des;
initial begin
display();
end
endmodule
Registro de simulación xcelium> run Hello World ! xmsim: *W,RNQUIE: Simulation is complete.
Si la tarea se declaró dentro del módulo des, tendría que llamarse en referencia al nombre de la instancia del módulo.
module tb;
des u0();
initial begin
u0.display(); // Task is not visible in the module 'tb'
end
endmodule
module des;
initial begin
display(); // Task definition is local to the module
end
task display();
$display("Hello World");
endtask
endmodule
Registro de simulación xcelium> run Hello World Hello World xmsim: *W,RNQUIE: Simulation is complete.
Diferencia entre function
y task
Aunque las funciones y tareas de Verilog tienen propósitos similares, existen algunas diferencias notables entre ellas.
Función | Tarea |
---|---|
No puede tener instrucciones de control de tiempo/retraso y, por lo tanto, se ejecuta en la misma unidad de tiempo de simulación | Puede contener declaraciones de control de tiempo/retraso y solo puede completarse en otro momento |
No se puede habilitar una tarea debido a la regla anterior | Puede habilitar otras tareas y funciones |
Debe tener al menos un argumento de entrada y no puede tener argumentos de salida o de entrada | Puede tener cero o más argumentos de cualquier tipo |
Puede devolver solo un único valor | No puede devolver un valor, pero puede lograr el mismo efecto usando argumentos de salida |
Cuando una función intenta llamar a un task
o contiene una declaración que consume mucho tiempo, el compilador informa un error.
module tb;
reg signal;
initial wait_for_1(signal);
function wait_for_1(reg signal);
#10;
endfunction
endmodule
Registro de simulación #10; | xmvlog: *E,BADFCN (testbench.sv,7|4): illegal time/event control statement within a function or final block or analog initial block [10.3.4(IEEE)].
Deshabilitar tarea
Las tareas se pueden deshabilitar usando el disable
palabra clave.
module tb;
initial display();
initial begin
// After 50 time units, disable a particular named
// block T_DISPLAY inside the task called 'display'
#50 disable display.T_DISPLAY;
end
task display();
begin : T_DISPLAY
$display("[%0t] T_Task started", $time);
#100;
$display("[%0t] T_Task ended", $time);
end
begin : S_DISPLAY
#10;
$display("[%0t] S_Task started", $time);
#20;
$display("[%0t] S_Task ended", $time);
end
endtask
endmodule
Cuando mostrar la tarea fue lanzada por el primer initial
bloque, T_DISPLAY se inició y se deshabilitó cuando el tiempo llegó a 50 unidades. Inmediatamente, el siguiente bloque S_DISPLAY comenzó y se completó en 80 unidades.
xcelium> run [0] T_Task started [60] S_Task started [80] S_Task ended xmsim: *W,RNQUIE: Simulation is complete.
Verilog