Verilog Functions meistern für effizientes RTL-Design
Oft findet man bestimmte Code-Stücke, die sich wiederholen und mehrmals im RTL aufgerufen werden. Sie verbrauchen meist keine Simulationszeit und können komplexe Berechnungen beinhalten, die mit unterschiedlichen Datenwerten durchgeführt werden müssen. In solchen Fällen kann man eine function deklarieren, den sich wiederholenden Code in die Funktion packen und ihr erlauben, das Ergebnis zurückzugeben. Dies reduziert die Zeilenanzahl im RTL drastisch, da man nun nur noch einen Funktionsaufruf tätigen und die Daten übergeben muss, auf denen die Berechnung basieren soll. Dies ist tatsächlich sehr ähnlich zu Funktionen in C.
Der Zweck einer Funktion ist es, einen Wert zurückzugeben, der in einem Ausdruck verwendet wird. Eine Funktionsdefinition beginnt immer mit dem Schlüsselwort function, gefolgt vom Rückgabetyp, Namen und einer Port-Liste in Klammern. Verilog erkennt, dass eine Funktionsdefinition vorbei ist, wenn es das Schlüsselwort endfunction findet. Beachten Sie, dass eine Funktion mindestens einen Input deklariert haben muss und der Rückgabetyp void sein wird, wenn die Funktion nichts zurückgibt.
Syntax
function [automatic] [return_type] name ([port_list]);
[statements]
endfunction
Das Schlüsselwort automatic macht die Funktion reentrant (wiederbetretbar), und innerhalb der Task deklarierte Elemente werden dynamisch allokiert statt zwischen verschiedenen Aufrufen der Task geteilt. Dies ist nützlich für rekursive Funktionen und wenn dieselbe Funktion gleichzeitig von N Prozessen ausgeführt wird, wenn sie geforkt werden.
Funktionsdeklarationen
Es gibt zwei Möglichkeiten, Inputs einer Funktion zu deklarieren:
function [7:0] sum;
input [7:0] a, b;
begin
sum = a + b;
end
endfunction
function [7:0] sum (input [7:0] a, b);
begin
sum = a + b;
end
endfunction
Rückgabe eines Wertes aus einer Funktion
Die Funktionsdefinition erstellt implizit eine interne Variable mit demselben Namen wie die Funktion. Daher ist es illegal, eine weitere Variable desselben Namens im Gültigkeitsbereich der Funktion zu deklarieren. Der Rückgabewert wird initialisiert, indem das Funktionsergebnis der internen Variable zugewiesen wird.
sum = a + b;
Funktionsaufruf
reg [7:0] result;
reg [7:0] a, b;
initial begin
a = 4;
b = 5;
#10 result = sum (a, b);
end
Funktionsregeln
- Eine Funktion darf keine zeitgesteuerten Anweisungen wie #, @, wait, posedge, negedge enthalten
- Eine Funktion kann keine Task starten, da dies Simulationszeit verbrauchen könnte, aber andere Funktionen aufrufen
- Eine Funktion sollte mindestens einen Input haben
- Eine Funktion darf keine Non-Blocking-Zuweisungen oder
force-releaseoderassign-deassignhaben - Eine Funktion darf keine Triggers haben
- Eine Funktion darf keine Output- oder Inout-Ports haben
Rekursive Funktionen
Funktionen, die sich selbst aufrufen, heißen rekursive Funktionen. Im unten gezeigten Beispiel wird eine rekursive Funktion geschrieben, um die Fakultät einer gegebenen Zahl zu berechnen.
module tb;
initial begin
integer result = factorial(4);
$display("factorial(4) = %0d", result);
end
function automatic integer factorial(integer i);
integer result = i;
// Diese Funktion wird innerhalb des Körpers dieser
// Funktion mit einem anderen Argument aufgerufen
if (i) begin
result = i * factorial(i-1);
$display("i=%0d result=%0d", i, result);
end else
result = 1;
return result;
endfunction
endmodule
Simulationslog:
xcelium> run i=1 result=1 i=2 result=2 i=3 result=6 i=4 result=24 factorial(4) = 24 xmsim: *W,RNQUIE: Simulation is complete
Verilog
- 10 wesentliche Insight-Features zur Optimierung des Stratasys FDM-Drucks
- C++-Funktionen erklärt: Mit praktischen Code-Beispielen
- Python Lambda-Funktionen meistern: Praxisbeispiele & Best Practices
- Verilog meistern: Komplettes Tutorial für digitales Schaltungsdesign
- Verilog Concatenation meistern: Praktischer Leitfaden
- Verilog Assignments verstehen: Typen, Syntax und Best Practices
- Verilog Blocking vs. Non-Blocking: Wichtige Unterschiede erklärt
- Verilog Math Functions meistern für effizientes Hardware-Design
- C-Funktionen meistern: Struktur, Deklaration & Best Practices
- MATLAB-Funktionen: Definition, Workspace, Ein- & Ausgaben