VHDL: Architekturbenennung und -interpretation

Hinweis: Ich verwende die ISE von Xilinx und habe ein FPGA-Board, mit dem ich arbeiten kann (mit Schaltern und Lichtern usw.), und ich habe bisher einige einfache Projekte zusammengehackt. Gleichzeitig lese ich mehrere Tutorials, um eine Grundlage für das zu schaffen, was ich tue.

Ich habe verschiedene Entitäten und ihre Architekturen gesehen, die in den Referenzmaterialien erwähnt wurden, die ich durchgegangen bin, aber die Benennung ist oft verwirrend. Oft sehe ich anstelle von „architecture rtl of…“ oder „architecture structure of…“ „architecture foo of…“ oder sogar „architecture arch of…“

Mir ist (verspätet) klar, dass der Architekturname genauso willkürlich ist wie die Entitätsbenennung, obwohl es Styleguides gibt, die vorschlagen, dass konsistentere Namenskonventionen verwendet werden können, um dieses Problem zu vermeiden. Das führt mich zu ein paar Fragen:

  • Wie kann man beim Betrachten einer Entität das tatsächlich verwendete Architekturmodell ohne Hinweise aus dem Architekturnamen bestimmen? RTL, Verhalten, Struktur ... sie scheinen dem Auge meines Lernenden ziemlich ähnlich zu sein (vorausgesetzt, die Beispiele, die ich gesehen habe, wurden tatsächlich richtig benannt). Ein einfaches, aber offensichtliches Beispiel wäre hier hilfreich (oder ein Hinweis auf eines).

  • Wenn Sie mehrere Architekturen für eine einzelne Entität angeben (was meines Wissens möglich ist), geben Sie den Architekturen einfach unterschiedliche Namen in derselben Datei oder ...?

  • Sind die Architekturnamen auf eine bestimmte Entität beschränkt (d. h. gibt es ein Problem mit "Namespaces", wenn derselbe Architekturname über mehrere Entitäten hinweg verwendet wird)?

Edit: und noch eins:

  • Es scheint, dass es einen Unterschied zwischen RTL und Verhalten gibt, aber wie oben erwähnt, sehe ich es in den Beispielen, die ich gesehen habe, nicht wirklich (oft sehe ich nur, dass eine Architektur definiert wird). Ist eine Architektur häufiger als die anderen?

Was ich gesucht habe, ist ein umfassendes, aber einfaches Projekt mit mehreren Komponenten (kleine Komponenten), das nach bewährten Verfahren (richtige Benennung, nicht alles in einer Datei zusammengepfercht usw.) geschrieben wurde, aber ich habe noch keines gefunden. Ich finde richtig gestaltete Beispielprojekte sehr nützlich, um grundlegende Prinzipien und Best Practices zu veranschaulichen. Wenn Sie ein solches Beispielprojekt kennen, wäre ich auch für einen Hinweis darauf dankbar. (Wenn nichts anderes, vielleicht kann ich, sobald ich das herausgefunden habe, einen meiner eigenen teilen ...)

Antworten (3)

Wie kann man beim Betrachten einer Entität das tatsächlich verwendete Architekturmodell ohne Hinweise aus dem Architekturnamen bestimmen?

Sie können nicht - wenn es instanziiert oder konfiguriert wird , kann die Architektur angegeben werden (wenn mehr als eine zur Auswahl steht) oder es wird ein Standard für Sie ausgewählt.

Wenn Sie mehrere Architekturen für eine einzelne Entität angeben (was meines Wissens möglich ist), geben Sie den Architekturen einfach unterschiedliche Namen in derselben Datei oder ...?

Sie geben ihnen verschiedene Namen. Es muss sich nicht in derselben Datei befinden (tatsächlich kümmert sich VHDL viel weniger darum, was sich in welcher Datei befindet, als Sie vielleicht denken)

Sind die Architekturnamen auf eine bestimmte Entität beschränkt (d. h. gibt es ein Problem mit "Namespaces", wenn derselbe Architekturname über mehrere Entitäten hinweg verwendet wird)?

Sie sind an eine Entität "angehängt", können also wiederverwendet werden.

