Tâche Verilog
Un function
est destiné à effectuer un traitement sur l'entrée et à renvoyer une seule valeur, alors qu'un task
est plus général et peut calculer plusieurs valeurs de résultat et les renvoyer en utilisant la sortie et inout arguments de type. Les tâches peuvent contenir des éléments chronophages de simulation tels que @ , posege et d'autres.
Syntaxe
Une tâche n'a pas besoin d'avoir un ensemble d'arguments dans la liste des ports, auquel cas elle peut être laissée vide.
// 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
Tâche statique
Si une tâche est statique, toutes ses variables membres seront partagées entre différents appels de la même tâche qui a été lancée pour s'exécuter simultanément
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
Les arguments d'activation de la tâche (x, y, z) correspondent aux arguments (a, b, c) définis par la tâche. Depuis un et b sont des entrées, des valeurs de x et y sera placé dans a et b respectivement. Parce que c est déclaré comme sortie et connecté avec z lors de l'invocation, la somme sera automatiquement passée à la variable z de c .
Tâche automatique
Le mot-clé automatic
rendra la tâche réentrante, sinon elle sera statique par défaut. Tous les éléments dans automatique les tâches sont allouées dynamiquement pour chaque invocation et non partagées entre les invocations de la même tâche exécutées simultanément. Notez que automatic
les éléments de tâche ne sont pas accessibles par des références hiérarchiques.
Pour illustration, considérons le statique affichage des tâches qui est appelé depuis différents initial
blocs qui s'exécutent simultanément. Dans ce cas, la variable entière déclarée dans la tâche est partagée entre toutes les invocations de la tâche et, par conséquent, la valeur affichée doit s'incrémenter à chaque invocation.
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
Journal de simulation xcelium> run i=1 i=2 i=3 i=4 xmsim: *W,RNQUIE: Simulation is complete.
Si la tâche est rendue automatique, chaque invocation de la tâche se voit attribuer un espace différent dans la mémoire de simulation et se comporte différemment.
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
Journal de simulation xcelium> run i=1 i=1 i=1 i=1 xmsim: *W,RNQUIE: Simulation is complete.
Tâches globales
Les tâches déclarées en dehors de tous les modules sont appelées globales tâches car elles ont une portée globale et peuvent être appelées dans n'importe quel module.
// This task is outside all modules
task display();
$display("Hello World !");
endtask
module des;
initial begin
display();
end
endmodule
Journal de simulation xcelium> run Hello World ! xmsim: *W,RNQUIE: Simulation is complete.
Si la tâche était déclarée dans le module des, elle devrait être appelée en référence au nom de l'instance du module.
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
Journal de simulation xcelium> run Hello World Hello World xmsim: *W,RNQUIE: Simulation is complete.
Différence entre function
et task
Bien que les fonctions et les tâches de Verilog aient des objectifs similaires, il existe quelques différences notables entre elles.
Fonction | Tâche |
---|---|
Ne peut pas avoir d'instructions/délai de contrôle du temps, et donc s'exécute dans la même unité de temps de simulation | Peut contenir des instructions/délai de contrôle du temps et ne peut se terminer qu'à un autre moment |
Impossible d'activer une tâche, à cause de la règle ci-dessus | Peut activer d'autres tâches et fonctions |
Doit avoir au moins un argument d'entrée et ne peut pas avoir d'arguments de sortie ou d'entrée | Peut avoir zéro ou plusieurs arguments de n'importe quel type |
Ne peut renvoyer qu'une seule valeur | Impossible de renvoyer une valeur, mais peut obtenir le même effet en utilisant des arguments de sortie |
Lorsqu'une fonction tente d'appeler un task
ou contiennent une instruction chronophage, le compilateur signale une erreur.
module tb;
reg signal;
initial wait_for_1(signal);
function wait_for_1(reg signal);
#10;
endfunction
endmodule
Journal de simulation #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)].
Désactiver la tâche
Les tâches peuvent être désactivées en utilisant le disable
mot-clé.
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
Lorsque s'affiche la tâche a été lancée par le premier initial
bloc, T_DISPLAY a démarré et a été désactivé lorsque le temps a atteint 50 unités. Immédiatement, le bloc suivant S_DISPLAY a commencé et s'est terminé par 80 unités.
xcelium> run [0] T_Task started [60] S_Task started [80] S_Task ended xmsim: *W,RNQUIE: Simulation is complete.
Verilog