Hallo zusammen,
ich möchte meiner Simulation gerne ein Parameterset, welches in einem
externen Package definiert ist, als Generic übergeben.
VHDL2008 ist möglich, simuliert wird mit Questasim, gesteuert über .do
Scripte.
Gibt es dafür eine Möglichkeit?
In diesem Beispiel besteht ein Parameter Set nur aus einem Integer, den
könnte ich direkt zuweisen, in der Realität soll aber ein Record mit
verschiedenen Feldern übergeben werden.
Ich freue mich auf Eure Ideen.
Gustl B. schrieb:> Dann mach einen Record mit einem Eintrag, deinem Integer.
Nein, das ist wohl falsch.
Der Grund wieso das nicht geht ist, weil die Kommandozeile
vsim MyTestbench -gG_CurrentParaSet = C_ParaSet1
C_ParaSet1 nicht kennt. Aber das sollte eigentlich egal sein, du kannst
ja
vsim MyTestbench -gG_CurrentParaSet = 10
schreiben oder einen anderen Integer Wert, das funktioniert. Wenn ich
also eine VHDL Komponente über einen Generic Wertebereich testen wollen
würde, dann würde ich mit einer Skriptsprache (Alles Gute, alles Liebe
(-: ) in einer Schleife den Wertebereich durchgehen und dann in der
Schleife für jeden Wert ein neues .do File erzeugen und damit vsim
laufen lassen.
Fpga I. schrieb:> Hallo zusammen,>> ich möchte meiner Simulation gerne ein Parameterset, welches in einem> externen Package definiert ist, als Generic übergeben.
"Generic" ist nicht die einzige Möglichkeit zu Parameterübergabe an
Entities. Eine andere ist die configuration, die nicht nur dazu dient
verschiedenen entities und Architectures miteinandr "zu verheiraten".
Eine weiter wäre verschiedenen packages files bereit zu halten und je
nach gewünschten Parametersatz bedingt zu kompilieren. Das lässt sich
vielleicht verfeineren wenn man die Trennung in package und package body
nutzt.
Und wie der Vorredner schon andeutete, man kann VHDL-files oder
tool-aufrufe-files auch per scriptsprache generieren und dann dediziert
durch die toolchain schicken.
und wenn dir VHDL für die Simulation nicht weiterhilft, dann schau dir
die programmierinterface des Simulator an. Oder eine für Simualtion
optimierte Spache (?System verilog?, ?e?)
Vielen Dank für Eure Antworten. Die Parametersätze liegen bereits in
python vor, ebenso wie die Funktion, aus python ein VHDL Package zu
generieren. Daher hatte ich die Hoffnung, dass ich irgendwie aus den sim
Skripten auf die Package Konstanten zugreifen kann.
Ich möchte meine sim Skripte möglichst gleichförmig halten und
gleichzeitig möglichst redundante Datenhaltung vermeiden (also die
Parameter nur im python Script ändern und nicht zusätzlich in .vhd oder
.do Dateien).
Bedingte Kompilierung und Konfigurationen passen leider nicht so richtig
für meine Anwendungsfälle. Ein anderer Ansatz wäre noch ein "if
generate", bei dem abhängig von einem Parameterset-Namen die
entsprechende Entity instanziiert wird, aber auch das möchte ich nicht,
da es die Testbench zu sehr aufbläht.
Wenn ich auf die Package Konstanten nicht zugreifen kann, sehe ich zwei
Möglichkeiten, die in meinen sim Skripte passen:
1) die Parameter aus dem Parameterset händisch eintragen. Der Auwand ist
überschaubar, man muss nur darauf achten, dass die Parameter im Sim
Script mitgeändert werden, wenn sie im Python angepasst werden
2) aus den Python konstanten ein TCL Script zu generieren, welches eine
Funktion enthält, die einen Parameterset Namen in die entsprechenden
-gMyParameter=x Stings umwandelt. Etwas aufwändiger, dafür aber
sauberer.
Vielen Dank erst einmal, dann werde ich mal sehen, welchen Weg ich
verfolge
Gustl B. schrieb:> Gustl B. schrieb:>> Dann mach einen Record mit einem Eintrag, deinem Integer.>> Nein, das ist wohl falsch.>> Der Grund wieso das nicht geht ist, weil die Kommandozeile>> vsim MyTestbench -gG_CurrentParaSet = C_ParaSet1>> C_ParaSet1 nicht kennt. Aber das sollte eigentlich egal sein, du kannst> ja>> vsim MyTestbench -gG_CurrentParaSet = 10>> schreiben oder einen anderen Integer Wert, das funktioniert.
Ohne gleich die Keule auszupacken und .do files zu generieren (was
durchaus Sinn machen kann) kann dieser Fall mit einem Array aus Records
gelöst werden:
-Record Typ definieren für die Parameter
-In deinem Package ein Array anlegen von solchen Records
-In der Entity MyTestBench hast du einen Generic vom Typ natural(oder
integer).
-In der Architekture von MyTestBench nimmst du diesen Generic um auf das
-Parameterset zu zu greifen.
-Im .do File setzt du den Generic auf 0, 1, ... das kannst du sogar mit
der TCL Syntax vom .do File noch simpel in eine Schleife packen und alle
Parametersets nacheinander Simulieren.
Fpga I. schrieb:> Die Parametersätze liegen bereits in python vor,
Dann sieh dir mal VUnit an. Damit lässt sich dein aktueller Fall lösen
und bekommst gleich noch andere nette Dinge mit.
Fpga I. schrieb:> Ich möchte meine sim Skripte möglichst gleichförmig halten und> gleichzeitig möglichst redundante Datenhaltung vermeiden (also die> Parameter nur im python Script ändern und nicht zusätzlich in .vhd oder> .do Dateien).
Eine andere sehr generische Variante ist, dass du per Generic den
Pfad/Dateinamen zu deinen Parametern übergibts und dann in deiner
Testbench mit File I/O Funktionen diese einliest.
Das ist auch beliebt um z. B. gleich ganze Eingangs-/Ausgangsdaten Sets
durch zu gehen.
Hallo Christoph,
vielen Dank, der Hinweis, ein Array von Records zu erstellen und quasi
nur den Index zu übergeben, gefällt mir sehr gut, da hätte ich auch
drauf kommen können.
VUnit schaue ich mir mal an.
Der Ansatz mit Parameterdateien funktioniert in meinem Fall
wahrscheinlich nicht, da die Parameter auch Generics des DUT enthalten,
sodass ich vermute, dass ich die Parameter "nicht rechtzeitig" aus der
Datei lesen kann, um sie dann als Generic an mein DUT anzuschließen.
Noch eine Idee, die mir kam: Das Package mit den Konstanten könnte
natürlich auch eine Funktion "StrToConstant" enthalten. Über das Generic
kommt dann ein String rein und die Funktion gibt mir dann den
zugehörigen Parameter Record zurück. Spannend ist dann nur, ob ich dann
auf die Felder des Records noch zugreifen kann, das werde ich bei
Gelegenheit mal testen.