Verilog Math Functions meistern für effizientes Hardware-Design
Verilog-Mathematik-Funktionen können anstelle von konstanten Ausdrücken verwendet werden und unterstützen sowohl Integer- als auch Real-Mathematik.
Integer-Mathematik-Funktionen
Die Funktion $clog2 gibt das Ceiling von log2 des gegebenen Arguments zurück. Dies wird typischerweise verwendet, um die minimale Breite zu berechnen, die erforderlich ist, um einen Speicher gegebener Größe zu adressieren.
Zum Beispiel, wenn das Design 7 parallele Addierer hat, dann ist die minimale Anzahl der Bits, die erforderlich sind, um alle 7 Addierer darzustellen, $clog2 von 7, was 3 ergibt.
module des #(parameter NUM_UNITS = 7)
// Verwendung dieser Systemfunktion hilft, die
// Anzahl der Eingangsdrähte zu diesem Modul zu reduzieren
(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.
Simulationslog:
xcelium> run active_unit = 001 active_unit = 111 active_unit = 000 xmsim: *W,RNQUIE: Simulation is complete.
Real-Mathematik-Funktionen
Diese Systemfunktionen akzeptieren reelle Argumente und geben eine reelle Zahl zurück.
| Funktion | Beschreibung |
|---|---|
| $ln(x) | Natürlicher Logarithmus log(x) |
| $log10(x) | Dekadischer Logarithmus log10(x) |
| $exp(x) | Exponentialfunktion von x (ex) wobei e=2.718281828... |
| $sqrt(x) | Quadratwurzel von x |
| $pow(x, y) | xy |
| $floor(x) | Floor von x |
| $ceil(x) | Ceiling von x |
| $sin(x) | Sinus von x, wobei x in Radiant ist |
| $cos(x) | Kosinus von x, wobei x in Radiant ist |
| $tan(x) | Tangens von x, wobei x in Radiant ist |
| $asin(x) | Arkussinus von x |
| $acos(x) | Arkuskosinus von x |
| $atan(x) | Arkustangens von x |
| $atan2(x, y) | Arkustangens von x/y |
| $hypot(x, y) | Hypotenuse von x und y: sqrt(x2 + y2) |
| $sinh(x) | Hyperbolischer Sinus von x |
| $cosh(x) | Hyperbolischer Kosinus von x |
| $tanh(x) | Hyperbolischer Tangens von x |
| $asinh(x) | Flächeninhalt des hyperbolischen Sinus von x |
| $acosh(x) | Flächeninhalt des hyperbolischen Kosinus von x |
| $atanh(x) | Flächeninhalt des hyperbolischen 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; // 30 Grad in Radiant umrechnen
$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
Simulationslog:
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
- Verilog meistern: Komplettes Tutorial für digitales Schaltungsdesign
- Verilog Concatenation meistern: Praktischer Leitfaden
- Verilog Assignments verstehen: Typen, Syntax und Best Practices
- Verilog Blocking vs. Non-Blocking: Wichtige Unterschiede erklärt
- Verilog Functions meistern für effizientes RTL-Design
- Verilog Tasks verstehen: Functions vs. Tasks, Syntax und Verwendung
- Verilog Clock Generator: Design & Implementierungsleitfaden
- Verilog $timeformat meistern: Präzision und Anzeigesteuerung
- Verilog Timescales an jedem Scope verstehen und ausgeben
- Datei-E/A in Verilog meistern: Öffnen, Lesen, Schreiben und Schließen