VHDL:为什么没有为枚举定义长度?

VHDL: Why is 'length not defined for enums?

我有以下枚举声明:

type T_STATUS is (   -- position / index
  STATUS_INIT,           -- pos = 0
  STATUS_RECONFIGURING,  -- pos = 1
  STATUS_RELOADING,      -- pos = 2
  STATUS_READY,          -- pos = 3
  STATUS_ERROR           -- pos = 4
);

为什么无法使用 T_STATUS'length 获取 T_STATUS 成员的计数?

示例代码:

constant Count : POSITIVE := T_STATUS'length;

解决方法:
可以使用 T_STATUS'highT_STATUS'pos 获得该数字,如下所示:

constant Count : POSITIVE := T_STATUS'pos(T_STATUS'high) + 1;

这是可行的,因为 'high 给出了最后一个枚举成员,而 'pos 将这个成员转换为它在枚举列表中的位置。因为位置从 0 开始,所以必须加 1 才能得到正确的 count/length.


更新: 'length 和许多其他功能已被我添加到 VHDL 标准中。从VHDL-2019开始,支持获取枚举类型的元素个数。请参阅 IEEE 标准。 1076-2019 或 http://www.eda-twiki.org/cgi-bin/view.cgi/P1076/VHDL2017 了解更多详情和其他类似更改。

@Paebbels

之前的任何修订都没有人要求这样做。顺便说一句,工作组需要其他有经验的用户参与,比如您自己。这将有助于确保我们为下一次修订完成相关工作。

此请求在此处捕获: http://www.eda.org/twiki/bin/view.cgi/P1076/EnumAttributes

我们的 twiki 从这里开始: http://www.eda.org/twiki/bin/view.cgi/P1076/

当前提案在这里: http://www.eda.org/twiki/bin/view.cgi/P1076/CollectedRequirements

会议信息在这里: http://www.eda.org/twiki/bin/view.cgi/P1076/MeetingMinutes

IEEE 1076 是一个基于个人的工作组,鼓励 VHDL 社区的参与。参加没有特殊的会员资格要求。帮助塑造下一个版本,加入我们。

吉姆·刘易斯 1076 工作组主席

更重要的是,枚举类型是标量类型而不是数组类型。

'LENGTH 在 IEEE Std 1076-2008 16.2.3 数组的预定义属性中指定。

来自 5.2.2 枚举类型,5.2.2.1 概述,第 5 段:

Each enumeration literal yields a different enumeration value. The predefined order relations between enumeration values follow the order of corresponding position numbers. The position number of the value of the first listed enumeration literal is zero; the position number for each additional enumeration literal is one more than that of its predecessor in the list.

我们看到每个枚举文字根据其声明顺序表示一个位置编号,第一个值的位置编号为零('workaround' 的基础)。

这一切都是因为VHDL是一种形式化的表示法。长度不描述值的范围,它描述数组中元素的数量。