VHDL记录未完全约束

VHDL记录未完全约束,vhdl,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 : natur

我有一个通过函数创建的接口记录,但是当我试图编译时,我得到了一个关于接口不受约束的错误

记录:

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;
my_if   : inout t_my_if := init_my_if_signals(8)
函数声明:

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;
my_if   : inout t_my_if := init_my_if_signals(8)
功能体:

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;
my_if   : inout t_my_if := init_my_if_signals(8)
请注意,尽管其中一个记录参数是
std_logic_vector
,但它的大小在通过初始化函数创建时定义。因此,我不确定为什么会出现以下错误:

(vcom-1361)“my_if”的子类型未完全约束

该接口位于实体的
inout
端口上,因此看起来像:

my_if   : inout t_my_if := init_my_if_signals(8)
编辑:

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;
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

当记录被实例化时,我不能定义它吗?

在包中声明所有常量和宽度,并在接口中使用它们之前用正确的宽度定义所需的类型,怎么样

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;
所以根据,这在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模式下编译的吗

编辑:

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;
my_if   : inout t_my_if := init_my_if_signals(8)
这是您的问题:
t\u my\u if
部分未受约束。尝试:

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

顺便问一下:我的端口不好,m'kay?(除非你知道你在做什么)

我是在2008模式下编译的。在编辑中添加约束解决了我的问题。非常感谢。