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