Fonctions Verilog
Souvent, nous constatons que certains morceaux de code sont 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 ce cas, on peut déclarer un function
et placez le code répétitif à l'intérieur de la fonction et permettez-lui de renvoyer le résultat. Cela réduira considérablement le nombre de lignes dans le RTL puisque tout ce que vous avez à faire maintenant est de faire un appel de fonction et transmettre des 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 renvoyer une valeur qui doit être 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 endfunction
mot-clé. 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] [return_type] name ([port_list]);
[statements]
endfunction
Le mot-clé automatic
rendra la fonction réentrante et les éléments déclarés dans la tâche sont alloués dynamiquement plutôt que partagés entre les 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'elle est forkée.
Déclarations de fonction
Il existe deux manières de déclarer des entrées à 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
Renvoyer une valeur d'une fonction
La définition de la fonction créera implicitement une variable interne du même nom que celui de la fonction. Par conséquent, il est illégal de déclarer une autre variable du même nom à l'intérieur de la portée de la fonction. La valeur de retour est initialisée en affectant 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 indiqué 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 de fonctionnement
- Une fonction ne peut pas contenir d'instructions contrôlées par le temps comme # , @ , attendez , posege , negative
- Une fonction ne peut pas démarrer une tâche car elle peut 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
ouassign-deassign
- Une fonction ne peut pas avoir de déclencheurs
- Une fonction ne peut pas avoir de sortie ou d'entrée
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 la factorielle d'un nombre donné.
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
Journal de simulation 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