Comprendre les Tasks Verilog : Fonctions vs Tasks, Syntaxe et Utilisation
Une function est destinée à traiter l'entrée et retourner une seule valeur, alors qu'une task est plus générale et peut calculer plusieurs valeurs de résultat et les retourner en utilisant des arguments de type output et inout. Les tasks peuvent contenir des éléments consommateurs de temps de simulation tels que @, posedge et autres.
Syntaxe
Une task 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 [nom];
input [liste_ports];
inout [liste_ports];
output [liste_ports];
begin
[instructions]
end
endtask
// Style 2
task [nom] (input [liste_ports], inout [liste_ports], output [liste_ports]);
begin
[instructions]
end
endtask
// Liste de ports vide
task [nom] ();
begin
[instructions]
end
endtask
Task Statique
Si une task est statique, alors toutes ses variables membres seront partagées entre différentes invocations de la même task 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
// ou
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 task (x, y, z) correspondent aux arguments (a, b, c) définis par la task. Puisque a et b sont des entrées, les valeurs de x et y seront placées dans a et b respectivement. Parce que c est déclaré comme une sortie et connecté avec z lors de l'invocation, la somme sera automatiquement passée à la variable z depuis c.
Task Automatique
Le mot-clé automatic rendra la task rentrante, sinon elle sera statique par défaut. Tous les éléments à l'intérieur des tâches automatic sont alloués dynamiquement pour chaque invocation et ne sont pas partagés entre les invocations de la même task s'exécutant simultanément. Notez que les éléments de automatic task ne peuvent pas être accessibles par des références hiérarchiques.
Pour illustration, considérons la task statique display qui est appelée depuis différents blocs initial qui s'exécutent simultanément. Dans ce cas, la variable entière déclarée dans la task est partagée entre toutes les invocations de la task et donc la valeur affichée devrait s'incrémenter pour chaque invocation.
module tb;
initial display();
initial display();
initial display();
initial display();
// Ceci est une task statique
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 task est rendue automatique, chaque invocation de la task se voit allouer un espace différent en mémoire de simulation et se comporte différemment.
module tb;
initial display();
initial display();
initial display();
initial display();
// Notez que la task est maintenant automatique
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.
Tasks Globales
Les tasks déclarées en dehors de tous les modules sont appelées globales car elles ont une portée globale et peuvent être appelées dans n'importe quel module.
// Cette task est en dehors de tous les 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 task était déclarée dans le module des, elle devrait être appelée en référence au nom d'instance du module.
module tb;
des u0();
initial begin
u0.display(); // La task n'est pas visible dans le module 'tb'
end
endmodule
module des;
initial begin
display(); // La définition de la task est locale au 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 tasks Verilog servent des objectifs similaires, il y a quelques différences notables entre elles.
| Fonction | Task |
|---|---|
| Ne peut pas avoir d'instructions contrôlées par le temps/délai, et s'exécute donc dans la même unité de temps de simulation | Peut contenir des instructions contrôlées par le temps/délai et peut ne se terminer qu'à un autre moment |
| Ne peut pas activer une task, à cause de la règle ci-dessus | Peut activer d'autres tasks et fonctions |
| Doit avoir au moins un argument d'entrée et ne peut pas avoir d'arguments output ou inout | Peut avoir zéro ou plus d'arguments de n'importe quel type |
| Ne peut retourner qu'une seule valeur | Ne peut pas retourner de valeur, mais peut obtenir le même effet en utilisant des arguments output |
Lorsqu'une fonction tente d'appeler une task ou contient une instruction consommant du temps, 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 une Task
Les tasks peuvent être désactivées en utilisant le mot-clé disable.
module tb;
initial display();
initial begin
// Après 50 unités de temps, désactiver un bloc nommé particulier
// T_DISPLAY à l'intérieur de la task appelée '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
Quand la task display a été lancée par le premier bloc initial, T_DISPLAY a commencé et a été désactivé quand le temps a atteint 50 unités. Immédiatement, le bloc suivant S_DISPLAY a commencé et s'est exécuté jusqu'à completion à 80 unités.
Journal de Simulation
xcelium> run [0] T_Task started [60] S_Task started [80] S_Task ended xmsim: *W,RNQUIE: Simulation is complete.
Verilog
- Maîtriser Verilog : Tutoriel complet pour la conception de circuits numériques
- Maîtriser la concaténation Verilog : Guide pratique
- Comprendre les affectations Verilog : Types, Syntaxe et Bonnes Pratiques
- Verilog Blocking vs Non-Blocking : Différences Clés Expliquées
- Maîtriser les Fonctions Verilog pour une Conception RTL Efficace
- Comprendre les Tasks Verilog : Fonctions vs Tasks, Syntaxe et Utilisation
- Maîtriser la Portée de Référence Hiérarchique Verilog : Éviter les Collisions de Noms dans les Modules et Blocs
- Générateur d'Horloge Verilog : Guide de Conception et d'Implémentation
- Maîtriser les Tâches d'Affichage Verilog : Débogage et Journalisation Efficaces