2017-02-02 3 views
1

Was ist der beste Weg ist, eine echte Art in SystemVerilog abzurunden nach:SystemVerilog - rund realer Typ

Fall positiv: wenn fraction >= 0.5 ---> rund um den "Integer-Teil" return + 1 (zum Beispiel 4.5 - -> 5) wenn fraction < 0.5 ---> Rundrück den "ganzzahligen Teil" (zum Beispiel 4,2 ---> 4)

Fall negativ: wenn fraction >= 0.5 ---> Rundrück den "ganzzahligen Teil" -1 (zum Beispiel -4.5 ---> - 5) wenn fraction < 0.5 ---> rund den "ganzzahligen Teil" zurückgeben (zum Beispiel -4.2 ---> -4)

Antwort

1

Das Runden von Realen auf ganze Zahlen ist in der IEEE Std 1800-2012 LRM gut beschrieben.

IEEE Std 1800-2012 § 6.12.2 Conversion

Reelle Zahlen werden durch Runden die reale Zahl auf die nächste ganze Zahl auf ganze Zahlen umgewandelt werden, anstatt durch Kürzen. Implizite Umwandlung soll stattfinden, wenn eine reelle Zahl einer ganzen Zahl zugewiesen wird. Wenn der Bruchteil der reellen Zahl genau 0,5 ist, soll er von Null weggerundet werden.

IEEE Std 1800-2012 § 20,5 Konvertierungsfunktionen

$rtoi wandelt reelle Werte in einen Integer-Typ durch den realen Wert Kürzen (beispielsweise 123.45 wird 123). $rtoi unterscheidet sich von der Umwandlung eines reellen Werts in eine ganze Zahl oder einen anderen ganzzahligen Typ, wenn das Casting eine Rundung statt einer Kürzung durchführt. Das direkte Zuweisen eines reellen Werts zu einem ganzzahligen Typ wird auch gerundet statt abgeschnitten.

Nach dem LRM, int_val = 4.5 oder int_val = int'(4.5) werden beide werden 5. Und int_val = -4.5 oder int_val = int'(-4.5) werden beide werden -5.

Direkte Zuweisung Versen Casting kann je nach Simulator unterschiedliche Leistung haben. Ich würde annehmen, dass das Gehäuse perfektioniert ist, da es expliziter für jeden ist, der den Code und den Simulator überprüft. Plus Casting bekommt mehr Kontrolle über die Bitbreite.