Ich benutze oft a1als meine Architektur für alles Synthetische wie

  • rtlimpliziert (für viele Leser) ein niedrigeres Niveau als das, auf dem ich schreibe.
  • behaviouralimpliziert oft nicht-synthetisch (für einige Leser)
  • synthwird vom Synthesizer für sein Modell verwendet (sonst hätte ich das verwendet)

a1war bisher konfliktfrei und stiftet keine Verwirrung ;)

Wenn ich tatsächlich mehr als eine Architektur habe, neige ich dazu, sie ausführlich zu benennen (zum Beispiel hard_multipliersund lut_multipliersfür einen Filter, der MUL18-Blöcke instanziiert - oder nicht).

Sehr oft hat man nur eine Architektur, also spielt es keine Rolle. Gute Entity-Namen sind viel wichtiger.

Es scheint, dass es einen Unterschied zwischen RTL und Verhalten gibt, aber wie oben erwähnt, sehe ich es in den Beispielen, die ich gesehen habe, nicht wirklich (oft sehe ich nur, dass eine Architektur definiert wird). Ist eine Architektur häufiger als die anderen?

Es ist historisch - Sie waren früher nicht in der Lage, "Verhaltenscode" zu synthetisieren (der an einem Punkt Dinge wie das Hinzufügen beinhaltete!) - also haben Sie eine RTL-Version erstellt, die Addierer und dergleichen instanziiert hat. (So ​​verstehe ich es - ich schreibe verhaltensorientierten (und dennoch synthetisierbaren) Code, seit ich ungefähr 1999 mit VHDLing begonnen habe!)

Ich freue mich über die Punkt-für-Punkt-Antwort!
Ich mache ungefähr dasselbe - ich benenne alle meine Architekturen archund konzentriere mich stattdessen darauf, den Entitäten vernünftige Namen zu geben. Für den seltenen Fall, dass ich mehr als eine Architektur für eine Entität habe, gebe ich ihnen einfach andere Namen. Für mich behaviouralbedeutet dies jedoch wirklich Code, der nicht synthetisiert werden kann oder soll. Außerdem hatte ich immer die Idee, dass rtles einen geeigneten Namen für alle HDL gibt, die für die Synthese bestimmt sind, unabhängig von der Abstraktionsebene. (Ich könnte mich zwar wie immer in jedem dieser Punkte irren, aber das war mein Verständnis der Verwendung dieser Wörter.)

Hier sind die Architekturtypen:

Verhalten:

Allgemeine Hinweise:

  • Traditionell keine Hierarchie (nur eine Datei, keine instanziierten Komponenten), obwohl dies je nach Tool unterschiedlich ist.
  • Sehr schnell zu simulieren.
  • Das Signalverhalten wird definiert.
  • Wenn Verhalten nur zur Simulation verwendet wird, kann es nicht synthetisierbaren Code enthalten. Verhalten, das zur Synthese bestimmt ist, muss natürlich synthetisierbar sein.

Xilinx-spezifische Hinweise

  • Im Allgemeinen sind Core-Generator-Modelle .vhd-Dateien vor der Synthese

Struktur:

Allgemeine Definition

  • Instanziiert nur Komponenten und verdrahtet sie miteinander (hierarchisch).
  • Langsamer zu simulieren als Verhalten.
  • Keine wirkliche Definition des Signalverhaltens in der obersten Ebene.
  • Nur synthetisierbarer Code.

Spezifische Anmerkungen von Xilinx

  • Core-Generator-Modelle berücksichtigen kein Timing.
  • Im Allgemeinen instanziieren Core-Generator-Modelle Netzlisten nach der Synthese

Die oben genannten sind im Grunde die traditionellen zwei Haupttiere der Architektur. Sehr häufig wird eine "gemischte" Definition verwendet, die Eigenschaften von beiden enthält.

RTL:

RTL, was am Ende des Tages tatsächlich auf dem FPGA steckt. Dies ist also synthetisierbarer Code, der das Verhalten des Systems definiert und aus einer Codehierarchie besteht:
Die unteren Schichten sind synthetisierbares Verhalten, wo das Wesentliche des Signalverhaltens definiert wird, und die oberen Schichten sind strukturell, wo die Verhaltenskomponenten werden miteinander verbunden, um ein großes "Blockdiagramm" auf oberster Ebene zu erstellen, wenn Sie so wollen.

