An der Verwendung von Ganzzahlen für RTL per se ist nichts auszusetzen , aber es gibt Gründe, die manche davon abhalten. Dies ist wirklich eine Frage zu subjektiven "Best Practices" und Sie müssen schließlich selbst herausfinden, was Sie bevorzugen. Als Hilfe dazu werde ich meine Erfahrungen und Gedanken dazu teilen.
Grundsätzlich bin ich dafür, (eingeschränkte) Ganzzahlen zu verwenden, auch wenn ich für die Synthese schreibe. Ich mache es manchmal, aber in der Praxis halte ich mich normalerweise an signed
und unsigned
. Ich werde näher darauf eingehen, warum.
Sie werden ohnehin gezwungen sein, vektorisierte Datentypen in einem Teil Ihres Designs zu verwenden:
Kaum eine Vendor-IP oder 3rd-Party-IP verwendet einen integer
Typ für Ports
Wenn Sie beispielsweise Daten über BlockRam senden, müssen Sie höchstwahrscheinlich ohnehin in einen vektorisierten Typ konvertieren, auch wenn Sie darauf schließen, dass keine Schnittstelle zu einem IP- / Makro- / Grundelement erforderlich ist
Auch wenn keiner der oben anwenden, werden Sie meist müssen Schnittstelle auf etwas anderes an einem gewissen Punkt (Top-Level - Port, wenn nichts anderes)
Da Sie nicht integer
für das gesamte Design verwenden können, möchten Sie möglicherweise alles zusammen überspringen, weil:
An manchen Stellen müssen Sie die Konvertierungen trotzdem durchführen, was einen Teil des Verwendungszwecks integer
zunichte macht
Außerdem werden diese Konvertierungen für die Simulation in der Regel mit Vektoren von 'U'
oder 'X'
, entweder vor dem Zurücksetzen oder zu anderen Zeiten, aufgerufen, und jeder einzelne Funktionsaufruf generiert eine Warnmeldung von der Paketfunktion, die Ihre Simulationswarnungen / -aufforderungen überfüllt
Nachteile der Verwendung voninteger
:
Im Gegensatz zu den vektorisierten Typen haben Ganzzahlen nicht 'U'
und 'X'
; Ich finde diese in Simulationen sehr hilfreich. Sie sehen, wie sich nicht initialisierte Signale durch das Design ausbreiten, und Sie werden wahrscheinlich reagieren, wenn Sie nach dem Zurücksetzen viele nicht initialisierte Signale sehen. Dies ist nicht der Fall, wenn Ganzzahlen verwendet werden.
Bei ganzen Zahlen besteht ein höheres Risiko für eine Fehlanpassung von Simulation / Synthese beim Addieren oder Subtrahieren, was zu einem Unter- / Überlauf führt. (Wie bereits von jemand anderem darauf hingewiesen.)
Typische Fälle, in denen ich integer
wirklich eine gute Option finde :
Für Debug-Signale / Zähler, die Sie über chipScope / signalTap usw. überwachen.
Völlig interne Repräsentation von Zählern, die niemals in Ihren eigenen Code gelangen oder diesen verlassen. Ja, es sind solche Fälle, zum Beispiel , wenn Sie einen FIFO gerade schreiben und Sie sind Koppelnavigations schreibt / liest die Signale zu bilden full
, empty
, almostFull
usw. (jedoch arithmetics auf den Zeiger ist ein besserer Weg , als in diesem Fall dead-reckoning. ..)
Meine eigenen Schlussfolgerungen: Ich verwende manchmal, aber sparsam Ganzzahlen und meistens in den oben beschriebenen Fällen. Ich sehe nicht viel Aufwand bei der Verwendung von unsigned
und signed
anstelle von Ganzzahlen und halte mich daher normalerweise an diese.