Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Industrial programming >> Verilog

Verilog-taak

Een function is bedoeld om enige verwerking op de invoer uit te voeren en een enkele waarde terug te geven, terwijl een task is algemener en kan meerdere resultaatwaarden berekenen en retourneren met behulp van output en inout typ argumenten. Taken kunnen tijdrovende simulatie-elementen bevatten, zoals @ , geposeerd en anderen.

Syntaxis

Een taak hoeft geen set argumenten in de poortlijst te hebben, in welk geval deze leeg kan worden gehouden.

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

Als een taak statisch is, worden alle lidvariabelen gedeeld door verschillende aanroepen van dezelfde taak die is gestart om gelijktijdig te worden uitgevoerd

  
  
	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

  

De argumenten die de taak mogelijk maken (x, y, z) komen overeen met de argumenten (a, b, c) die door de taak zijn gedefinieerd. Sinds een en b zijn invoer, waarden van x en j wordt geplaatst in a en b respectievelijk. Omdat c wordt gedeclareerd als een uitgang en verbonden met z tijdens het aanroepen wordt de som automatisch doorgegeven aan de variabele z van c .

Automatische taak

Het trefwoord automatic zal de taak opnieuw invoeren, anders is deze standaard statisch. Alle items binnen automatisch taken worden dynamisch toegewezen voor elke aanroep en worden niet gedeeld tussen aanroepen van dezelfde taak die gelijktijdig worden uitgevoerd. Merk op dat automatic taakitems zijn niet toegankelijk via hiërarchische verwijzingen.

Overweeg ter illustratie de statische taakweergave die wordt aangeroepen vanuit verschillende initial blokken die gelijktijdig worden uitgevoerd. In dit geval wordt de variabele integer die binnen de taak is gedeclareerd, gedeeld door alle aanroepen van de taak en daarom moet de weergegeven waarde voor elke aanroep toenemen.

  
  
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

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

Als de taak automatisch wordt gemaakt, krijgt elke aanroep van de taak een andere ruimte in het simulatiegeheugen en gedraagt ​​deze zich 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

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

Globale taken

Taken die buiten alle modules worden gedeclareerd, worden algemeen genoemd taken omdat ze een globaal bereik hebben en binnen elke module kunnen worden aangeroepen.

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

module des;
  initial begin
    display();
  end
endmodule

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

Als de taak werd gedeclareerd in de module des, zou deze moeten worden aangeroepen met verwijzing naar de naam van de module-instantie.

  
  
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

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

Verschil tussen function en task

Hoewel de functies en taken van Verilog vergelijkbare doelen dienen, zijn er een paar opmerkelijke verschillen tussen hen.

Functie Taak
Kan geen tijdbepalende statements/vertraging hebben, en wordt daarom uitgevoerd in dezelfde simulatietijdseenheid Kan tijdbepalende verklaringen/vertragingen bevatten en kan alleen op een ander moment worden voltooid
Kan een taak niet inschakelen vanwege de bovenstaande regel Kan andere taken en functies inschakelen
Moet ten minste één invoerargument hebben en mag geen uitvoer- of inout-argumenten hebben Kan nul of meer argumenten van elk type hebben
Kan slechts één waarde retourneren Kan geen waarde retourneren, maar kan hetzelfde effect bereiken met uitvoerargumenten

Wanneer een functie een task . probeert aan te roepen of een tijdrovende verklaring bevatten, meldt de compiler een fout.

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

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

Taak uitschakelen

Taken kunnen worden uitgeschakeld met behulp van de disable zoekwoord.

  
  
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

  

Wanneer weergeven taak werd gelanceerd door de eerste initial blok, T_DISPLAY begon en werd uitgeschakeld toen de tijd 50 eenheden bereikte. Onmiddellijk begon het volgende blok S_DISPLAY en liep naar voltooiing met 80 eenheden.

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


Verilog

  1. Verilog-zelfstudie
  2. Verilog-aaneenschakeling
  3. Verilog-opdrachten
  4. Verilog blokkeren en niet-blokkeren
  5. Verilog-functies
  6. Verilog-taak
  7. Verilog hiërarchisch referentiebereik
  8. Verilog-klokgenerator
  9. Verilog-weergavetaken
  10. Verilog wiskundige functies
  11. Verilog Tijdnotatie