Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Industrial programming >> Verilog

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-release of assign-deassign hebben
  • 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

  1. 10 Essentiële Insight-functies voor het optimaliseren van Stratasys FDM-printen
  2. C++ Functies Uitgelegd met Praktische Codevoorbeelden
  3. C-functies: Structuur, declaratie, aanroep en argumenten
  4. Verilog beheersen: Complete tutorial voor digitale schakelingontwerp
  5. Verilog concatenatie beheersen: Een praktische gids
  6. Verilog-toewijzingen begrijpen: types, syntax en best practices
  7. Verilog Blocking vs. Non-Blocking: belangrijkste verschillen uitgelegd
  8. Verilog Math Functions beheersen voor efficiënt Hardware-ontwerp
  9. MATLAB Functies: Definitie, Werkruimte, In- en Outputs
  10. Python lambda-functies beheersen: praktische voorbeelden & best practices
  11. Python Functions Uitgelegd: Herbruikbare Code Modules Bouwen