Fonctions mathématiques Verilog
Les fonctions mathématiques Verilog peuvent être utilisées à la place des expressions constantes et prennent en charge à la fois entier et réel mathématiques.
Fonctions mathématiques entières
La fonction $clog2
renvoie le plafond de log2 de l'argument donné. Ceci est généralement utilisé pour calculer la largeur minimale requise pour adresser une mémoire de taille donnée.
Par exemple, si la conception comporte 7 additionneurs parallèles, le nombre minimum de bits requis pour représenter les 7 additionneurs est $clog2
de 7 qui donne 3.
module des
#(parameter NUM_UNITS = 7)
// Use of this system function helps to reduce the
// number of input wires to this 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 un total de 5 unités.
Journal de simulationxcelium> 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 réel arguments et renvoie un réel numéro.
Fonction | Description |
---|---|
$ln(x) | Logarithme naturel log(x) |
$log10(x) | Logarithme décimal log10(x) |
exp(x) | Exponentielle de x (e x ) où e=2.718281828... |
carré(x) | Racine carrée de x |
$pow(x, y) | x y |
$floor(x) | Étage x |
$plafond(x) | Plafond 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(x x + a a ) |
$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-hyperbolique tangente 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; // convert 30 degrees to 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