VHDL: ganze Zahlen für die Synthese?

17

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?

Darron
quelle
Gute Frage. Das habe ich mich schon gefragt. Ich habe angefangen, ganzzahlige, positive und andere Typen zu verwenden, aber es stellte sich heraus, dass es sehr haarig war, richtig synthetisiert zu werden. Ich hoffe, jemand kann erklären, warum jeder std_logic in einer stark typisierten Sprache verwendet.
Trygve Laugstøl
1
Ja. Ist das nicht verrückt? Stark in der aktuellen Praxis getippt, führt dies tendenziell zu einer Menge von DATA_I <= TO_UNSIGNED (32010, DATA_I'LENGTH); Typ Zeug ... das niemanden stört? :) Es scheint wirklich viel unnötiges Gepäck zu sein. (Insbesondere, wenn STD_LOGIC_VECTOR () hinzugefügt wird ) Ich habe meinen Typ und meine Größe angegeben. Dies sollte DATA_I <= 32010 sein. Das sollte implizit sein. Das Wechseln zwischen vorzeichenbehafteten und nicht vorzeichenbehafteten Zeichen usw. kann und sollte eindeutig sein. Eine eindeutige Zuweisung oder Operation für ganze Zahlen sollte jedoch implizit sein.
Darron

Antworten:

15

Ganzzahlen sind in der Synthese in Ordnung, ich benutze sie die ganze Zeit.

Ich verwende std_logic an den Ports der obersten Ebene, aber intern habe ich überall ganze Zahlen im Bereich verwendet

Das ist gut!

Sei vorsichtig:

  • Sie simulieren zuerst, nicht wahr? - Ganzzahltypen werden in der Simulation nicht automatisch verschoben. Es ist ein Fehler, den von Ihnen angegebenen Bereich zu verlassen. Wenn Sie ein Rollover-Verhalten wünschen, müssen Sie es explizit codieren.
  • -(231-1)+231-1-231unsignedsigned
  • Wenn Sie sie nicht einschränken, können Sie manchmal zu 32-Bit-Zählern kommen, bei denen weniger Sinn macht (wenn der Synthesizer und die nachfolgenden Tools nicht "sehen" können, dass sie die Bits optimieren können).

Auf der Oberseite:

  • Sie sind viel schneller zu simulieren als nicht signierte / signierte Vektoren
  • Sie werden in der Simulation nicht automatisch verschoben (ja, es ist in beiden Listen enthalten :). Dies ist praktisch - zum Beispiel erhalten Sie frühzeitig eine Warnung, dass Ihr Zähler zu klein ist.

Wenn Sie verwenden Vektortypen zu tun, die Sie verwenden ieee.numeric_std, nichtieee.std_logic_arith nicht wahr?

Ich benutze integers, wo ich kann, aber wenn ich explizit "Roll-Over-N-Bit-Zähler" möchte, neige ich dazu, zu verwenden unsigned.

Martin Thompson
quelle
Ja, ich benutze numeric_std. Ich denke, ich mache mir hauptsächlich Sorgen um Xilinx-Tools ... sie generieren immer noch std_logic_vector für alles und "UNSIGNED" ist nicht einmal in der Syntax-Hervorhebung enthalten.
Darron
1
@ Darron Mach dir keine Sorgen über die Hervorhebung der Syntax. Der Editor und sein Syntax-Textmarker sind eine völlig andere Software als das Synthesizer-Tool. Außerdem ist unsigned "nur" ein Datentyp. Es ist Teil einer Standardbibliothek, nicht der Sprache selbst.
Philippe
Ist die untere Schranke nicht stattdessen -2 ^ 32 + 1? Wenn es -2 ^ 31 - 1 wäre, bräuchten Sie nur noch ein Bit, um nur eine einzige Zahl darzustellen - sehr seltsam.
Bregalad
@Bregalad - guter Fang - das ist schon eine ganze Weile falsch!
Martin Thompson
@MartinThompson Oder vielleicht können Sie es als - (2 ^ 32-1) schreiben, wenn Sie das Minuszeichen behalten möchten.
Bregalad
7

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

Philippe
quelle
6

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 signedund 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 integerTyp 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 integerfü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 integerzunichte 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 integerwirklich 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, almostFullusw. (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 unsignedund signedanstelle von Ganzzahlen und halte mich daher normalerweise an diese.

Carl
quelle