Benötigt in VHDL eine große Buseingabe zur Komponente zusätzliche Ressourcen?

Ich habe eine Komponente, die ein sehr großes Array-Signal enthält (ein paar Kilobit), und ich schreibe und lese derzeit nur in einer Komponente darauf. Ich habe in Vivado überprüft, ob dies zu viele Ressourcen verbraucht, und das tut es nicht. Meine Frage ist, ich möchte eine Unterkomponente haben, die auf dieses Array zugreifen kann (nur daraus lesen). Wenn ich das Array lediglich als Eingabe für die Unterkomponente festlege, werden dann mehr Ressourcen benötigt, als wenn ich das Array in derselben Komponente implementieren würde? Ich weiß, dass der optimierende Compiler ziemlich leistungsfähig ist, aber ich weiß nicht, was passiert, wenn Sie eine Schnittstelle zwischen VHDL-Komponenten herstellen.

Danke

Synthesewerkzeuge sind im Allgemeinen ziemlich gut, solange Sie nicht "Hierarchie beibehalten" eingestellt haben, werden sie wahrscheinlich nicht davon überrascht. Aber der einzige Weg, um sicher zu sein, ist, es zu versuchen.
Können Sie Ihr Array in ein RAM oder Dual-Port-RAM umwandeln? Wie viele Wörter in Ihrem Array werden gleichzeitig verwendet?

Antworten (3)

Wenn Sie das Design als Schema betrachten, könnten Sie den falschen Eindruck bekommen, dass Grenzen zwischen Ihren einzelnen Modulen (oder Entitäten) bestehen. Aber standardmäßig flacht Vivado Ihr Design ab – was bedeutet, dass Ihr Design im Wesentlichen als ein großes Layout behandelt wird. Alle Unterkomponentengrenzen werden ignoriert. Stellen Sie sich das also so vor, als hätten Sie einfach den Code der Unterkomponente kopiert und in die übergeordnete Komponente eingefügt.

Natürlich können Sie Vivado anweisen, Ihre definierte Hierarchie beizubehalten (dh das Design nicht zu verflachen). In diesem Fall werden die Place- und Routing-Phasen versuchen, die Eingeweide jeder einzelnen Entität innerhalb der Struktur zusammenzufassen. Aber selbst dann repliziert es keine Treiber von Signalen, die in übergeordneten Komponenten vorhanden sind.

Wenn Sie ein großes Array im HDL-Design haben (egal ob VHDL oder Verilog), erkennt der Synthesizer es oft als "RAM" und implementiert es mit Block-RAM und nicht mit einem riesigen Stapel von Registern.

Dies ist jedoch nur in einer begrenzten Untergruppe von Fällen möglich. Wenn es nicht einem RAM zugeordnet werden kann, erhalten Sie am Ende einen riesigen Stapel von Registern. Insbesondere haben die meisten RAMs nur zwei "Ports", so dass das Lesen oder Schreiben Ihres Arrays von mehr als zwei Stellen (ob im selben Modul oder nicht) fast sicher ist, dass Sie mit einem Stapel von Registern landen.

Ich weiß nicht, ob das Ableiten von Block-RAM vor oder nach dem Abflachen des Designs erfolgt. Sie müssten experimentieren, um das herauszufinden.

Seien Sie schließlich sehr vorsichtig, wenn Sie Teildesigns testen. Es ist allzu leicht, dass große Teile Ihres Designs vollständig wegsynthetisiert werden, weil Sie seinen Ausgang mit nichts verbunden oder seinen Eingang mit einer Konstante gefüttert haben.

Dem letzten Absatz stimme ich ausdrücklich zu. Ich hatte Probleme beim Testen meines Designs ohne einen klaren Ausgabepfad.

[Komplett umgeschriebene Antwort, weil ich die Frage falsch verstanden habe.]

Aus Sicht der Synthese entspricht ein Signal, das ein Array ist, einer Reihe separater Signale für jedes Element. Die Synthese behandelt im Allgemeinen jedes dieser getrennten Signale unabhängig voneinander.

Die Synthese benötigt eigene Verbindungsressourcen zwischen dem Treiber (Quelle) eines bestimmten Signals, in diesem Fall jeder Array-Komponente, und der synthetisierten Logik, die dieses Signal als Eingang (Senken) verwendet. Das einfache Weiterleiten des Signals auf der VHDL-Quellcodeebene über VHDL-Komponentenports definiert die Konnektivität nur in einem rein logischen Sinne, gibt jedoch nicht an, dass diese Signale einen bestimmten Routing-Pfad und Ressourcen haben, wie sie synthetisiert werden.

Insbesondere wenn das große Array-Signal in einer Komponente getrieben und über einen Port zu einer anderen Komponente geleitet wird, muss jedes einzelne Signalelement von seiner eigenen Quelle zu seiner/seinen eigenen Senke(n) geroutet werden, aber jedes von diesen wird geroutet separat in so minimaler Weise wie die Synthese und P&R es tun können.

Ich bin mir nicht sicher, ob ich verstanden habe, was du gesagt hast. Ich plane, das gesamte Array in der Unterkomponente zu lesen. Ich habe mich gefragt, ob die Synthesewerkzeuge die gesamte Logik zum Speichern des Arrays kopieren würden, da es sich um zwei Komponenten handelt.
Manchmal kopieren Synthesewerkzeuge die Logik, die ein Signal antreibt, an zwei Stellen, wenn dies zu einem verbesserten Routing führt, aber die dafür verwendeten Heuristiken werden dies wahrscheinlich nicht für eine große Anzahl von Signalen tun.