Dominar las funciones matemáticas en Verilog para diseño de hardware eficiente
Las funciones matemáticas de Verilog pueden usarse en lugar de expresiones constantes y soportan tanto matemáticas enteras como reales.
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 tamaño dado.
Por ejemplo, si el diseño tiene 7 sumadores en paralelo, entonces el número mínimo de bits requeridos para representar todos los 7 sumadores es $clog2 de 7 que produce 3.
module des #(parameter NUM_UNITS = 7)
// El uso de esta función de sistema ayuda a reducir el
// número de cables de entrada a este módulo
(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.
xcelium> run active_unit = 001 active_unit = 111 active_unit = 000 xmsim: *W,RNQUIE: Simulation is complete.
Funciones matemáticas reales
Estas funciones de sistema aceptan argumentos reales y devuelven un número real.
| Función | Descripción |
|---|---|
| $ln(x) | Logaritmo natural log(x) |
| $log10(x) | Logaritmo decimal log10(x) |
| $exp(x) | Exponencial de x (ex) donde e=2.718281828... |
| $sqrt(x) | Raíz cuadrada de x |
| $pow(x, y) | xy |
| $floor(x) | Piso de x |
| $ceil(x) | Techo de 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 |
| $atan(x) | Arco-tangente de x |
| $atan2(x, y) | Arco-tangente de x/y |
| $hypot(x, y) | Hipotenusa de x e y: sqrt(x2 + y2) |
| $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-tangente hiperbólica 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 grados a radianes
$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
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
- Dominar Verilog: Tutorial completo para diseño de circuitos digitales
- Dominar la concatenación en Verilog: Guía práctica
- Comprender las asignaciones en Verilog: tipos, sintaxis y mejores prácticas
- Bloqueante vs. No bloqueante en Verilog: Diferencias clave explicadas
- Dominar las funciones en Verilog para diseño RTL eficiente
- Comprender las Tasks en Verilog: Funciones vs Tasks, sintaxis y uso
- Generador de reloj en Verilog: Guía de diseño e implementación
- Dominar $timeformat en Verilog: Control de precisión y visualización
- Comprender e imprimir timescales de Verilog en cualquier alcance
- Dominando la E/S de Archivos en Verilog: Abrir, Leer, Escribir y Cerrar
- Guía para Principiantes de Verilog: Ejemplo Hola Mundo