Ich bin etwas verwirrt darüber, ob ich Integer in VHDL für Synthesesignale und Ports usw. verwenden sollte.
Ich verwende std_logic an Top-Level-Ports, aber intern habe ich überall Bereichs- Ganzzahlen verwendet. Ich bin jedoch über einige Verweise auf Leute gestolpert, die sagen, dass Sie signierten/unsignierten Code nur für synthesezielgerichteten Code verwenden sollten.
Ich habe mein aktuelles Projekt überarbeitet, um unsigniert zu verwenden ... und nun, es ist merklich hässlicher.
Ist es eine schlechte Praxis, Ganzzahlen zu verwenden? Was ist das Problem? Gibt es eine gewisse Unsicherheit darüber, auf welche Breite das Tool Ganzzahlen abbildet?
Ganzzahlen sind gut in der Synthese, ich benutze sie die ganze Zeit.
Ich verwende std_logic an Top-Level-Ports, aber intern habe ich überall Bereichs-Ganzzahlen verwendet
Das ist gut!
Sei vorsichtig:
unsigned
und verwenden signed
.Auf der Oberseite:
Wenn Sie Vektortypen verwenden, verwenden Sie ieee.numeric_std
, nichtieee.std_logic_arith
wahr?
Ich verwende integer
s, wo ich kann, aber wenn ich ausdrücklich "Rollover-n-Bit-Zähler" möchte, tendiere ich dazu, unsigned
.
Jan Decaluwe hat ein ganzes Weißbuch über die Probleme von ganzen Zahlen und Bitvektoren geschrieben. Ich gehe davon aus, dass seine Antworten darin bestehen, nach Möglichkeit ganze Zahlen zu verwenden . http://www.jandecaluwe.com/hdldesign/counting.html
Es ist per se nichts falsch daran, ganze Zahlen für RTL zu verwenden , aber es gibt Gründe, warum manche es vermeiden. Das ist wirklich eine Frage der subjektiven "Best Practice" und Sie müssen letztendlich selbst herausfinden, was Sie bevorzugen. Als Hilfe dazu werde ich meine Erfahrungen und Gedanken dazu teilen.
Grundsätzlich bin ich für die Verwendung von (eingeschränkten) ganzen Zahlen, 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, einen vektorisierten Datentyp in einem Teil Ihres Designs zu verwenden:
Kaum eine Anbieter-IP oder 3rd-Party-IP wird integer
Typ für Ports verwenden
Wenn Sie beispielsweise Daten über BlockRam senden, müssen Sie höchstwahrscheinlich sowieso in einen vektorisierten Typ konvertieren, selbst wenn Sie darauf schließen und daher niemals eine Schnittstelle zu einem IP/Makro/Primitiven herstellen müssen
Selbst wenn keines der oben genannten zutrifft, müssen Sie meistens irgendwann eine Schnittstelle zu etwas anderem herstellen (wenn nichts anderes ein Top-Level-Port ist).
Da Sie nicht integer
für das vollständige Design verwenden können, möchten Sie vielleicht alles zusammen überspringen, weil:
An manchen Stellen müssen Sie die Konvertierungen trotzdem durchführen, und dies nimmt einen Teil des eigentlichen Verwendungszwecks integer
weg
Außerdem werden diese Konvertierungen für die Simulation normalerweise mit Vektoren von 'U'
oder aufgerufen 'X'
, entweder vor dem Zurücksetzen oder zu anderen Zeiten, und jeder einzelne derartige Funktionsaufruf generiert eine Warnmeldung von der Paketfunktion, wodurch Ihre Simulationswarnungen/Eingabeaufforderungen überladen werden
Nachteile der Verwendunginteger
:
Im Gegensatz zu den vektorisierten Typen haben Ganzzahlen kein 'U'
und 'X'
; Ich finde diese sehr hilfreich in Simulationen. 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 Sie ganze Zahlen verwenden.
Bei Ganzzahlen besteht ein größeres Risiko einer Fehlanpassung von Simulation/Synthese beim Addieren oder Subtrahieren, was zu einem Unter-/Überlauf führt. (Wie bereits von jemand anderem erwähnt.)
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 oder aus Ihrem eigenen Code gehen. Ja, es gibt solche Fälle, z. B. wenn Sie einen FIFO schreiben und Schreib-/Lesevorgänge mit Koppelnavigation durchführen, um die Signale full
, empty
, almostFull
usw. ..)
Meine eigenen Schlussfolgerungen: Ich verwende manchmal ganze Zahlen, aber sparsam und meistens in den oben beschriebenen Fällen. Ich sehe keinen großen Overhead bei der Verwendung von unsigned
und signed
anstelle von Integer und bleibe daher normalerweise bei ihnen.
Trygve Laugstøl
darron