Forum: FPGA, VHDL & Co. VHDL Problem mit "static signal name"


von Matthias (Gast)


Lesenswert?

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

von Matthias (Gast)


Lesenswert?

Ergänzend will ich noch darauf hinweisen, dass die procedure so 
funktioniert:
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
    variable v_cb_curr : t_coreblock_if;
6
  begin  -- procedure cbs_write_register
7
    dut_write_register(index, value, duts_if_signals(0));
8
    dut_write_register(index, value, duts_if_signals(1));
9
    dut_write_register(index, value, duts_if_signals(2));
10
    dut_write_register(index, value, duts_if_signals(3));
11
  end procedure duts_write_register;

dh wenn man den loop "unrolled" gehts. Dafür gibt es einen Fehler wenn 
man noch einen Aufruf
1
   dut_write_register(index, value, duts_if_signals(4));

hinzufügt:

"Value 4 is out of std.standard.integer range 0 to 3."

Es sind also eigentlich alle Informationen in dieser Design Unit 
vorhanden, das einzige Hindernis kann doch nur ein Sprachlimit von VHDL 
sein.

Vielleicht muss man für so etwas überhaupt die Struktur anders aufbauen.

lg
Matthias

von Duke Scarring (Gast)


Lesenswert?

Was sagt Modelsim zu folgendem Konstrukt?:
1
 ...
2
 for i in t_dut_if_array'range loop
3
 ...

Duke

von Matthias (Gast)


Lesenswert?

Da kommt leider immer noch dieselbe Fehlermeldung

"Actual (indexed name) for formal "XXX" is not a static signal name."

lg
Matthias

von Daniel (Gast)


Lesenswert?

Ich hatte früher genau dasselbe Problem wie Du.
Ich konnte es weder lösen noch herausfinden ob es eine
Einschränkung von VHDL oder der der Implementierung vorliegt.

Probiere mal ein Minimalbeispiel mit ghdl und Altera.

von Matthias (Gast)


Lesenswert?

Danke für den Tipp aber ich habe null Erfahrung mit ghdl und im Moment 
zu viel am Tisch um mich einzuarbeiten.

Ich habe inzwischen dieses hier gefunden: 
http://www.vhdl-online.de/glossary/deutsch/g_20.htm

Wenn man sich durch die Definitionen durchhantelt kommt man zur "locally 
static expression", für die alles in derselben design unit definiert 
sein muss. Ich schließe daraus, dass Modelsim sich Spec-konform verhält 
und man solche Konstruktionen, falls sie überhaupt möglich sind, nicht 
auf mehrere Packages aufteilen kann.

Was imho ein wenig dem Sinn der Packages widerspricht, aber ich bin ja 
auch kein Programmiersprachendesigner.

Danke und lg
Matthias

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.