Verilog-Funktionen
Oft stellen wir fest, dass sich bestimmte Codeteile wiederholen und innerhalb der RTL mehrmals aufgerufen werden. Sie verbrauchen meistens keine Simulationszeit und können komplexe Berechnungen beinhalten, die mit unterschiedlichen Datenwerten durchgeführt werden müssen. In solchen Fällen können wir einen function
deklarieren und platzieren Sie den sich wiederholenden Code in der Funktion und lassen Sie das Ergebnis zurückgeben. Dadurch wird die Anzahl der Zeilen in der RTL drastisch reduziert, da Sie jetzt nur noch einen Funktionsaufruf ausführen müssen und Daten weiterleiten, an denen die Berechnung durchgeführt werden muss. Tatsächlich ist dies den Funktionen in C sehr ähnlich.
Der Zweck einer Funktion besteht darin, einen Wert zurückzugeben, der in einem Ausdruck verwendet werden soll. Eine Funktionsdefinition beginnt immer mit dem Schlüsselwort function
gefolgt von Rückgabetyp, Name und einer in Klammern eingeschlossenen Portliste. Verilog weiß, dass eine Funktionsdefinition beendet ist, wenn es den endfunction
findet Stichwort. Beachten Sie, dass für eine Funktion mindestens eine Eingabe deklariert sein 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 und innerhalb der Aufgabe deklarierte Elemente werden dynamisch zugewiesen und nicht zwischen verschiedenen Aufrufen der Aufgabe geteilt. Dies ist nützlich für rekursive Funktionen und wenn die gleiche Funktion beim Forken gleichzeitig von N Prozessen ausgeführt wird.
Funktionsdeklarationen
Es gibt zwei Möglichkeiten, Eingaben für eine 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 Werts von einer Funktion
Die Funktionsdefinition erstellt implizit eine interne Variable mit dem gleichen Namen wie die Funktion. Daher ist es illegal, eine andere Variable mit demselben Namen innerhalb des Gültigkeitsbereichs der Funktion zu deklarieren. Der Rückgabewert wird durch die Zuweisung des Funktionsergebnisses an die interne Variable initialisiert.
sum = a + b;
Aufruf einer Funktion
Ein Funktionsaufruf ist ein Operand mit einem Ausdruck und hat die unten gezeigte Syntax.
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 # enthalten , @ , warten , gestellt , Nege
- Eine Funktion kann keine Aufgabe starten, da sie Simulationszeit verbrauchen kann, aber andere Funktionen aufrufen kann
- Eine Funktion sollte mindestens einen Eingang haben
- Eine Funktion darf keine nicht blockierenden Zuweisungen oder
force-release
haben oderassign-deassign
- Eine Funktion kann keine Auslöser haben
- Eine Funktion kann keinen Ausgang oder Eingang 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;
// This function is called within the body of this
// function with a different argument
if (i) begin
result = i * factorial(i-1);
$display("i=%0d result=%0d", i, result);
end else
result = 1;
return result;
endfunction
endmodule
Simulationsprotokoll 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