Hallo,
ich habe ein VHDL Problem für eine Testbench und frage mich gerade, ob
es dafür überhaupt eine Lösung gibt. Meine Struktur ist folgende:
Es gibt vier Instanzen meiner DUT (design under test), die ich
zusammenschalten möchte. Die Zahl 4 ist während einer Simulation fix und
wird von mir als Konstante vorgegeben. Ich habe einen record-Typ
definiert, der alle Ports einer DUT enthält. Dann mache ich ein array,
das vier dieser records hält. Es schaut also ungefähr so aus:
1 | type t_dut_if is record
|
2 | signal0 : std_logic;
|
3 | signal1 : std_logic;
|
4 | .
|
5 | .
|
6 | signaln : std_logic;
|
7 | end record t_dut_if;
|
8 |
|
9 | constant c_num_dut_instances : natural := 4;
|
10 |
|
11 | type t_dut_if_array is array (0 to c_num_dut_instances - 1) of t_dut_if;
|
Ich habe procedures geschrieben, die Ports auf einer übergebenen
t_dut_if setzen, beispielsweise so (Teil des IF ist eine Registerbank,
daher ein Registerschreibzugriff hier):
1 | procedure dut_write_register (
|
2 | constant index : in integer range 0 to 127;
|
3 | constant value : in std_logic_vector(15 downto 0);
|
4 | signal dut_if_signals : inout t_dut_if);
|
Soweit funktioniert das ganze. Jetzt möchte ich noch procedures, die auf
allen vier Instanzen denselben Port auf denselben Wert setzen, also im
Prinzip dieselbe Signatur nur statt einem t_dut_if Typ wird ein
t_dut_if_array übergeben. Am Beispiel des Registerschreibens:
1 | procedure duts_write_register (
|
2 | constant index : in integer range 0 to 127;
|
3 | constant value : in std_logic_vector(15 downto 0);
|
4 | signal duts_if_signals : inout t_dut_if_array) is
|
5 | begin -- procedure duts_write_register
|
6 | for i in 0 to duts_if_signals'length - 1 loop
|
7 | dut_write_register(index, value, duts_if_signals(i));
|
8 | end loop; -- i
|
9 | end procedure duts_write_register;
|
Dieser ganze Code steht übrigens in einem Package.
Leider bekomme ich das nicht kompiliert, Modelsim meldet folgenden
Fehler in procedure duts_write_register in der Zeile mit dem Aufruf von
dut_write_register:
"Actual (indexed name) for formal "dut_if_signals" is not a static
signal name."
Nach meinem Verständnis gibt es ein Problem mit dem array Typ
t_dut_if_array, weil dieses nicht als "static signal name" aufgelöst
werden kann. Ich habe inzwischen schon einige Versuche gestartet aber
nichts funktioniert.
Ist das ein Limit der Sprache? Oder gehe ich es falsch an? Gibt es einen
anderen Weg, das was ich will (eine generische Funktion, die auf einer
beliebigen Anzahl von Instanzen arbeitet, die aber zur Übersetzungszeit
feststehen) zu erreichen?
lg
Matthias