2017-03-08 35 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; 

注ŧ儘管其中一個記錄參數是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) 

編輯:

下面的代碼有效,但我希望能夠動態定義數據寬度,所以這個解決方案對我來說並不是最優的。

新紀錄:

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? (除非你知道你在做什麼)

+0

我在2008年編譯模式。像您在編輯中一樣添加約束條件解決了我的問題。謝謝! – Aaron

0

如何在包中聲明所有常量和寬度,並在界面中使用它們之前使用正確的寬度定義所需的類型。

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;