2017-03-08 23 views
1

を制約されていない私は、関数を経て作成されるインターフェースレコードを持っていますが、私がコンパイルしようとすると、私は、インターフェイスが制約されていないことについてエラーを取得します。VHDLレコードは完全に

記録:

type t_my_if is record 
    wdata : std_logic_vector; 
    wen : std_logic; 
end record; 

関数宣言:

function init_my_if_signals(data_width : natural) return t_my_if; 

機能本体:

function init_my_if_signals(data_width : natural) return t_my_if is 
    variable init_if : t_my_if(wdata(data_width - 1 downto 0)); 
begin 
    init_if.wdata := (others => '0'); 
    init_if.wen := '0'; 
    return init_if; 
end function; 

ノートトンレコードパラメータの1つがstd_logic_vectorであるにもかかわらず、サイズは初期化関数によって作成されるときに定義されます。だから私は、私は次のエラーを取得する理由はわからない:

(vcom-1361) Subtype of "my_if" is not fully constrained.

インタフェースは、エンティティのinoutポートであり、それは次のようになります:

my_if : inout t_my_if := init_my_if_signals(8) 

EDIT:

次のコードは動作しますが、データ幅を動的に定義できるようにしたいので、この解決策は私には最適ではありません。

新しいレコード:

type t_my_if is record 
    wdata : std_logic_vector(7 downto 0; 
    wen : std_logic; 
end record; 

新機能:

function init_my_if_signals(data_width : natural) return t_my_if is 
    variable init_if : t_my_if; 
begin 
--same as above 

レコードがinstantiatiedされたとき、私はこれを定義することができませんか?

答えて

1

のでDoulos VHDL 2008 small changesによると、これはVHDL-2008で許可されています。例:

type myRecordT is 
record 
    a : std_logic_vector; 
    b : std_logic_vector; 
end record; 

variable R : myRecordT(a(7 downto 0), b(15 downto 0)); 

VHDL-2008モードでコンパイルしていますか?

編集:

my_if : inout t_my_if := init_my_if_signals(8) 

あなたの問題があります:t_my_if部分が拘束されません。試してみてください:

my_if : inout t_my_if(wdata(7 downto 0)) := init_my_if_signals(8) 

ところで:inout ports are bad、m'kay?私は2008モードでコンパイルされた

+0

(しない限り、あなたは何をやっている知っています)。あなたの編集でやったように制約を加えることは私の問題を解決しました。ありがとうございました! – Aaron

0

どのようにパッケージ内のすべての定数と幅を宣言し、intefaceをでそれらを使用する前に、正しい幅で必要な型の定義について。

package my_if_pkg is 
    constant c_data_width : natural := 8; 

    type t_my_if is record 
     wdata : std_logic_Vector(c_data_width-1 downto 0); 
     wen : std_logic; 
    end record; 

    constant z_my_if : t_my_if := (wdata => (others => '0'), 
            wen => '0'); 
end package; 
... 

そして、インターフェイス内のパッケージを使用します。

use my_if_pkg.all; 
... 

my_if : inout t_my_if := z_my_if;