Verilog-functies
Vaak vinden we bepaalde stukjes code herhalend en meerdere keren aangeroepen binnen de RTL. Ze nemen meestal geen simulatietijd in beslag en kunnen complexe berekeningen met zich meebrengen die met verschillende gegevenswaarden moeten worden gedaan. In dergelijke gevallen kunnen we een function
. declareren en plaats de herhalende code in de functie en laat deze het resultaat retourneren. Dit zal het aantal regels in de RTL drastisch verminderen, aangezien u nu alleen nog een functieaanroep hoeft te doen. en gegevens doorgeven waarop de berekening moet worden uitgevoerd. In feite lijkt dit erg op de functies in C.
Het doel van een functie is om een waarde terug te geven die in een expressie moet worden gebruikt. Een functiedefinitie begint altijd met het trefwoord function
gevolgd door het retourtype, de naam en een poortlijst tussen haakjes. Verilog weet dat een functiedefinitie voorbij is wanneer het de endfunction
. vindt trefwoord. Merk op dat voor een functie ten minste één invoer moet zijn gedeclareerd en dat het retourtype void
. zal zijn als de functie niets teruggeeft.
Syntaxis
function [automatic] [return_type] name ([port_list]);
[statements]
endfunction
Het trefwoord automatic
maakt de functie reentrant en items die binnen de taak zijn gedeclareerd, worden dynamisch toegewezen in plaats van gedeeld tussen verschillende aanroepen van de taak. Dit is handig voor recursieve functies en wanneer dezelfde functie gelijktijdig wordt uitgevoerd door N processen wanneer gevorkt.
Functieverklaringen
Er zijn twee manieren om invoer voor een functie te declareren:
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
Een waarde teruggeven van een functie
De functiedefinitie zal impliciet een interne variabele creëren met dezelfde naam als die van de functie. Daarom is het illegaal om een andere variabele met dezelfde naam binnen het bereik van de functie te declareren. De retourwaarde wordt geïnitialiseerd door het functieresultaat toe te wijzen aan de interne variabele.
sum = a + b;
Een functie aanroepen
Een functieaanroep is een operand met een uitdrukking en heeft een syntaxis zoals hieronder weergegeven.
reg [7:0] result;
reg [7:0] a, b;
initial begin
a = 4;
b = 5;
#10 result = sum (a, b);
end
Functieregels
- Een functie kan geen tijdgestuurde instructies bevatten zoals # , @ , wacht , geposeerd , negeren
- Een functie kan geen taak starten omdat het simulatietijd kan kosten, maar kan andere functies aanroepen
- Een functie moet ten minste één invoer hebben
- Een functie mag geen niet-blokkerende toewijzingen hebben of
force-release
ofassign-deassign
- Een functie kan geen triggers hebben
- Een functie kan geen output of inout hebben
Recursieve functies
Functies die zichzelf aanroepen, worden recursieve functies genoemd. In het onderstaande voorbeeld wordt een recursieve functie geschreven om de faculteit van een gegeven getal te berekenen.
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
Simulatielogboek 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