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

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.

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. Tutoriel Verilog
  2. Concaténation Verilog
  3. Affectations Verilog
  4. Verilog bloquant et non bloquant
  5. Fonctions Verilog
  6. Tâche Verilog
  7. Portée de référence hiérarchique Verilog
  8. Générateur d'horloge Verilog
  9. Tâches d'affichage Verilog