Weiter zu mehreren Architekturen:

Architekturen können sich alle in einer Datei oder in mehreren Dateien befinden. Wichtig ist nur, dass zuerst die Entität kompiliert wird und die zu verwendende Architektur festgelegt wird.

Dieses Buch ist sehr praktisch und beschreibt diese Art von Dingen ziemlich gut.

Es gibt keine feste Regel darüber, wie die Dinge getan werden sollten, um unterschiedliche Verhaltens- und Strukturmodelle zu haben oder sie einfach zu mischen. Normalerweise ist es in großen Firmware-Designs (oder in großen Unternehmen, in denen Code geteilt und wiederverwendet wird) nützlich, zwischen den beiden zu unterscheiden, um die Dinge zu vereinfachen, aber am Ende des Tages kommt es darauf an, was für Sie funktioniert.

Danke für die Antwort und den Tipp zum Buch (obwohl es offensichtlich ein schwer zu beschaffender Artikel ist).
@MartyMacGyver: Ja, normalerweise lese ich nur die Google Docs-Version: P
Ich würde, aber es fehlen absichtlich Seiten ...

Erstens können reale Architekturentwürfe nicht so streng kategorisiert werden. Warum sich einschränken? Vielleicht möchten Sie andere Entitäten instanziieren und sie "strukturell" verbinden, aber fügen Sie hier und da einen Prozess oder eine gleichzeitige Zuweisung hinzu, um etwas "rtl" -Logik hinzuzufügen, und verwenden Sie vielleicht einige "Verhaltens" -Codierungsmuster, damit der Synthesizer einige davon herausfindet Details, die Sie nicht interessieren (wie das Hinzufügen, ohne einen Addierer mit Bereichs-/Pipeline-/Leistungsparametern speziell zu instanziieren), alles in derselben Architektur.

Noch wichtiger ist, dass Sie verstehen müssen, was in aktuellen Asic/FPGA-Technologien synthetisierbar ist und was nicht, und dies unabhängig vom Architekturmodell.

Eine Entität kann auf mehrere Arten implementiert werden, wobei sogar leicht unterschiedliche Verhaltensweisen möglich sind, sodass Sie möglicherweise mehrere Architekturen für dieselbe Entität haben. Darüber hinaus haben Sie möglicherweise eine Architektur nur für die Simulation (normalerweise nicht synthetisierbar), die möglicherweise schneller simuliert als die "echte" Version, was sich als nützlich erweisen kann, wenn Sie große Designs als Ganzes testen. Sie würden diesen Architekturen Namen geben, die Ihnen helfen, sich daran zu erinnern, was sie von den anderen unterscheidet, und einfach bhv/str/rtl ist normalerweise nicht genug oder genau, angesichts der hybriden Natur von Designs in der realen Welt.

In Bezug auf Ihre spezifischen Fragen ist die Architekturdeklaration an einen Entitätsnamen gebunden, sodass es keine Namespace-Probleme mit Architekturen mit demselben Namen für verschiedene Entitäten gibt. Verwenden Sie einfach unterschiedliche Namen für Architekturen für dieselbe Entität.

Architekturen können sich in verschiedenen Dateien befinden, Sie müssen nur sicherstellen, dass die Entity-Deklaration zuerst kompiliert wird.

Sie können auswählen, welche Architektur verwendet werden soll, wenn Sie die Entität instanziieren oder Konfigurationsanweisungen verwenden. Wenn Sie dies nicht tun, ist der Standardwert „normalerweise“ die letzte Architektur, die der Compiler für eine bestimmte Entity-Deklaration gesehen hat.

Danke für deine Antwort! Das gemeinsame Thema scheint zu sein, dass Designs im Allgemeinen nicht genau in die architektonischen Schubladen passen, über die ich gelesen habe. Hoffentlich finde ich ein kanonisches Beispiel, um meine (ziemlich pedantische) Neugier in dieser Angelegenheit zu befriedigen ... Wenn ich von einem "Ideal" abweiche, möchte ich zumindest wissen, wie ein Ideal aussieht.