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