自定义类型为 VHDL 2008 通用
Custom Type as VHDL 2008 Generic
我想在 entity
的 generic
部分使用 VHDL-2008 创建自定义类型。但是,我在使用此代码的 Modelsim 中立即收到错误消息。错误是:
** Error: C:/Projects/source/My_Mux.vhd(35): near "is": expecting ';' or ')'
请注意,第 35 行是下面的 type t_Array
:
entity My_Mux is
generic (
g_MUX_INPUTS : integer := 2;
type t_Array is array (0 to g_MUX_INPUTS-1) of std_logic_vector(7 downto 0)
);
port (
i_Select : in std_logic_vector(1 downto 0);
i_Mux_Data : in t_Array;
o_Data : out std_logic_vector(7 downto 0)
);
end entity My_Mux;
architecture RTL of My_Mux is
begin
o_Data <= i_Mux_Data(0) when i_Select = "00" else i_Mux_Data(1);
end architecture RTL;
我考虑创建一个我在代码的通用部分中定义的特殊函数。但这需要我重载实例化模块中的函数,我真的不想这样做,这似乎不必要地复杂。如果我可以在泛型中创建自定义类型,它将解决我的问题。可以使用 VHDL-2008 吗?
如果类型声明实际上是在泛型声明中进行的,您如何期望在正式类型和实际类型之间具有类型兼容性?
VHDL 中的每个声明都是唯一的,不是按名称而是按声明出现。名称引用的声明取决于范围和可见性。使用名称的两个(所有)地方必须能够达到相同的声明。
在 IEEE 标准 1076-2008 6.5.3 接口类型声明中找到了如何声明泛型类型:
An interface type declaration declares an interface type that appears as a generic of a design entity, a component, a block, a package, or a subprogram.
interface_type_declaration ::=
interface_incomplete_type_declaration
interface_incomplete_type_declaration ::= type identifier
An interface type provides a means for the environment to determine a type to be used for objects in a particular portion of a description. The set of values and applicable operations for an interface type may be determined by an associated subtype in the environment. The manner in which such associations are made is described in 6.5.7.
需要注意的重要一点是,这是一个不完整的类型声明,其中实际指定了一个具有子类型约束 (6.5.6.2) 的预先存在的类型:
The subtype denoted by a generic type is specified by the corresponding actual in a generic association list. It is an error if no such actual is specified for a given formal generic type (either because the formal generic is unassociated or because the actual is open).
因为该关联是与先前声明的类型关联的,所以与以 -1993 方式执行相同的操作几乎没有区别:
library ieee;
use ieee.std_logic_1164.all;
package my_package is
type my_array is array (natural range <>) of std_logic_vector(7 downto 0);
end package;
library ieee;
use ieee.std_logic_1164.all;
use work.my_package.all;
entity My_Mux is
generic (
g_MUX_INPUTS: integer := 2
--type t_Array is array (0 to g_MUX_INPUTS-1) of
-- std_logic_vector(7 downto 0)
);
port (
i_Select: in std_logic_vector(1 downto 0);
-- i_Mux_Data: in t_Array;
i_Mux_Data: in my_array (0 to g_MUX_INPUTS - 1);
o_Data : out std_logic_vector(7 downto 0)
);
end entity My_Mux;
architecture RTL of My_Mux is
begin
o_Data <= i_Mux_Data(0) when i_Select = "00" else i_Mux_Data(1);
end architecture RTL;
添加了一个具有类型声明 my_array
的包,它是一个未绑定(部分约束)的多维数组类型。
这允许使用包my_package
来指定实际的类型:
library ieee;
use ieee.std_logic_1164.all;
use work.my_package.all;
entity my_mux_tb is
end entity;
architecture foo of my_mux_tb is
constant MUX_INPUTS: natural := 2;
signal i_Select: std_logic_vector (1 downto 0);
signal i_Mux_Data: my_array (0 to MUX_INPUTS -1);
signal o_Data: std_logic_vector(7 downto 0);
begin
DUT:
entity work.My_mux
generic map (
g_MUX_INPUTS => MUX_INPUTS
)
port map (
i_Select => i_Select,
i_Mux_Data => i_Mux_Data,
o_Data => o_Data
);
end architecture;
上面的两个例子按顺序分析,详细说明和测试平台模拟(除了告诉我们子类型约束在实际端口上传递之外没有做任何特别有趣的事情)。
组件或实体实例化以及端口实际声明的位置都需要访问自定义类型。
使用泛型类型将允许您从 my_mux
上下文子句中删除 my_package
use 子句,取而代之的是依赖实际的关联。
您还可以在精化时绑定类型,而无需切换包(或依赖 -2008 中的包实例化及其自己的泛型)。
我想在 entity
的 generic
部分使用 VHDL-2008 创建自定义类型。但是,我在使用此代码的 Modelsim 中立即收到错误消息。错误是:
** Error: C:/Projects/source/My_Mux.vhd(35): near "is": expecting ';' or ')'
请注意,第 35 行是下面的 type t_Array
:
entity My_Mux is
generic (
g_MUX_INPUTS : integer := 2;
type t_Array is array (0 to g_MUX_INPUTS-1) of std_logic_vector(7 downto 0)
);
port (
i_Select : in std_logic_vector(1 downto 0);
i_Mux_Data : in t_Array;
o_Data : out std_logic_vector(7 downto 0)
);
end entity My_Mux;
architecture RTL of My_Mux is
begin
o_Data <= i_Mux_Data(0) when i_Select = "00" else i_Mux_Data(1);
end architecture RTL;
我考虑创建一个我在代码的通用部分中定义的特殊函数。但这需要我重载实例化模块中的函数,我真的不想这样做,这似乎不必要地复杂。如果我可以在泛型中创建自定义类型,它将解决我的问题。可以使用 VHDL-2008 吗?
如果类型声明实际上是在泛型声明中进行的,您如何期望在正式类型和实际类型之间具有类型兼容性?
VHDL 中的每个声明都是唯一的,不是按名称而是按声明出现。名称引用的声明取决于范围和可见性。使用名称的两个(所有)地方必须能够达到相同的声明。
在 IEEE 标准 1076-2008 6.5.3 接口类型声明中找到了如何声明泛型类型:
An interface type declaration declares an interface type that appears as a generic of a design entity, a component, a block, a package, or a subprogram.
interface_type_declaration ::=
interface_incomplete_type_declarationinterface_incomplete_type_declaration ::= type identifier
An interface type provides a means for the environment to determine a type to be used for objects in a particular portion of a description. The set of values and applicable operations for an interface type may be determined by an associated subtype in the environment. The manner in which such associations are made is described in 6.5.7.
需要注意的重要一点是,这是一个不完整的类型声明,其中实际指定了一个具有子类型约束 (6.5.6.2) 的预先存在的类型:
The subtype denoted by a generic type is specified by the corresponding actual in a generic association list. It is an error if no such actual is specified for a given formal generic type (either because the formal generic is unassociated or because the actual is open).
因为该关联是与先前声明的类型关联的,所以与以 -1993 方式执行相同的操作几乎没有区别:
library ieee;
use ieee.std_logic_1164.all;
package my_package is
type my_array is array (natural range <>) of std_logic_vector(7 downto 0);
end package;
library ieee;
use ieee.std_logic_1164.all;
use work.my_package.all;
entity My_Mux is
generic (
g_MUX_INPUTS: integer := 2
--type t_Array is array (0 to g_MUX_INPUTS-1) of
-- std_logic_vector(7 downto 0)
);
port (
i_Select: in std_logic_vector(1 downto 0);
-- i_Mux_Data: in t_Array;
i_Mux_Data: in my_array (0 to g_MUX_INPUTS - 1);
o_Data : out std_logic_vector(7 downto 0)
);
end entity My_Mux;
architecture RTL of My_Mux is
begin
o_Data <= i_Mux_Data(0) when i_Select = "00" else i_Mux_Data(1);
end architecture RTL;
添加了一个具有类型声明 my_array
的包,它是一个未绑定(部分约束)的多维数组类型。
这允许使用包my_package
来指定实际的类型:
library ieee;
use ieee.std_logic_1164.all;
use work.my_package.all;
entity my_mux_tb is
end entity;
architecture foo of my_mux_tb is
constant MUX_INPUTS: natural := 2;
signal i_Select: std_logic_vector (1 downto 0);
signal i_Mux_Data: my_array (0 to MUX_INPUTS -1);
signal o_Data: std_logic_vector(7 downto 0);
begin
DUT:
entity work.My_mux
generic map (
g_MUX_INPUTS => MUX_INPUTS
)
port map (
i_Select => i_Select,
i_Mux_Data => i_Mux_Data,
o_Data => o_Data
);
end architecture;
上面的两个例子按顺序分析,详细说明和测试平台模拟(除了告诉我们子类型约束在实际端口上传递之外没有做任何特别有趣的事情)。
组件或实体实例化以及端口实际声明的位置都需要访问自定义类型。
使用泛型类型将允许您从 my_mux
上下文子句中删除 my_package
use 子句,取而代之的是依赖实际的关联。
您还可以在精化时绑定类型,而无需切换包(或依赖 -2008 中的包实例化及其自己的泛型)。