Verilog-2005 admite algunas funciones matemáticas simples y los tipos de datos de sus parámetros solo pueden ser enteros y reales.
Función matemática de tipo entero
$clog2 es una función logarítmica de base 2, el resultado se redondea y el formato típico del valor de retorno es:
resultado entero;
resultado = $obstrucción2(n);
La aplicación más típica es encontrar el ancho de bits de una variable por medio de la parametrización.El uso se ha presentado en detalle en otro artículo: ¿Cómo igualar el ancho de bits de una variable en el diseño de Verilog? ($función del sistema obstruir2)
Función matemática de tipo real
Su tipo de datos de parámetro es de tipo real, y el valor de retorno también es de tipo real, lo que significa que las siguientes funciones matemáticas no se pueden sintetizar:
Función | Descripción |
---|---|
$ln(x) | N logaritmo natural (logaritmo en base e) |
$log10(x) | Logaritmo decimal (logaritmo en base 10) |
exp(x) | e^x,e=2.718281828... |
sqrt(x) | raíz cuadrada |
$poder(x, y) | x^y |
$piso(x) | redondear a la baja |
$ techo (x) | Redondeado |
$hipot(x, y) | sqrt(xx + yy). Cuadrado y raíz de dos números |
$sin(x) | pecado |
$cos(x) | porque |
$tan(x) | broncearse |
$asen(x) | arcsen |
$acos(x) | arccos |
$atán(x) | arccos |
$atán2(x, y) | arcotangente de x/y |
$nacimiento(x) | seno hiperbólico |
$cosh(x) | coseno hiperbólico |
$bronceado(x) | tangente hiperbólica |
$asinh(x) | seno hiperbólico inverso |
$acosh(x) | coseno hiperbólico inverso |
$atanh(x) | tangente hiperbólica inversa |
Escriba un banco de pruebas simple para modelsim para verificar:
module tb_math_fuc;
real x, y; //这些函数的参数需要是real类型,返回也是real类型
initial begin //0.3f表示取小数点后3位,下同
x = 10000;$display("$log10(%0.3f) = %0.3f", x, $log10(x)); //以10为底的对数
x = 1;$display("$ln(%0.3f) = %0.3f", x, $ln(x)); //以e为底的对数
x = 2;$display("$exp(%0.3f) = %0.3f", x, $exp(x)); //e^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^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;$display("$sin(%0.3f) = %0.3f", x, $sin(x)); //sin函数
x = 90 * (22.0/7.0) / 180;$display("$cos(%0.3f) = %0.3f", x, $cos(x)); //cos函数
x = 45 * (22.0/7.0) / 180;$display("$tan(%0.3f) = %0.3f", x, $tan(x)); //tan函数
x = 0.5;$display("$asin(%0.3f) = %0.3f rad, %0.3f deg", x, $asin(x), $asin(x) * 7.0/22.0 * 180);//arcsin函数
x = 0;$display("$acos(%0.3f) = %0.3f rad, %0.3f deg", x, $acos(x), $acos(x) * 7.0/22.0 * 180); //arccos函数
x = 1;$display("$atan(%0.3f) = %0.3f rad, %f deg", x, $atan(x), $atan(x) * 7.0/22.0 * 180); //arctan函数
end
endmodule
Aquí está el resultado de la verificación: