Maîtriser les Fonctions Mathématiques Verilog pour une Conception Matérielle Efficace
Les fonctions mathématiques Verilog peuvent être utilisées à la place d'expressions constantes et supportent à la fois les mathématiques entier et réel.
Fonctions Mathématiques Entières
La fonction $clog2 retourne le plafond de log2 de l'argument donné. Cela est typiquement utilisé pour calculer la largeur minimale requise pour adresser une mémoire de taille donnée.
Par exemple, si la conception a 7 additionneurs parallèles, alors le nombre minimum de bits requis pour représenter tous les 7 additionneurs est $clog2 de 7 qui donne 3.
module des #(parameter NUM_UNITS = 7)
// L'utilisation de cette fonction système aide à réduire le
// nombre de fils d'entrée vers ce module
(input [$clog2(NUM_UNITS)-1:0] active_unit);
initial $monitor("active_unit = %d", active_unit);
endmodule
`define NUM_UNITS 5
module tb;
integer i;
reg [`NUM_UNITS-1:0] active_unit;
des #(.NUM_UNITS(`NUM_UNITS)) u0(active_unit);
initial begin
active_unit = 1;
#10 active_unit = 7;
#10 active_unit = 8;
end
endmodule
Notez que le signal active_unit a 3 bits pour stocker 5 unités au total.
Journal de Simulation
xcelium> run active_unit = 001 active_unit = 111 active_unit = 000 xmsim: *W,RNQUIE: Simulation is complete.
Fonctions Mathématiques Réelles
Ces fonctions système acceptent des arguments real et retournent un nombre real.
| Fonction | Description |
|---|---|
| $ln(x) | Logarithme naturel log(x) |
| $log10(x) | Logarithme décimal log10(x) |
| $exp(x) | Exponentielle de x (ex) où e=2.718281828... |
| $sqrt(x) | Racine carrée de x |
| $pow(x, y) | xy |
| $floor(x) | Plancher de x |
| $ceil(x) | Plafond de x |
| $sin(x) | Sinus de x où x est en radians |
| $cos(x) | Cosinus de x où x est en radians |
| $tan(x) | Tangente de x où x est en radians |
| $asin(x) | Arc-Sinus de x |
| $acos(x) | Arc-Cosinus de x |
| $atan(x) | Arc-tangente de x |
| $atan2(x, y) | Arc-tangente de x/y |
| $hypot(x, y) | Hypoténuse de x et y : sqrt(x2 + y2) |
| $sinh(x) | Sinus hyperbolique de x |
| $cosh(x) | Cosinus hyperbolique de x |
| $tanh(x) | Tangente hyperbolique de x |
| $asinh(x) | Arc-sinus hyperbolique de x |
| $acosh(x) | Arc-cosinus hyperbolique de x |
| $atanh(x) | Arc-tangente hyperbolique de x |
module tb;
real x, y;
initial begin
x = 10000;
$display("$log10(%0.3f) = %0.3f", x, $log10(x));
x = 1;
$display("$ln(%0.3f) = %0.3f", x, $ln(x));
x = 2;
$display("$exp(%0.3f) = %0.3f", x, $exp(x));
x = 25;
$display("$sqrt(%0.3f) = %0.3f", x, $sqrt(x));
x = 5; y = 3;
$display("$pow(%0.3f, %0.3f) = %0.3f", x, y, $pow(x, y));
x = 2.7813;
$display("$floor(%0.3f) = %0.3f", x, $floor(x));
x = 7.1111;
$display("$ceil(%0.3f) = %0.3f", x, $ceil(x));
x = 30 * (22.0/7.0) / 180; // convertir 30 degrés en radians
$display("$sin(%0.3f) = %0.3f", x, $sin(x));
x = 90 * (22.0/7.0) / 180;
$display("$cos(%0.3f) = %0.3f", x, $cos(x));
x = 45 * (22.0/7.0) / 180;
$display("$tan(%0.3f) = %0.3f", x, $tan(x));
x = 0.5;
$display("$asin(%0.3f) = %0.3f rad, %0.3f deg", x, $asin(x), $asin(x) * 7.0/22.0 * 180);
x = 0;
$display("$acos(%0.3f) = %0.3f rad, %0.3f deg", x, $acos(x), $acos(x) * 7.0/22.0 * 180);
x = 1;
$display("$atan(%0.3f) = %0.3f rad, %f deg", x, $atan(x), $atan(x) * 7.0/22.0 * 180);
end
endmodule
Journal de Simulation
xcelium> run $log10(10000.000) = 4.000 $ln(1.000) = 0.000 $exp(2.000) = 7.389 $sqrt(25.000) = 5.000 $pow(5.000, 3.000) = 125.000 $floor(2.781) = 2.000 $ceil(7.111) = 8.000 $sin(0.524) = 0.500 $cos(1.571) = -0.001 $tan(0.786) = 1.001 $asin(0.500) = 0.524 rad, 29.988 deg $acos(0.000) = 1.571 rad, 89.964 deg $atan(1.000) = 0.785 rad, 44.981895 deg xmsim: *W,RNQUIE: Simulation is complete.
Verilog
- 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 Verilog pour une Conception RTL Efficace
- Comprendre les Tasks Verilog : Fonctions vs Tasks, Syntaxe et Utilisation
- Générateur d'Horloge Verilog : Guide de Conception et d'Implémentation
- Maîtriser Verilog $timeformat : Contrôle de Précision et d'Affichage
- Comprendre et Afficher les Timescales Verilog à Toute Portée