Verilog wiskundige functies
Wiskundige functies van Verilog kunnen worden gebruikt in plaats van constante uitdrukkingen en ondersteunen beide integer en echt wiskunde.
Gehele wiskundige functies
De functie $clog2
geeft het plafond van log2 . terug van het gegeven argument. Dit wordt meestal gebruikt om de minimale breedte te berekenen die nodig is om een geheugen van een bepaalde grootte te adresseren.
Als het ontwerp bijvoorbeeld 7 parallelle optellers heeft, is het minimum aantal bits dat nodig is om alle 7 optellers weer te geven $clog2
van 7 die 3 oplevert.
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
Merk op dat het signaal active_unit 3-bits heeft om in totaal 5 eenheden op te slaan.
Simulatielogboekxcelium> run active_unit = 001 active_unit = 111 active_unit = 000 xmsim: *W,RNQUIE: Simulation is complete.
Reële wiskundige functies
Deze systeemfuncties accepteren echte argumenten en retourneer een echte nummer.
Functie | Beschrijving |
---|---|
$ln(x) | Natuurlijke logaritme log(x) |
$log10(x) | Decimaal logaritme log10(x) |
exp(x) | Exponentieel van x (e x ) waarbij e=2.718281828... |
sqrt(x) | Vierkante wortel van x |
$pow(x, y) | x y |
$floor(x) | Verdieping x |
$ceil(x) | Plafond x |
$sin(x) | Sinus van x waarbij x in radialen staat |
$cos(x) | Cosinus van x waarbij x in radialen is |
$tan(x) | Tangens van x waarbij x in radialen staat |
$asin(x) | Boog-sinus van x |
$acos(x) | Boogcosinus van x |
$atan(x) | Boogtangens van x |
$atan2(x, y) | Boogtangens van x/y |
$hypot(x, y) | Hypotenusa van x en y :sqrt(x x + y y ) |
$sinh(x) | Hyperbolische sinus van x |
$cosh(x) | Hyperbolische cosinus van x |
$tanh(x) | Hyperbolische-Tangens van x |
$asinh(x) | Boog-hyperbolische sinus van x |
$acosh(x) | Boog-hyperbolische cosinus van x |
$atanh(x) | Boog-hyperbolische tangens van 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
Simulatielogboek 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