Vhdl 了解类型和子类型与信号

Vhdl 了解类型和子类型与信号,vhdl,Vhdl,我目前在两个版本的VHDL模拟器之间有一个bug 我的代码(触发错误的简单版本) 然而,在新版本中,我在同一行上得到了一个“类型错误”。特别是 t_device_2_mpc_ibif.rd_data'(others => '0') 我在供应商处创建了一个bug,他告诉我使用以下代码: assert flash_cnt_2_mpc_o.rd_data = t_mpc_ibif_data'(others => '0') report"flash_cnt_2_mpc_o.rd_data

我目前在两个版本的VHDL模拟器之间有一个bug

我的代码(触发错误的简单版本)

然而,在新版本中,我在同一行上得到了一个“类型错误”。特别是

t_device_2_mpc_ibif.rd_data'(others => '0') 
我在供应商处创建了一个bug,他告诉我使用以下代码:

assert flash_cnt_2_mpc_o.rd_data = t_mpc_ibif_data'(others => '0') report"flash_cnt_2_mpc_o.rd_data should have been deasserted" severity error;
基于这些论点

在此上下文中,类型应为非所选类型


以下是我不理解的问题,我希望得到一个答案: 据我所知,有类型和子类型。子类型从类型继承

所以当你创造一个信号的时候

signal NameOfSignal : std_logic_vector(1 downto 0)
这个信号现在继承了std_逻辑_向量加上它的约束,即它是std_逻辑_向量类型的“子类型”

而无论信号是否在记录中都不应改变这一事实

我问了这个问题,得到了以下答案:

t_device_2_mpc_ibif.rd_data它不是类型名称,也不是子类型名称,而是所选名称(记录的元素名称)

但在我的世界里,这并不重要,因为信号(元素)继承了所有类型方法

请纠正我,因为我显然误解了什么

编辑:我用的是VHDL2008

问候 Anders

您的问题代码:

t_device_2_mpc_ibif.rd_data'(others => '0') 
在这一行中,您试图将
(其他=>'0')
限定为类型
t\u device\u 2\u mpc\u ibif.rd\u data
。问题以及技术支持人员所说的是,
rd_数据
不是一种类型,因此您不能将任何内容限定为它。没有“将其限定为与所提供信号相同的类型”的语法

示例:

signal foo : std_logic_vector (1 downto 0);
subtype MyType is std_logic_vector (1 downto 0);
signal bar : MyType;

——简单赋值,好吗
foo您的问题代码:

t_device_2_mpc_ibif.rd_data'(others => '0') 
在这一行中,您试图将
(其他=>'0')
限定为类型
t\u device\u 2\u mpc\u ibif.rd\u data
。问题以及技术支持人员所说的是,
rd_数据
不是一种类型,因此您不能将任何内容限定为它。没有“将其限定为与所提供信号相同的类型”的语法

示例:

signal foo : std_logic_vector (1 downto 0);
subtype MyType is std_logic_vector (1 downto 0);
signal bar : MyType;

——简单赋值,好吗
foo您的问题代码:

t_device_2_mpc_ibif.rd_data'(others => '0') 
在这一行中,您试图将
(其他=>'0')
限定为类型
t\u device\u 2\u mpc\u ibif.rd\u data
。问题以及技术支持人员所说的是,
rd_数据
不是一种类型,因此您不能将任何内容限定为它。没有“将其限定为与所提供信号相同的类型”的语法

示例:

signal foo : std_logic_vector (1 downto 0);
subtype MyType is std_logic_vector (1 downto 0);
signal bar : MyType;

——简单赋值,好吗
foo您的问题代码:

t_device_2_mpc_ibif.rd_data'(others => '0') 
在这一行中,您试图将
(其他=>'0')
限定为类型
t\u device\u 2\u mpc\u ibif.rd\u data
。问题以及技术支持人员所说的是,
rd_数据
不是一种类型,因此您不能将任何内容限定为它。没有“将其限定为与所提供信号相同的类型”的语法

示例:

signal foo : std_logic_vector (1 downto 0);
subtype MyType is std_logic_vector (1 downto 0);
signal bar : MyType;

——简单赋值,好吗
福
以下是我不理解的问题,我希望得到一个答案:

据我所知,有类型和子类型。子类型从类型继承

所以当你创造一个信号的时候

信号的信号名称:标准逻辑向量(1到0)

这个信号现在继承了std_逻辑_向量加上它的约束,即它是std_逻辑_向量类型的“子类型”

而无论信号是否在记录中都不应改变这一事实

我问了这个问题,得到了以下答案:

t_device_2_mpc_ibif.rd_data它不是类型名称,也不是子类型名称,而是所选名称(记录的元素名称)

但在我的世界里,这并不重要,因为信号(元素)继承了所有类型方法

请纠正我,因为我显然误解了什么

首先,在IEEE Std 1076-2008(LRM)中唯一提到继承的地方是VHPI,这里不适用。此外,您发现inherit的另一个地方是属性规范的描述(7.2)

有一个基本问题是,试图将语言和概念叠加到LRM之外,LRM是VHDL语言的正式规范

正如您的供应商所注意到的,LRM(5.3.3记录类型)支持标识符rd_数据,该数据不同于元素声明的子类型指示

您还可以注意到,元素声明不同于子类型声明(6.3)

9.3.5限定表达式

限定表达式是一种基本运算(请参见5.1),用于显式说明作为表达式或聚合的操作数的类型,可能还有子类型

限定表达式::=
键入标记(表达式)
|“标记”型骨料

操作数的类型应与类型标记的基本类型相同。限定表达式的值是操作数的值。限定表达式的求值对操作数求值,并将其转换为由类型标记表示的子类型

因此,限定表达式中可以使用的内容取决于类型标记的可接受性

这让我们看到6.3子类型声明:

键入标记::=
键入\u名称
|子类型名称

以及所附案文:

类型标记表示类型或子类型。如果类型标记是类型的名称,则类型标记表示该类型以及相应的无约束子类型。根据定义,类型标记的基类型是由类型标记表示的类型或子类型的基类型

如果我们查看subtype_声明,我们会看到子类型的名称是一个标识符:

子类型_声明::=
子类型标识符子类型指示

如果我们查看6.2类型声明:

键入声明::=
完整类型声明
|不完整的类型声明

完整类型声明::=
类型<