Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Industrial programming >> Verilog

Verilog-Aufgabe

Ein function soll die Eingabe verarbeiten und einen einzelnen Wert zurückgeben, während ein task ist allgemeiner und kann mehrere Ergebniswerte berechnen und sie mit output zurückgeben und inout Argumente eingeben. Aufgaben können simulationszeitaufwändige Elemente wie @ enthalten , gestellt und andere.

Syntax

Eine Aufgabe muss keinen Satz von Argumenten in der Portliste haben, in diesem Fall kann sie leer bleiben.

  
  
	// 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

  

Statische Aufgabe

Wenn eine Aufgabe statisch ist, werden alle ihre Mitgliedsvariablen von verschiedenen Aufrufen derselben Aufgabe gemeinsam genutzt, die zur gleichzeitigen Ausführung gestartet wurde

  
  
	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

  

Die aufgabenermöglichenden Argumente (x, y, z) entsprechen den durch die Aufgabe definierten Argumenten (a, b, c). Seit a und b sind Eingaben, Werte von x und y wird in a platziert und b beziehungsweise. Weil c wird als Ausgang deklariert und mit z verbunden beim Aufruf wird die Summe automatisch an die Variable z übergeben von c .

Automatische Aufgabe

Das Schlüsselwort automatic macht die Aufgabe reentrant, andernfalls ist sie standardmäßig statisch. Alle Elemente innerhalb automatisch Aufgaben werden dynamisch für jeden Aufruf zugewiesen und nicht zwischen Aufrufen derselben Aufgabe geteilt, die gleichzeitig ausgeführt werden. Beachten Sie, dass automatic Auf Aufgabenelemente kann nicht über hierarchische Verweise zugegriffen werden.

Betrachten Sie zur Veranschaulichung die Statik Aufgabenanzeige, die von verschiedenen initial aufgerufen wird Blöcke, die gleichzeitig ausgeführt werden. In diesem Fall wird die innerhalb der Aufgabe deklarierte Integer-Variable von allen Aufrufen der Aufgabe geteilt und daher sollte der angezeigte Wert für jeden Aufruf inkrementiert werden.

  
  
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

  
Simulationsprotokoll
xcelium> run
i=1
i=2
i=3
i=4
xmsim: *W,RNQUIE: Simulation is complete.

Wenn die Aufgabe automatisch gemacht wird, wird jedem Aufruf der Aufgabe ein anderer Platz im Simulationsspeicher zugewiesen und verhält sich anders.

  
  
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

  
Simulationsprotokoll
xcelium> run
i=1
i=1
i=1
i=1
xmsim: *W,RNQUIE: Simulation is complete.

Globale Aufgaben

Aufgaben, die außerhalb aller Module deklariert werden, heißen global Aufgaben, da sie einen globalen Geltungsbereich haben und in jedem Modul aufgerufen werden können.

  
  
// This task is outside all modules
task display();
  $display("Hello World !");
endtask

module des;
  initial begin
    display();
  end
endmodule

  
Simulationsprotokoll
xcelium> run
Hello World !
xmsim: *W,RNQUIE: Simulation is complete.

Wenn die Aufgabe innerhalb des Moduls deklariert wurde, müsste sie in Bezug auf den Modulinstanznamen aufgerufen werden.

  
  
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

  
Simulationsprotokoll
xcelium> run
Hello World
Hello World
xmsim: *W,RNQUIE: Simulation is complete.

Unterschied zwischen function und task

Obwohl Verilog-Funktionen und -Tasks ähnlichen Zwecken dienen, gibt es einige bemerkenswerte Unterschiede zwischen ihnen.

Funktion Aufgabe
Kann keine zeitsteuernden Anweisungen/Verzögerungen haben und wird daher in derselben Simulationszeiteinheit ausgeführt Kann zeitsteuernde Aussagen/Verzögerungen enthalten und darf erst zu einem anderen Zeitpunkt abgeschlossen werden
Eine Aufgabe kann aufgrund der obigen Regel nicht aktiviert werden Kann andere Aufgaben und Funktionen aktivieren
Sollte mindestens ein Eingabeargument haben und darf keine Ausgabe- oder Inout-Argumente haben Kann null oder mehr Argumente beliebigen Typs haben
Kann nur einen einzelnen Wert zurückgeben Kann keinen Wert zurückgeben, kann aber denselben Effekt mit Ausgabeargumenten erzielen

Wenn eine Funktion versucht, einen task aufzurufen oder eine zeitraubende Anweisung enthalten, meldet der Compiler einen Fehler.

  
  
module tb;
  reg signal;
  
  initial wait_for_1(signal);
  
  function wait_for_1(reg signal);
    #10;
  endfunction
endmodule

  
Simulationsprotokoll
    #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)].

Aufgabe deaktivieren

Aufgaben können mit disable deaktiviert werden Schlüsselwort.

  
  
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

  

Beim Anzeigen Aufgabe wurde vom ersten initial gestartet Block, T_DISPLAY gestartet und deaktiviert, als die Zeit 50 Einheiten erreichte. Sofort startete der nächste Block S_DISPLAY und lief bis zum Ende um 80 Einheiten.

Simulationsprotokoll
xcelium> run
[0] T_Task started
[60] S_Task started
[80] S_Task ended
xmsim: *W,RNQUIE: Simulation is complete.


Verilog

  1. Verilog-Tutorial
  2. Verilog-Verkettung
  3. Verilog-Aufgaben
  4. Verilog-Blockierung und Nicht-Blockierung
  5. Verilog-Funktionen
  6. Verilog-Aufgabe
  7. Verilog Hierarchischer Referenzbereich
  8. Verilog-Taktgenerator
  9. Verilog-Anzeigeaufgaben
  10. Verilog Math-Funktionen