Verilog Math-Funktionen
Verilog-Mathematikfunktionen können anstelle von konstanten Ausdrücken verwendet werden und unterstützen sowohl Integer und echt Mathematik.
Ganzzahlige mathematische Funktionen
Die Funktion $clog2
gibt die Obergrenze von log2 zurück des gegebenen Arguments. Dies wird normalerweise verwendet, um die minimale Breite zu berechnen, die erforderlich ist, um einen Speicher einer bestimmten Größe zu adressieren.
Wenn das Design beispielsweise 7 parallele Addierer hat, dann ist die Mindestanzahl von Bits, die erforderlich ist, um alle 7 Addierer darzustellen, $clog2
von 7 ergibt 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
Beachten Sie, dass das Signal active_unit 3 Bits hat, um insgesamt 5 Einheiten zu speichern.
Simulationsprotokollxcelium> run active_unit = 001 active_unit = 111 active_unit = 000 xmsim: *W,RNQUIE: Simulation is complete.
Echte mathematische Funktionen
Diese Systemfunktionen akzeptieren real Argumente und geben ein Real zurück Nummer.
Funktion | Beschreibung |
---|---|
$ln(x) | Natürlicher Logarithmus log(x) |
$log10(x) | Dezimallogarithmus log10(x) |
exp(x) | Exponential von x (e x ) wobei e=2,718281828... |
Quadrat(x) | Quadratwurzel von x |
$pow(x, y) | x y |
$floor(x) | Etage x |
$ceil(x) | Decke x |
$sin(x) | Sinus von x, wobei x im Bogenmaß angegeben ist |
$cos(x) | Kosinus von x, wobei x im Bogenmaß angegeben ist |
$tan(x) | Tangens von x, wobei x im Bogenmaß angegeben ist |
$asin(x) | Arc-Sinus von x |
$acos(x) | Arc-Cosinus von x |
$atan(x) | Arkustangens von x |
$atan2(x, y) | Arkustangens von x/y |
$hypot(x, y) | Hypotenuse von x und y :sqrt(x x + j j ) |
$sinh(x) | Hyperbolischer Sinus von x |
$cosh(x) | Hyperbolischer Kosinus von x |
$tanh(x) | Hyperbolic-Tangens von x |
$asinh(x) | Bogen-hyperbolischer Sinus von x |
$acosh(x) | Arc-hyperbolischer Kosinus von x |
$atanh(x) | Bogen-hyperbolischer Tangens von 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
Simulationsprotokoll 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