2016-04-15 2 views
4

Рассмотрит следующую VHDL запись:Получить атрибут поля от типа VHDL звукозаписывающей

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

Можно ли получить на атрибуты полой записи без инстанцирования самой записи? например

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

ModelSim сообщает следующее сообщение об ошибке:

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

Я знаю, что получить атрибут реализованным сигнала возможно, но для этой конкретной ситуации я хочу, чтобы получить тип атрибутов самого типа.

ответ

5

Вы не можете использовать атрибут 'range по типу , который вы пытаетесь сделать в своем коде. Если вы должны были сделать что-то вроде этого:

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

Он должен работать, потому что вы сейчас пытаетесь получить диапазон экземпляра, а не тип.

Альтернативой, если у вас нет экземпляра может быть, чтобы иметь вашу ширину на основе констант в том же пакете, что определяется ваш тип записи, что-то вроде этого:

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); 

Или, возможно,

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

Благодарим Вас за отзыв. Я знаю, что могу использовать атрибуты в экземпляре. В этом конкретном случае мне интересно, почему я не могу сделать это по типу. Вся информация о типе должна быть доступна компилятору. – Maurice

+0

@Maurice информация может быть там, но стандарт не поддерживает то, что вы хотите сделать. Я обновил свой ответ другим предложением. –

+0

Я правильно ответил на ваш ответ. Я думаю, эта функция также не была добавлена ​​в VHDL2008. – Maurice

1

Еще одно предложение сделать что-то вроде:

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; 

позже вы можете сделать так, mething как:

signal ex : unsigned(field_a_range); 

Другое исправление может быть использовать функцию, которая немного бестолковым - используйте функцию. Хотя это эффективно создает экземпляр (хотя и скрывает его немного).

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

Затем используйте его как:

signal ex : unsigned(field_a_length-1 downto 0); 
Смежные вопросы