Каков правильный синтаксис для псевдонима символьного литерала в перечислении?

В образовательных целях я пытаюсь объявить псевдоним для значения перечисления, которое является символьным литералом. В приведенном ниже примере я пытаюсь создать псевдоним bit_one для значения '1' в типе перечисления bit (заявлено в стандартном стандарте).

Я озадачен тем, почему первая форма ниже отклонена двумя компиляторами (GHDL 0.29.1 и Quartus II 13.01), в то время как вторая форма принимается теми же двумя, плюс ModelSim и ActiveHDL. Отсюда вопрос: незаконно ли объявлять этот псевдоним, как в закомментированной строке ниже?

entity character_literal_alias is
end;

architecture rtl of character_literal_alias is
    --alias bit_one is '1'[return bit];             -- Doesn't work in GHDL or Quartus
    alias bit_one is std.standard.'1'[return bit];  -- Works with ModelSim, ActiveHDL, GHDL, and Quartus

    alias append is append_mode[return file_open_kind];  -- Works with the whole bunch
begin
end;

Я использую переключатель VHDL-2002 в GHDL и VHDL-2008 в других инструментах.

Если бы я немного рассуждал, в LHM VHDL-2008 все примеры записаны в виде:

-- implicit aliases ...
-- alias '0' is STD.STANDARD.'0' [return STD.STANDARD.BIT];
-- alias '1' is STD.STANDARD.'1' [return STD.STANDARD.BIT];

Но это неявные объявления, и даже если в примерах используются выбранные имена, это не означает, что каждый псевдоним должен быть объявлен таким образом, IMO. Так может быть, некоторые поставщики неверно истолковали стандарт?

1 ответ

Решение

Это на самом деле относится к тому, какой инструмент VHDL соответствует какой редакции стандарта

Один из двух наборов анализаторов VHDL не соответствует стандарту, но какой стандарт пересмотрен?

Гхдл говорит:

charlitalias.vhdl:5:22: identifier expected here
ghdl: compilation error

Хотя это и не особенно поучительное сообщение об ошибке, GHDL по умолчанию соответствует стандарту IEEE Std 1076-1993. GHDL по умолчанию --std=93c, что соответствует -1993 г. смягченным правилам, касающимся последующих стандартных изменений. Стандартных изменений, затрагивающих этот вопрос, до редакции -2008 нет, поэтому --std=02 не должно иметь никакого отношения.

Следующие выдержки взяты из стандарта -1993, если не указано иное. Также обратите внимание, что EBNF, найденный в стандартном теле, является нормативно-определяющим синтаксисом, а текст содержит семантическую спецификацию.

4.3.3 Объявления псевдонимов

Объявление псевдонима объявляет альтернативное имя для существующей именованной сущности.

alias_declaration ::=  
     alias alias_designator [ : subtype_indication ] is name [ signature ] ;

Куда:

name ::=                                                    [§ 6.1]  
      simple_name  
    | operator_symbol  
    | selected_name
    | indexed_name  
    | slice_name  
    | attribute_name  

ЕБНФ для name обновлен в стандарте -2008, 8.1:

name ::= 
    simple_name
  | operator_symbol 
  | character_literal 
  | selected_name
  | indexed_name
  | slice_name
  | attribute_name 
  | external_name

В -2008 он включает символьный литерал, который является лексическим элементом.

Это делает пример:

alias bit_one is '1'[return bit];  

законный в -2008. Символьный литерал можно рассматривать как имя в alias_declaration,

В примере, который работал универсально, указывается выбранное имя (расширенное имя) с суффиксом, который является символьным литералом:

alias bit_one is std.standard.'1'[return bit];

Причина, по которой выбранное имя работает для символьного литерала, содержится в 6.3 Выбранные имена, пункт 9:

Расширенное имя обозначает именованную сущность, объявленную в пакете, если префикс обозначает пакет, а суффикс - это простое имя, символьный литерал или символ оператора именованной сущности, объявление которой происходит непосредственно в этом пакете.

Далее этот суффикс обрабатывается так, как если бы это было имя функции:

3.1.1 Типы перечисления, пункт 4:

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

В стандарте -2008, 5.2.2.1, есть некоторые пояснения:

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

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

Псевдонимы классифицируются по тому, ссылаются ли они на объекты (сигналы, константы, переменные, файлы, именованные объекты) или другие именованные объекты.

Необъектный псевдоним (-1993 4.3.3.2, -2008 6.6.3) требует подписи для символьного литерала. Сигнатура предоставляет тип возвращаемого значения, например, функцию, разрешающую разрешение перегрузки для символьного литерала, что само по себе неоднозначно. Знание типа необходимо для устранения неоднозначности позиционного значения литерала перечисления. Возьмите, например, BIT и введите std_ulogic. Оба имеют литералы перечисления "1", но позиционное значение (натуральное) равно 1 для BIT ("0", "1") и 3 для std_ulogic ("U", "X", "0", "1", "Z", "W", "L", "H", "-"). Оценка выражений требует позиционного значения.

Вернуться к ghdl/-1993:

Таким образом, выбранное имя сработало. Символьный литерал сам по себе не подходит нигде в расширении -1993 name, но делает для -2008.

Если бы Modelsim и ActiveHDL строго соответствовали -1993, они были бы ошибочными. В ретроспективе очевидно, что они соответствуют стандарту -2008, что объясняет разницу в принятом синтаксисе.

Если бы им был передан флаг для обеспечения соответствия -1993, Modelsim и ActiveHDL, по-видимому, рассматривали бы объявление литерала перечисления как имя функции, если бы они приняли объявление псевдонима.

До -2008 вы не могли трактовать буквальный символ как имя. Вы всегда можете рассматривать именованные литералы перечисления как имя. Вы можете себе представить, почему это несоответствие character_literal был добавлен в name в 2008. Теперь все перечисляющие литералы именуются.

Итак, мы подходим к вопросу:

Но это неявные объявления, и даже если в примерах используются выбранные имена, это не означает, что каждый псевдоним должен быть объявлен таким образом, IMO. Так может быть, некоторые поставщики неверно истолковали стандарт?

Неявные объявления псевдонимов являются синтаксически и семантически правильными представлениями, найденными в разделе, посвященном необъектным псевдонимам. Они оба соответствуют стандартам -1993 и -2008. Ваш пример, который терпит неудачу в ghdl и проходит в Modelsim, не.

Для обеспечения переносимости между версиями используйте выбранное имя. Вы могли бы значительно увеличить скорость принятия новых версий VHDL.

Это проблема критической массы, решенная первым Джерри Качиньским в Aldec за рулем ActiveHDL, за которым следует Modelsim. Я знаю, что активно разрабатываются две реализации с открытым исходным кодом, которые также соответствуют требованиям -2008.

Другие вопросы по тегам