Ist $realtobits synthetisierbar?

Ich versuche seit Stunden herauszufinden, warum mein Verilog-Programm nicht funktioniert. Um es zu testen, habe ich meinem Modul nur einige Konstanten als Eingänge hinzugefügt und ich verwende den integrierten Logikanalysator, um die Ausgänge zu überprüfen. Aus irgendeinem Grund sind alle meine Zwischenwerte 0,0 (64-Bit-Float). Ich habe dann den ILA verwendet, um die u- und d-Eingänge zu überprüfen, und ihre Werte sind Null. Im Moment verwende ich $realtobits, um Konstanten aus Float-Werten zu erstellen. Ist das synthetisierbar?

binomial_controller bc(.u($realtobits(1.0025031276057951857)),
                       .d($realtobits(0.99750312239745997367)),
                       .u_v($realtobits(1.0026284483291278971)),
                       .d_v($realtobits(0.99737844229982886013)),
                       .p_up($realtobits(0.49968750024413099986)),
                       .p_up_v($realtobits(99.500999000666340066)),
                       .p_dn($realtobits(0.50031249975586900014)),
                       .p_dn_v($realtobits(0.50035863068484875971)),
                       .int_exp($realtobits(0.99999843750122074937)),
                       .price($realtobits(100.0)),
                       .strike($realtobits(100.0)),
                       .start(start),
                       .clk(cclk),
                       .last_nine_tree_elements(r),
                       .ready(ready));

Antworten (1)

Einfache Antwort. Nein, ich glaube nicht.

Es gibt ein sehr nützliches Online-Referenz-/Hilfedokument, das Seiten enthält, die Verilog-Konstrukte und -Syntax beschreiben. Es hat eine Seite über die $realtobitsFunktion, die besagt

Konvertierungsfunktionen sind nicht synthetisierbar.

Ich kann nicht für die Genauigkeit der Quelle bürgen, aber es macht Sinn. Die Verilog- $...Funktionen sind eher Hilfsfunktionen für Dinge wie Speicherinitialisierung, Anzeige in Simulationen usw. im Gegensatz zu tatsächlich synthetisierbaren Konstrukten. Dies ist nicht immer der Fall - Dinge wie $signedsind meines Wissens synthetisierbar.

Darüber hinaus sind die komplexen Datentypen wie real, time, und eventebenfalls nicht synthetisierbar. Von diesem Standpunkt aus ist es daher sinnvoll, dass alles, was die Umwandlung zu und von ihnen beinhaltet, nicht synthetisiert werden kann.


Wie @PeterGreen in den Kommentaren betont, hängt es vor allem vom Synthesetool ab, ob ein Konstrukt synthetisierbar ist. Wie Sie Xilinx als Tag angeben, können Sie im XST-Benutzerhandbuch nachlesen .

Tabelle 7-33 auf Seite 518 dieses Dokuments – in einem Abschnitt mit dem Titel „Verilog System Tasks and Functions Supported in XST“ – gibt deutlich an, welche Systemfunktionen unterstützt und welche ignoriert werden.

$realtobitsist in dieser Tabelle nicht speziell aufgeführt, fällt also unter den letzten Eintrag, der besagt: All others: Ignored, was darauf hinweist, dass es vom Tool nicht unterstützt wird.

Macht Sinn, ich dachte nur, es wäre einer dieser Fälle, in denen es synthetisieren würde, da es eine Konstante war.
Ich glaube nicht, dass es eine offizielle "synthetisierbare Teilmenge" mehr gibt, und schon immer, als es Werkzeuganbieter gab, wurden Teile davon oft ignoriert. Die einzige Antwort ist also wirklich, die Dokumentation Ihres Tool-Anbieters zu überprüfen.
Inoffizieller Leitfaden: sutherland-hdl.com/papers/…