これは実際には、どの VHDL ツールがどの標準リビジョンに準拠しているかに関係しています。
2 セットの VHDLアナライザーの 1 つが標準に準拠していませんが、標準のリビジョンはどれですか?
gdl 言います:
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
の EBNFname
は、-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' 列挙リテラルを持っていますが、位置値 (自然値) は BIT ('0', '1') では 1、std_ulogic ('U', 'X', '0', '1', 「Z」、「W」、「L」、「H」、「-」)。式を評価するには、位置の値が必要です。
ghdl/-1993 に戻る:
したがって、選択した名前が機能しました。文字リテラル自体はどこにも適合しませんが、-1993 の拡張ではname
ありますが、-2008 では適合します。
Modelsim と ActiveHDL が厳密に -1993 に準拠している場合、エラーになります。振り返ってみると、それらが -2008 に準拠していることは明らかであり、受け入れられている構文の違いを説明しています。
-1993 への準拠を保証するフラグが渡された場合、Modelsim と ActiveHDL は、エイリアス宣言を受け入れた場合、列挙リテラル宣言を関数名として扱っているように見えます。
-2008 より前は、文字リテラルを名前として扱うことができませんでした。名前付き列挙リテラルは常に名前として扱うことができます。この格差が、-2008 年character_literal
に追加された理由であると想像できます。name
現在、すべての列挙リテラルは「名前付き」です。
それで、私たちは質問に行きます:
しかし、それらは暗黙の宣言であり、例が選択された名前を使用している場合でも、すべてのエイリアスをこのように宣言する必要があるという意味ではありません.IMO. では、一部のベンダーが標準を誤解したのではないでしょうか?
暗黙のエイリアス宣言は、非オブジェクト エイリアスのセクションにある構文上および意味上の正しい表現です。-1993 規格と -2008 規格の両方に準拠しています。ghdl で失敗し、Modelsim で渡す例はそうではありません。
リビジョン間の移植性を維持するには、選択した名前を使用してください。新しい VHDL リビジョンの採用が大幅に遅れる可能性があります。
これはクリティカル マスの問題であり、最初に Aldec のJerry Kaczynskiが ActiveHDL を運転し、続いて Modelsim が解決しました。私が認識している活発に開発されている 2 つのオープン ソース実装も、-2008 準拠に向かって進んでいます。