Ich bin ein bisschen verwirrt, ob ich in VHDL ganze Zahlen für Synthesesignale und Ports usw. verwenden soll.
Ich benutze std_logic auf höchster Ebene Ports, aber intern ich wurde überall lagen ganze Zahlen verwenden. Ich bin jedoch auf einige Verweise auf Personen gestoßen, die sagten, Sie sollten nur signierten / nicht signierten Code für syntheseorientierten Code verwenden.
Ich habe mein aktuelles Projekt dahingehend überarbeitet, dass es ohne Vorzeichen verwendet wird ... und nun, es ist merklich hässlicher.
Ist es eine schlechte Praxis, ganze Zahlen zu verwenden? Was ist das Problem? Besteht eine gewisse Unsicherheit darüber, auf welche Breite das Tool Ganzzahlen abbildet?
Antworten:
Ganzzahlen sind in der Synthese in Ordnung, ich benutze sie die ganze Zeit.
Das ist gut!
Sei vorsichtig:
unsigned
signed
Auf der Oberseite:
Wenn Sie verwenden Vektortypen zu tun, die Sie verwenden
ieee.numeric_std
, nichtieee.std_logic_arith
nicht wahr?Ich benutze
integer
s, wo ich kann, aber wenn ich explizit "Roll-Over-N-Bit-Zähler" möchte, neige ich dazu, zu verwendenunsigned
.quelle
Jan Decaluwe hat ein komplettes Whitepaper über die Probleme von ganzen Zahlen und Bitvektoren geschrieben. Ich gehe davon aus, dass seine Antworten, wann immer möglich, Ganzzahlen sein werden . http://www.jandecaluwe.com/hdldesign/counting.html
quelle
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
undunsigned
. 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 PortsWenn 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 machtAuß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ülltNachteile der Verwendung von
integer
: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
undsigned
anstelle von Ganzzahlen und halte mich daher normalerweise an diese.quelle