Forum: FPGA, VHDL & Co. Generics in .do Script auf konstante setzen


von Fpga I. (fpga-ing)


Lesenswert?

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?
1
package ParaSet_pkg is
2
begin
3
  constant C_ParaSet0 : integer:= 13;
4
  constant C_ParaSet1 : integer:= 99;
5
end;
6
...
7
8
use work.ParaSet_pkg.all;
9
entity MyTestbench is
10
  generic(
11
    G_CurrentParaSet : integer := C_ParaSet0
12
  );
13
end entity;
14
architecture RTL of MyTestbench is
15
begin
16
  assert false report "G_CurrentParaSet :" & to_string(G_CurrentParaSet);
17
end architecture;

das funktioniert leider nicht:
1
vsim MyTestbench -gG_CurrentParaSet=C_ParaSet1

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.

von Gustl B. (gustl_b)


Lesenswert?

Dann mach einen Record mit einem Eintrag, deinem Integer.

von Gustl B. (-gb-)


Lesenswert?

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.

von DSGV-Violator (Gast)


Lesenswert?

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?)

von Fpga I. (fpga-ing)


Lesenswert?

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

von Christoph Z. (christophz)


Lesenswert?

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.

von Fpga I. (fpga-ing)


Lesenswert?

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.

von Fpga I. (fpga-ing)


Lesenswert?

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.
1
MyCompInst : entity work.MyComponent
2
generic map(
3
 Parameter0 => f_StringToConstantRecord(G_ParameterSetString).RecordField0
4
);
5
...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.