Verilog-functies beheersen voor efficiënt RTL-ontwerp
Vaak vindt men bepaalde stukken code die repetitief zijn en meerdere keren binnen de RTL worden aangeroepen. Ze consumeren meestal geen simulatiettijd en kunnen complexe berekeningen bevatten die met verschillende datawaarden uitgevoerd moeten worden. In dergelijke gevallen kunnen we een function declareren, de repetitieve code in de functie plaatsen en laten deze het resultaat teruggeven. Dit vermindert het aantal regels in de RTL aanzienlijk, aangezien je nu alleen een functie-aanroep hoeft te doen en data door te geven waarop de berekening moet worden uitgevoerd. Dit is in feite heel vergelijkbaar met functies in C.
Het doel van een functie is om een waarde terug te geven die in een expressie gebruikt wordt. Een functiedefinitie begint altijd met het trefwoord function gevolgd door het retouroptype, de naam en een poortlijst tussen haakjes. Verilog weet dat een functiedefinitie voorbij is wanneer het het trefwoord endfunction vindt. Let op dat een functie minstens één input gedeclareerd moet hebben en het retouroptype void is als de functie niets teruggeeft.
Syntax
function [automatic] [retouroptype] naam ([poortlijst]);
[statements]
endfunction
Het trefwoord automatic maakt de functie reentrant en worden items die binnen de task gedeclareerd zijn, dynamisch toegewezen in plaats van gedeeld tussen verschillende aanroepen van de task. Dit is nuttig voor recursieve functies en wanneer dezelfde functie gelijktijdig door N processen wordt uitgevoerd wanneer geforkt.
Functiedeclaraties
Er zijn twee manieren om inputs aan 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 vanuit een functie
De functiedefinitie creëert impliciet een interne variabele met dezelfde naam als de functie. Het is daarom illegaal om een andere variabele met dezelfde naam binnen de scope van de functie te declareren. De retourwaarde geïnitialiseerd door het functieresultaat toe te wijzen aan de interne variabele.
sum = a + b;
Een functie aanroepen
functie-aanroep is een operand met een expressie en heeft een syntax als hieronder getoond.
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 tijdsgecontroleerde statements bevatten zoals #, @, wait, posedge, negedge
- Een functie kan geen task starten omdat het simulatiettijd kan consumeren, maar kan wel andere functies aanroepen
- Een functie moet minstens één input hebben
- Een functie kan geen non-blocking toewijzingen of
force-releaseofassign-deassignhebben - Een functie kan geen triggers hebben
- Een functie kan geen output of inout hebben
Recursieve functies
Functies die zichzelf aanroepen heten recursieve functies. In het onderstaande voorbeeld is 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;
if (i) begin
result = i * factorial(i-1);
$display("i=%0d result=%0d", i, result);
end else
result = 1;
return result;
endfunction
endmodule
Simulatie-log
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 Essentiële Insight-functies voor het optimaliseren van Stratasys FDM-printen
- C++ Functies Uitgelegd met Praktische Codevoorbeelden
- C-functies: Structuur, declaratie, aanroep en argumenten
- Verilog beheersen: Complete tutorial voor digitale schakelingontwerp
- Verilog concatenatie beheersen: Een praktische gids
- Verilog-toewijzingen begrijpen: types, syntax en best practices
- Verilog Blocking vs. Non-Blocking: belangrijkste verschillen uitgelegd
- Verilog Math Functions beheersen voor efficiënt Hardware-ontwerp
- MATLAB Functies: Definitie, Werkruimte, In- en Outputs
- Python lambda-functies beheersen: praktische voorbeelden & best practices
- Python Functions Uitgelegd: Herbruikbare Code Modules Bouwen