www.mikrocontroller.net

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


Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
  type t_dut_if is record
    signal0 : std_logic;
    signal1 : std_logic;
        .
        .
    signaln : std_logic;
  end record t_dut_if;

  constant c_num_dut_instances : natural := 4;

  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):
   procedure dut_write_register (
    constant index       : in    integer range 0 to 127;
    constant value       : in    std_logic_vector(15 downto 0);
    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:
  procedure duts_write_register (
    constant index        : in    integer range 0 to 127;
    constant value        : in    std_logic_vector(15 downto 0);
    signal duts_if_signals : inout t_dut_if_array) is
  begin  -- procedure duts_write_register
    for i in 0 to duts_if_signals'length - 1 loop
      dut_write_register(index, value, duts_if_signals(i));
    end loop;  -- i
  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

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ergänzend will ich noch darauf hinweisen, dass die procedure so 
funktioniert:
procedure duts_write_register (
    constant index        : in    integer range 0 to 127;
    constant value        : in    std_logic_vector(15 downto 0);
    signal duts_if_signals : inout t_dut_if_array) is
    variable v_cb_curr : t_coreblock_if;
  begin  -- procedure cbs_write_register
    dut_write_register(index, value, duts_if_signals(0));
    dut_write_register(index, value, duts_if_signals(1));
    dut_write_register(index, value, duts_if_signals(2));
    dut_write_register(index, value, duts_if_signals(3));
  end procedure duts_write_register;

dh wenn man den loop "unrolled" gehts. Dafür gibt es einen Fehler wenn 
man noch einen Aufruf
   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

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was sagt Modelsim zu folgendem Konstrukt?:
 ...
 for i in t_dut_if_array'range loop
 ...

Duke

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da kommt leider immer noch dieselbe Fehlermeldung

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

lg
Matthias

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.