2016-10-07 3 views
1

Meine VHDL-Designs enthalten normalerweise eine anständige Menge an hierarchischen "Blöcken" (Entitäten): ein Unterblock besteht aus mehreren Unterblöcken, die aus mehreren Unterblöcken usw. bestehen.VHDL-Extraktionskonstante von Entität

Es ist sehr üblich für mich Latenz die Ausgänge der internen Blöcke vor dem Ansteuern der Ausgänge eines bestimmten Blocks übereinstimmen müssen. Wenn ich die internen Blöcke ändere und sie mit unterschiedlichen Latenzzeiten enden, muss ich manuell neu berechnen, wie die Latenzen des benachbarten Blocks kompensiert werden. Wenn das Update die Gesamtlatenz des gegebenen Blocks beeinflusst, muss ich den Prozess in jedem Block höherer Ebene wiederholen, der den gegebenen Block enthält.

Es wäre viel einfacher, wenn ein Block der rufenden Entity "sagen" könnte, wie hoch die Latenz ist, und diese Kompensationen automatisch berechnen lassen.

Gibt es eine nette Möglichkeit, dies zu tun? Etwas wie eine generische Ausgabe?

Antwort

2

Die richtige und allgemeine Lösung besteht darin, ein Paket für jedes Submodul, wie mdl_sub_pkg, mit einer Konstanten der Latenz in diesem Submodul zu erstellen. Dann erstellen Sie ein Paket für das umschließende Modul, z. B. mdl_pkg, und verwenden Sie die Konstante aus dem mdl_sub_pkg-Paket, um die Latenz zu berechnen, die das umschließende Modul generieren sollte. Schließlich verwenden Sie die mdl_pkg im umgebenden Modul, und generieren Sie die Latenz basierend auf der berechneten Konstante in mdl_pkg. Denken Sie daran, den Test der Latenzkonstanten in die Verifizierung einzubeziehen.

Eine alternative und zweifelhafte Lösung besteht darin, einen Ausgangsport (als Alternative zu dem nicht existierenden generischen Ausgang) auf dem Submodul zu erstellen und diesem eine Konstante zuzuweisen, die der Latenz im Submodul entspricht. Die umschließenden Module können dann den Ausgabeanschluss von den Untermodulen verwenden, um die resultierende Latenz für dieses Modul zu berechnen. Ob diese Lösung jedoch funktioniert und ein synthetisiertes Design minimaler Größe generiert, hängt stark davon ab, wie die Latenzkompensation implementiert wird und wie das Synthesewerkzeug die Ausarbeitung und Reduzierung von Konstanten enthaltenden Konstruktionsteilen behandelt. In bestimmten Situationen kann es eine praktikable Lösung und ein netter Trick sein, aber es ist keine allgemein anwendbare Lösung.

1

Eine andere Alternative ist es, Ihre erwartete (oder gewünschte) Latenz als generisches einzutragen.

Intern bestätigen Sie tatsächliche Latenz = generische Latenz und schlagen fehl, wenn falsch.

Oder einfügen Pipe-Stufen, wenn tatsächliche Latenz < generische Latenz, bis sie übereinstimmen, und Assert/Fail wenn tatsächliche Latenz> generische Latenz, und nichts tun, wenn sie gleich sind. Dies bietet eine einfache Möglichkeit, Pipelines von der obersten Ebene aus zu synchronisieren.

Verwandte Themen