Generics in .do Script auf konstante setzen

OP #7438098
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.

#7438356
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.

Gast #7438519
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?)

OP #7438590
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

#7438602
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.

OP #7438698
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.

OP #7439459
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
...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren