Используйте тип до его объявления в VHDL (2008 г.)

Возможно ли в любой версии VHDL, может быть, в 2008 году, использовать тип до его объявления?

Например. У меня есть это объявление массива в архитектуре объекта:

type my_array is array (integer range <>) of my_type;

И все еще в том же разделе архитектуры, но позже в файле у меня есть это:

type my_type is record 
    my_field: signed(31 downto 0);
end record;

Теперь это дает следующую ошибку в Vivado:

[Synth 8-1031] my_type не объявлен

Решение, конечно же, состоит в том, чтобы переместить объявление записи над объявлением массива. Однако это становится очень сложным и запутанным с увеличением количества типов (поскольку вам в основном нужно топологически сортировать ваши типы с учетом их зависимостей).

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

Итак, возможно ли использовать тип в VHDL до его объявления, учитывая, что тип объявлен в той же архитектуре, в том же файле, но несколькими строками ниже?


person Piedone    schedule 21.09.2016    source источник
comment
Общие типы в VHDL-2008 могут помочь.   -  person user_1818839    schedule 22.09.2016
comment
Хм. Хотя дженерики могут помочь упростить некоторые сложные отношения зависимости, я не вижу, чтобы это облегчало задачу в целом (потому что теперь вы должны быть осторожны при отдельном подключении дженериков, что может привести к более длинному и сложному чтению кода, а также к повторению).   -  person Piedone    schedule 22.09.2016


Ответы (2)


Возможно ли в любой версии VHDL, например в 2008 году, использовать тип до его объявления?

No.

IEEE Std 1076-2008 6. Декларации

6.1 Общие

Язык определяет несколько видов именованных сущностей, которые объявляются явно или неявно в объявлениях. Имя каждой сущности определяется объявлением либо как идентификатор, либо как символ оператора, либо как символьный литерал.
...
Для каждой формы объявления правила языка определяют определенную область текста, называемую область действия декларации (см. 12.2). ...

12.2 Объем заявлений

Область действия объявления, за исключением тела архитектуры, простирается от начала объявления до конца непосредственно закрывающейся области объявлений; объем тела архитектуры простирается от начала до конца тела архитектуры. В любом случае эта часть области действия объявления называется непосредственной областью действия.

12.3 Видимость

Объявление видно только в определенной части его области видимости; эта часть начинается в конце объявления, за исключением объявления единицы проекта, отличной от единицы проверки PSL, объявления пакета или объявления защищенного типа, и в этом случае она начинается сразу после того, как зарезервированное слово встречается после идентификатора единица разработки, объявление пакета или объявление защищенного типа. Это правило применяется как к явным, так и к неявным объявлениям.

Это правила видимости, которые не позволяют вам ссылаться на тип до того, как он будет объявлен.

Кроме того, VHDL не поддерживает предварительное объявление типов, отличных от объявлений типов интерфейса (универсальных типов), но поддерживает подтипы, как показано в вашем примере my_array.

Обобщенные типы Брайан указывает, что полезность ограничена отсутствием поддержки поставщика синтеза, а также ограничениями на операции типа (см. 6.5.3 Объявления типа интерфейса), обобщенными в книге Питера Ашендена VHDL 2008 Just the New Stuff:

1.1 Общие типы

VHDL-2008 определяет ряд правил, охватывающих формальные универсальные типы и способы их использования. Формальное имя универсального типа потенциально может представлять любой тип с ограничениями, кроме типа файла или защищенного типа. Объект может только предполагать, что применимы операции, доступные для всех таких типов, а именно: присвоение; выделение с использованием нового; квалификация типов и преобразование типов; операции равенства и неравенства. Формальный универсальный тип нельзя использовать в качестве типа элемента файла или атрибута. Более того, его можно использовать только как тип явно объявленной константы или сигнала (включая порт), если фактический тип не является типом доступа и не содержит подэлемента типа доступа. Для сигналов предопределенный оператор равенства фактического типа используется для обновления драйвера и обнаружения событий.

person Community    schedule 22.09.2016
comment
Это печально, но я думаю, что с неудобной правдой нужно жить. Вы случайно не знаете каких-либо косвенных обходных путей, таких как типы доступа? - person Piedone; 22.09.2016

Обратите внимание, что для типов доступа существует особый случай, когда неполное объявление типа может быть ссылкой, чтобы разрешить типы для связанных списков, например:

type value_cell;  -- Incomplete declaration

type value_ptr is access value_cell;  -- value_cell only for access type

type value_cell is record  -- Full declaration
  value     : bit_vector(0 to 3);
  next_cell : value_ptr;
end record value_cell;

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

person Morten Zilmer    schedule 22.09.2016
comment
Это похоже на то, что могло бы решить мое дело. Но, как вы говорите, это не синтезируется, что является обломом... К сожалению, мне это нужно для синтезируемого кода. - person Piedone; 22.09.2016