Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Industrial programming >> Verilog

Maîtriser les Fonctions Verilog pour une Conception RTL Efficace

On trouve souvent certains morceaux de code répétitifs et appelés plusieurs fois dans le RTL. Ils ne consomment généralement pas de temps de simulation et peuvent impliquer des calculs complexes qui doivent être effectués avec différentes valeurs de données. Dans de tels cas, on peut déclarer une function et placer le code répétitif à l'intérieur de la fonction pour qu'elle retourne le résultat. Cela réduira drastiquement le nombre de lignes dans le RTL car tout ce qu'il faut faire maintenant est un appel de fonction et passer les données sur lesquelles le calcul doit être effectué. En fait, cela ressemble beaucoup aux fonctions en C.

Le but d'une fonction est de retourner une valeur qui sera utilisée dans une expression. Une définition de fonction commence toujours par le mot-clé function suivi du type de retour, du nom et d'une liste de ports entre parenthèses. Verilog sait qu'une définition de fonction est terminée lorsqu'il trouve le mot-clé endfunction. Notez qu'une fonction doit avoir au moins une entrée déclarée et le type de retour sera void si la fonction ne retourne rien.

Syntaxe

function [automatic] [type_retour] nom ([liste_ports]);
  [instructions]
endfunction

Le mot-clé automatic rendra la fonction rentrante et les éléments déclarés dans la tâche seront alloués dynamiquement plutôt que partagés entre différentes invocations de la tâche. Cela sera utile pour les fonctions récursives et lorsque la même fonction est exécutée simultanément par N processus lorsqu'ils sont forkés.

Déclarations de Fonctions

Il y a deux façons de déclarer les entrées d'une fonction :

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

Retourner une Valeur depuis une Fonction

La définition de fonction créera implicitement une variable interne du même nom que celui de la fonction. Il est donc illégal de déclarer une autre variable du même nom dans le scope de la fonction. La valeur de retour est initialisée en assignant le résultat de la fonction à la variable interne.

sum = a + b;

Appeler une Fonction

Un appel de fonction est un opérande avec une expression et a une syntaxe comme montrée ci-dessous.

reg [7:0] result;
reg [7:0] a, b;
initial begin
  a = 4;
  b = 5;
  #10 result = sum (a, b);
end

Règles des Fonctions

  • Une fonction ne peut pas contenir d'instructions contrôlées par le temps comme #, @, wait, posedge, negedge
  • Une fonction ne peut pas démarrer une tâche car elle pourrait consommer du temps de simulation, mais peut appeler d'autres fonctions
  • Une fonction doit avoir au moins une entrée
  • Une fonction ne peut pas avoir d'affectations non-bloquantes ou force-release ou assign-deassign
  • Une fonction ne peut pas avoir de déclencheurs
  • Une fonction ne peut pas avoir de sortie ou inout

Fonctions Récursives

Les fonctions qui s'appellent elles-mêmes sont appelées fonctions récursives. Dans l'exemple ci-dessous, une fonction récursive est écrite pour calculer le factoriel d'un nombre donné.

module tb;
  initial begin
    integer result = factorial(4);
    $display("factoriel(4) = %0d", result);
  end

  function automatic integer factorial(integer i);
    integer result = i;
    // Cette fonction est appelée dans le corps de cette
    // fonction avec un argument différent
    if (i) begin
      result = i * factorial(i-1);
      $display("i=%0d result=%0d", i, result);
    end else
      result = 1;
    return result;
  endfunction
endmodule

Journal de Simulation

xcelium> run
i=1 result=1
i=2 result=2
i=3 result=6
i=4 result=24
factoriel(4) = 24
xmsim: *W,RNQUIE: Simulation is complete

Verilog

  1. 10 fonctions essentielles d'Insight pour optimiser l'impression FDM Stratasys
  2. Les Fonctions en C++ Expliquées avec des Exemples de Code Pratiques
  3. Maîtriser les fonctions lambda Python : exemples pratiques et bonnes pratiques
  4. Maîtriser Verilog : Tutoriel complet pour la conception de circuits numériques
  5. Maîtriser la concaténation Verilog : Guide pratique
  6. Comprendre les affectations Verilog : Types, Syntaxe et Bonnes Pratiques
  7. Verilog Blocking vs Non-Blocking : Différences Clés Expliquées
  8. Maîtriser les Fonctions Mathématiques Verilog pour une Conception Matérielle Efficace
  9. Maîtriser les fonctions en C : Structure, déclaration et bonnes pratiques