Funciones matemáticas de Verilog
Las funciones matemáticas de Verilog se pueden usar en lugar de expresiones constantes y admiten tanto integer y real matemáticas.
Funciones matemáticas enteras
La función $clog2
devuelve el techo de log2 del argumento dado. Esto se usa típicamente para calcular el ancho mínimo requerido para direccionar una memoria de un tamaño dado.
Por ejemplo, si el diseño tiene 7 sumadores paralelos, entonces la cantidad mínima de bits necesarios para representar los 7 sumadores es $clog2
de 7 que da 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
Tenga en cuenta que la señal active_unit tiene 3 bits para almacenar un total de 5 unidades.
Registro de simulaciónxcelium> run active_unit = 001 active_unit = 111 active_unit = 000 xmsim: *W,RNQUIE: Simulation is complete.
Funciones matemáticas reales
Estas funciones del sistema aceptan real argumentos y devolver un real número.
Función | Descripción |
---|---|
$ln(x) | Logaritmo natural log(x) |
$log10(x) | Logaritmo decimal log10(x) |
exp(x) | Exponencial de x (e x ) donde e=2.718281828... |
raíz cuadrada(x) | Raíz cuadrada de x |
$pow(x, y) | x y |
$piso(x) | Planta x |
$ceil(x) | Techo x |
$sin(x) | Seno de x donde x está en radianes |
$cos(x) | Coseno de x donde x está en radianes |
$tan(x) | Tangente de x donde x está en radianes |
$asin(x) | Arco-seno de x |
$acos(x) | Arco-coseno de x |
$atán(x) | Arco-tangente de x |
$atan2(x, y) | Arco-tangente de x/y |
$hipot(x, y) | Hipotenusa de x e y :sqrt(x x + y y ) |
$sinh(x) | Seno hiperbólico de x |
$cosh(x) | Coseno Hiperbólico de x |
$tanh(x) | Tangente Hiperbólica de x |
$asinh(x) | Arco-seno hiperbólico de x |
$acosh(x) | Arco-coseno hiperbólico de x |
$atanh(x) | Arco-hiperbólica 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
Registro de simulación 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