Wie bringt man interne Signale eines unteren Moduls zu einem oberen Modul in VHDL?

Wie kann ich die internen Signale meines VHDL-Quellcodes in meine Testbench bringen, damit ich sie als Wellenformen anzeigen kann? Ich verwende Active HDL. Ich würde gerne wissen, ob es eine werkzeugunabhängige Methode gibt, um mein Ziel zu erreichen. Jede Hilfe ist willkommen.

Ich bekomme diesen Fehler jetzt.Geben Sie hier die Bildbeschreibung ein

Mein Quellcode ist

entity SPI_DAC is
    Port ( 
    -- inputs and oututs
    )
end SPI_DAC;

architecture Behavioral of SPI_DAC is 
    --These are my internal signals 
    signal ch1_byte_data_sent       : STD_LOGIC_VECTOR(23 downto 0)     := x"000000"; 
    signal ch1_byte_cmd_sent        : STD_LOGIC_VECTOR(23 downto 0)     := x"000000";
    --and a few other signals
begin 
    --functionality 
end Behavioral;

Mein Testbench-Code ist

entity tb_spi_dac is
end tb_spi_dac;

architecture behavioral of tb_spi_dac is
    component spi_dac
    port(
    --declaration, inputs and outputs
    );
    end component;
begin
    uut: spi_dac port map(
    --map ports
    );
    --stimulus process
end;
Wenn Sie Ihre Simulation starten, wird Ihr Simulator alle Elemente ausarbeiten. Anschließend sucht es nach den Links, die Sie erstellt haben, indem es externe Namen verwendet. Mir scheint, dass dein Weg falsch ist. Ich habe meine Antwort bearbeitet, um mehr Details zum Bau von Pfaden zu geben. Ohne Kenntnis Ihres Designs kann ich nicht sagen, was an Ihrem Weg falsch ist.
Wie ich in meiner Antwort sagte, müssen Sie das Label und nicht den Entitätsnamen verwenden. Der richtige Pfad sollte .tp_spi_dac.uut.ch1_byte_data_sent.
Deine Vorschläge haben mein Problem gelöst @ThomasS. Danke vielmals! Ich hatte ein Problem mit der VHDL-Version, das ich löste, nachdem ich mir das von David vorgeschlagene Video angesehen hatte. Ich weiß, dass das Schreiben von Dankesnotizen nicht zu empfehlen ist, aber danke Thomas für die Korrektur meiner Bearbeitung (ich war wirklich verwirrt mit dieser Markdown-Formatierung).

Antworten (4)

Was Sie suchen, wird in VHDL als externe Namen (oder hierarchische Namen) bezeichnet. Sie können verwendet werden, um die Sichtbarkeit von Bereichen/Hierarchien zu umgehen. Die Syntax ist wie im Beispiel unten.

<<signal path_name : std_logic_vector(7 downto 0)>>

Sie können auch auf Konstanten und Variablen mit externen Namen zugreifen. Sie müssen jedoch den Typ im externen Typ ändern. Sie können externe Namen direkt für den Lese-/Schreibzugriff verwenden. Sie sollten jedoch Aliase verwenden, um die Lesbarkeit zu verbessern.

alias signal_name is 
    <<signal path_name : std_logic_vector(7 downto 0)>>;

Der externe Name muss den Pfad zu dem Element enthalten, auf das Sie zugreifen möchten. Der Pfad kann entweder absolut oder relativ sein. Die einzelnen Elemente in Ihrem Pfad sind durch Punkte getrennt. Beachten Sie, dass Sie die Bezeichnungen der Instanz/des Prozesses/der Entität/... und nicht des Namens angeben müssen. Absolute Pfade beginnen mit einem .gefolgt vom Namen Ihrer obersten Ebene. Bei relativen Pfaden können Sie sich ^mit in der Hierarchie nach oben bewegen. Wenn Sie Konstanten/Signale aus einigen Paketen verwenden, können Sie auch verwenden @, um zu einer Bibliothek zu wechseln.

Ein Beispiel für einen absoluten Pfad ist

.tb_name.instance_label.sub_instance_label.signal_name

Um auf dasselbe Element aus der Testbench mit relativen Namen zuzugreifen, können Sie verwenden

instance_label.sub_instance_label.signal_name

Wenn Sie auf ein Testbench-Signal/eine Konstante von der sub_instance zugreifen möchten, die Sie verwenden können

^.^.constant_name

Um auf eine andere Konstante in einem Konfigurationspaket zuzugreifen, das sich in der Konfigurationsbibliothek befindet, können Sie verwenden

@config.pkg_name.other_constant_name

Sie können den Design-/Bibliotheksbrowser Ihres Simulators verwenden, wie David darauf hingewiesen hat, um den richtigen Pfadnamen zu finden.

Diese Funktion wurde in VHDL-2008 hinzugefügt, daher sollte sie von allen Tools unterstützt werden, die bereits VHDL-2008 unterstützen (einschließlich ActiveHDL, denke ich). Die meisten Simulatoren verwenden VHDL-2008 nicht standardmäßig, stellen jedoch ein Befehlszeilenargument oder eine Konfigurationsoption bereit, um es zu aktivieren.

