2016-11-14 7 views
2

私はVHDL-2008の汎用パッケージ(リスト)に取り組んでいます。このパッケージには、要素型の汎用型があります。パッケージ内でこの要素型の配列型を宣言すると、それは新しい型です。従って、例えば。整数、私の新しいinteger_arrayは、ライブラリieeeからのinteger_vectorと互換性がありません。VHDLパッケージにジェネリック型パラメータとして配列型を渡すには?

したがって、配列型(たとえばinteger_vector)も渡す必要があります。その配列型の配列インスタンスが'range属性で使用されている場合、それは私QuestaSimに警告を与える:

Prefix of attribute "range" must be appropriate for an array object or must denote an array subtype.

方法は、ジェネリック型パラメータが配列で表すのでしょうか?

一般的なパッケージ:

package SortListGenericPkg is 
    generic (
    type ElementType; -- e.g. integer 
    type ArrayofElementType; -- e.g. integer_vector 
    function LessThan(L : ElementType; R : ElementType) return boolean;  -- e.g. "<" 
    function LessEqual(L : ElementType; R : ElementType) return boolean  -- e.g. "<=" 
); 

    function inside (constant E : ElementType; constant A : in ArrayofElementType) return boolean; 
end package; 

package body SortListGenericPkg is 
    function inside (constant E : ElementType; constant A : in ArrayofElementType) return boolean is 
    begin 
    for i in A'range loop -- this line causes the error 
     if E = A(i) then 
     return TRUE ; 
     end if ; 
    end loop ; 
    return FALSE ; 
    end function inside ; 
end package body; 

インスタンス:

package SortListPkg is 
    package SortListPkg_int is new work.SortListGenericPkg 
    generic map (
     ElementType  => integer, 
     ArrayofElementType => integer_vector, 
     LessThan   => "<", 
     LessEqual   => "<=" 
    ); 
    alias Integer_SortList is SortListPkg_int.SortListPType; 
end package SortListPkg ; 
+1

IEEE Std 1076-2008 16.2.3配列の事前定義された属性、A'RANGE、Prefix:配列オブジェクトまたはそのエイリアスに適切な接頭辞Aまたはインデックス範囲が定義された配列サブタイプを示す* ArrayofElementTypeクラスとサブタイプは、精緻化後まで認識されません。 6.5.3インタフェース型宣言*インタフェース型の値と適用可能な演算のセットは、環境の関連するサブタイプ、*、* ...によって定義されます。未定義の基本型と基本型のサブタイプ。基本型のクラス(5.1を参照)が定義されていません。* – user1155120

答えて

1

ModelSimが同様のエラー/警告を行い、それは多分VHDLの標準の問題です。

回避策は次のように、パッケージの一部としてArrayofElementTypeを宣言することです:

package SortListGenericPkg is 
    generic (
    type ElementType -- e.g. integer 
); 
    type ArrayofElementType is array (integer range <>) of ElementType; 
    function inside(constant E : ElementType; constant A : in ArrayofElementType) return boolean; 
end package; 

、その後insideが呼び出されたときのように、引数を変換:

... inside(int, ArrayofElementType(int_vec)); 

やタイプなどの簡単な使用ArrayofElementType可能であれば議論を宣言するとき。

+0

両方の配列を変換できますか?異なる互換性のないタイプとは考えられていませんか?どのように逆変換を行うことができますか? – Paebbels

+0

QuestaSimはこのエラーを表示します: '** Error:(vcom-1583) 'work.SortListGenericPkg.ArrayofElementType'から 'work.SortListGenericPkg.ArrayofElementType_Internal'(配列に数値ではない)への不正な型変換。配列であることが知られている。 **編集:**ああ、それは発信側にあります... – Paebbels

+0

私はそれが動作することを伝えることができます限り。しかし、少なくとも、新しい[VHDL Gitter channel](https://gitter.im/vhdl/General)の問題について議論している間、VHDLはパッケージのgenericリストの型パラメータの種類を指定する概念を必要としていることに気づいた。 – Paebbels

関連する問題