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

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 of assign-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

  1. 10 populaire functies in Stratasys Insight
  2. C++-functies met programmavoorbeelden
  3. Python Lambda-functies met VOORBEELDEN
  4. Verilog-zelfstudie
  5. Verilog-aaneenschakeling
  6. Verilog-opdrachten
  7. Verilog blokkeren en niet-blokkeren
  8. Verilog wiskundige functies
  9. C - Functies
  10. MATLAB - Functies
  11. Python - Functies