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.
xcelium> run [0] T_Task started [60] S_Task started [80] S_Task ended xmsim: *W,RNQUIE: Simulation is complete.
Verilog