【问题标题】:How to define default value for record type如何定义记录类型的默认值
【发布时间】:2019-03-30 20:28:11
【问题描述】:

是否可以为记录类型或通常任何用户定义的类型定义默认值?

类似(伪 VHDL):

type t_foo is record
    a : integer := 4;
    b : std_logic := '0';
end record;

或

subtype glarp is integer range 0 to 10 := 5;

编辑:将 glarp 从类型更改为子类型定义。

【问题讨论】:

  • 没有。类型声明不是对象声明。注意类型 glarp 不能从其他类型声明。您可以为元素类型(或 glarp)声明子类型,其中子类型的 'LEFT 值提供默认初始值。
  • IEEE Std 1076-2008 5. 类型,5.1 一般第 2 段(部分)“类型的特征在于一组值和一组操作。” 6.4 对象,6.4.1 总则第 1 段(部分)“object 是包含(具有)类型值的命名实体。对象是以下之一: — 声明的对象通过对象声明(参见 6.4.2)..."
  • 您可以在任何具有所需默认值的对象声明之前定义一个具有默认值的对象(例如类常量),其中具有显式默认初始值的对象可用于提供初始值对于相同类型的其他对象。这也可以用于复合对象类型的子元素,以及子元素类型的对象。注意合成工具并不普遍支持使用提供初始值的非静态对象(变量、信号),而标准支持。
  • 见What is the XY problem?。您可以使用minimal reproducible example 来说明您要解决的实际问题,而不是围绕您的实际问题进行射击。回答开放式问题可能需要来自 LRM 的参考文献数量可能超过此处的发布大小限制。
  • 感谢您表明 VHDL LRM 没有规定设置用户定义(记录)类型的默认值。将 'LEFT 值作为隐式默认值似乎有点粗略,特别是如果这意味着标量类型将要求默认值与标量类型范围的下限或上限相同。但这就是我们得到的。

标签: vhdl fpga asic


【解决方案1】:

我冒昧地将评论变成了答案。 记录类型的初始值可以由该类型的常量定义。

type t_foo is record
    a : integer;
    b : std_logic;
end record;

constant INIT_T_FOO : t_foo := (a => 4, b => '0');

signal bar : t_foo := INIT_T_FOO;

这种方法的一个缺点是用户必须确保在每次定义 t_foo 类型的对象时设置正确的初始值。使用常量来定义初始值可以节省一些输入,并且可以更容易地在以后更改初始值。但同样,以这种方式强制执行特定的初始值是不可能的,这一切都归结为编码纪律和人为错误,因此这是一个次优的解决方案。

【讨论】:

    猜你喜欢
    • 2021-03-04
    • 1970-01-01
    • 2018-08-22
    • 1970-01-01
    • 2016-12-25
    • 1970-01-01
    • 1970-01-01
    • 2013-03-28
    • 2021-06-07
    相关资源
    最近更新 更多