Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Industrial programming >> Verilog

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

  1. Maîtriser Verilog : Tutoriel complet pour la conception de circuits numériques
  2. Maîtriser la concaténation Verilog : Guide pratique
  3. Comprendre les affectations Verilog : Types, Syntaxe et Bonnes Pratiques
  4. Verilog Blocking vs Non-Blocking : Différences Clés Expliquées
  5. Maîtriser les Fonctions Verilog pour une Conception RTL Efficace
  6. Comprendre les Tasks Verilog : Fonctions vs Tasks, Syntaxe et Utilisation
  7. Maîtriser la Portée de Référence Hiérarchique Verilog : Éviter les Collisions de Noms dans les Modules et Blocs
  8. Générateur d'Horloge Verilog : Guide de Conception et d'Implémentation
  9. Maîtriser les Tâches d'Affichage Verilog : Débogage et Journalisation Efficaces