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