2016-04-15 3 views
4

die folgende VHDL Datensatz vor:Get Attribut eines Feldes aus einer VHDL Satzart

type big_record_t is record 
    field_a : unsigned(15 downto 0); 
    field_b : unsigned(23 downto 0); 
end record; 

Ist es möglich, Attribute auf Datensatzfelder ohne Instanziieren den Rekord selbst zu bekommen? zB

signal ex : unsigned(big_record_t.field_a'range); 

ModelSim meldet den folgenden Fehler:

(vcom-1260) Type mark (big_record_t) cannot be prefix of selected name. 

Ich weiß, dass das Attribut eines instanziiert Signal immer möglich ist, aber für diese spezielle Situation möchte ich die Art vom Typ Attribute selbst bekommen.

Antwort

5

Sie können nicht verwenden, um das 'range Attribut auf einen Typ, das ist das, was Sie versuchen, in Ihrem Code zu tun. Wenn Sie so etwas wie dies zu tun, sind:

signal big_record_instance : big_record_t; 
signal ex : unsigned(big_record_instance.field_a'range); 

sollte es funktionieren, weil Sie jetzt versuchen, die Reichweite einer Instanz zu erhalten, keinen Typen.

Eine Alternative, wenn Sie Ihre Breite zu haben, im selben Paket basierend auf Konstanten keine Instanz haben könnten sein, dass Ihr Datensatztyp definiert ist, so etwas wie diese:

constant field_a_width : integer := 16; 

type big_record_t is record 
     field_a : std_logic_vector(field_a_width-1 downto 0); 
     field_b : std_logic_vector(23 downto 0); 
end record; 

signal ex : std_logic_vector(field_a_width-1 downto 0); 

Oder vielleicht

constant field_a_width : integer := 16; 

subtype field_a_type is std_logic_vector(field_a_width-1 downto 0); 

type big_record_t is record 
     field_a : field_a_type; 
     field_b : std_logic_vector(23 downto 0); 
end record; 

signal ex : field_a_type; 
+0

Sie für Ihre Kontakdaten hinzu. Ich weiß, dass ich Attribute auf die Instanz anwenden kann. In diesem speziellen Fall wundere ich mich, warum ich es auf dem Typ nicht tun kann. Alle Typinformationen sollten dem Compiler zur Verfügung stehen. – Maurice

+0

@Maurice die Informationen möglicherweise vorhanden sein, aber der Standard unterstützt nicht, was Sie tun möchten. Ich habe meine Antwort mit einem anderen Vorschlag aktualisiert. –

+0

Ich habe Ihre Antwort als richtig markiert. Ich denke, diese Funktion wurde auch nicht zu VHDL2008 hinzugefügt. – Maurice

1

Ein weiterer Vorschlag ist, wie etwas zu tun:

subtype field_a_range is range 15 downto 0; 
subtype field_b_range is range 31 downto 0: 
type big_record_t is record 
    field_a : unsigned(field_a_range); 
    field_b : unsigned(field_b_range); 
end record; 

Dann später können Sie dies tun mething wie:

signal ex : unsigned(field_a_range); 

Ein weiterer Fix könnte eine Funktion zu verwenden, die ein bisschen doof ist - eine Funktion verwenden. Obwohl dies effektiv eine Instanz erstellt (obwohl es ein bisschen versteckt).

function field_a_length return natural is 
    variable tmp : big_record_t; 
begin 
    return tmp.field_a'length; 
end function field_a_length; 

verwenden sie dann als:

signal ex : unsigned(field_a_length-1 downto 0);