Ich habe versucht, was Sie vorgeschlagen haben. Alias ​​ch1_byte_data_sent ist <<signal .TB_SPI_DAC.SPI_DAC.ch1_byte_data_sent : STD_LOGIC_VECTOR(23 downto 0)>> := x"000000"; Wenn ich dies tue, erhalte ich die Fehlermeldung „Bezeichner oder Zeichenfolgenliteral erwartet“. Irgendwelche Ideen, warum ich den Fehler erhalte? (Entschuldigung für eventuelle Fehler mit dem Beitrag, ich bin zum ersten Mal hier!)
Meine Antwort ist vielleicht nicht klar genug. Bei der Verwendung aliasmüssen Sie die Zuweisung in eine neue Anweisung schreiben. Der Vorteil ist, dass Sie anstelle des langen externen Namens den Aliasnamen verwenden können.

Wie kann ich die internen Signale meines VHDL-Quellcodes in meine Testbench bringen, damit ich sie als Wellenformen anzeigen kann?

Ein Prüfstand impliziert eine Simulation – eine Entität ohne Ports ist im Allgemeinen nicht für eine Synthese geeignet.

Obwohl ich Active-HDL noch nie verwendet habe, verstehe ich, dass es einen Design-Browser hat, der es Ihnen ermöglichen sollte, Signale in Ihrer Hierarchie unten auszuwählen, um sie in Ihrer Wellenform anzuzeigen. Siehe Aldecs Compilation and Simulation -Video (5:02, Min:Sek).

Und jetzt habe ich den Eindruck, dass das Video vielleicht in diesem speziellen Fall Verwirrung stiften könnte.

Bei 2:22 vom Ende zeigt das Video eine Do-Datei (Makro), die die Simulation steuert:

2:22 archivieren

Wo wir jedes Signal in der obersten Ebene des Designs sehen, wurde die Wellenformanzeige mit dem Wave-Befehl hinzugefügt. Es sollte auch möglich sein, ein Signal irgendwo in der Entwurfshierarchie zu spezifizieren.

Die Grundidee ist, dass viele Simulatoren es Ihnen ermöglichen, Signale (und einige erlauben Variablen) zu planen, die für die Wellenformanzeige gesammelt werden sollen.

Dieses kurze Video zeigt einfach keine Signale für untergeordnete Hierarchieebenen. (In einer kurzen Video-Präsentation steckt viel drin).

Ich würde gerne wissen, ob es eine werkzeugunabhängige Methode gibt, um mein Ziel zu erreichen.

Wie oben erwähnt, scheint Ihr Ziel darin zu bestehen, interne Signale als Wellenformen anzuzeigen.

Nun zu den schlechten Nachrichten – es gibt keine Standardisierung für Simulatorfunktionen oder -schnittstellen, Planungssignale für Wellenform-Dump usw. Diese sind alle implementierungsdefiniert.

Es ist so ziemlich garantiert, dass Sie Signale überall in einer Designhierarchie in einen Wellenform-Viewer oder eine Wellenform-Dump-Datei mit jeder simulierenden Implementierung ausgeben können. Die Methode dafür ist implementierungsdefiniert.

Die gute Nachricht ist, dass sie dazu neigen, Konzepte voneinander zu kopieren, z. B. Do-Dateien, die Sie programmgesteuert für die Portabilität generieren könnten, indem sie eine gemeinsame Datenbank verwenden , die die funktionale Überprüfung auf mehreren Implementierungsplattformen beschreibt, und Unterschiede in Syntax und Semantik überwinden. Es gibt wahrscheinlich auch Unterschiede in der Syntax der Befehlszeilenschnittstelle zum programmgesteuerten Aufrufen der Tools.

Die Idee der Portabilität umfasst nicht mehrere GUIs elegant.

Tools wie xilinx haben die Möglichkeit, interne Signale anzuzeigen.

Eine einfache werkzeugunabhängige Methode besteht darin, separate Ausgangsleitungen zu deklarieren und die internen Signale mit diesen Leitungen zu verbinden.

Ich möchte mich nicht in meine Ein- und Ausgabeports einmischen; kann also keine neuen Ausgabezeilen deklarieren. Ich habe die Signale in meiner Testbench deklariert, kann aber keine Ausgabe auf der Wellenform sehen (zeigt nur meinen initialisierten Wert von Null, ohne die Funktionalität zu implementieren). Gibt es eine andere Möglichkeit, es zu tun?

Wenn Sie die Signale in der Testbench deklariert haben, aber keine Ausgabe sehen können, liegt möglicherweise ein Problem in der Instanziierungsanweisung vor, in der Sie die zu testende Entität instanziieren. Überprüfen Sie, ob Sie es korrekt instanziiert haben, indem Sie eine Entitäts-Instanziierungsanweisung oder eine Komponenten-Instanziierung verwenden. Stellen Sie sicher, dass die Signale in Ihrer Testbench mit der zu testenden Entität verbunden sind. Wenn das Problem dadurch nicht gelöst wird, posten Sie den Testbench-Code, damit wir Ihnen helfen können.

Was Thomas gesagt hat, spricht genau mein Problem an. Ich habe den zuvor erwähnten Fehler behoben, der dadurch entstanden war, dass in Active-HDL, das mit Lattices iCEcube2-Designsoftware bereitgestellt wurde, standardmäßig VHDL 1993 eingestellt war. Jetzt habe ich einen schwerwiegenden Ausarbeitungsfehler, wenn ich versuche, die Simulation zu initialisieren. Ich versuche herauszufinden, warum dies auftritt, ich hoffe, es handelt sich nicht um ein Problem mit einer eingeschränkten Lizenz.
Können Sie uns diese Nachricht zeigen?