【问题标题】:Partial assignment to signal of record type when setting initial value设置初始值时对记录类型信号的部分分配
【发布时间】:2019-03-30 20:34:08
【问题描述】:

是否可以在初始化时对记录类型进行部分分配?
比如:

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

signal bar : t_foo := (b => '0');

如果是正常的信号分配,我可以这样做:

bar.b <= '1';

但是在初始化信号或常量时这是不可能的。在我看来,设置初始值时必须分配所有记录成员,或者根本不分配。
使用函数可能有一种解决方法,但有没有更简单/更好/原生的方法?

【问题讨论】:

  • IEEE Std 1076-2008 6.4.2.3 信号声明第 5 段(部分)“默认表达式定义与信号关联的 默认值,或者,对于复合信号,及其每个标量子元素。”对于复合类型(包括记录),每个子元素都被表示。 5. 类型,5.1 总则第 10 段“在本标准中使用术语 子元素 代替术语 元素 来表示一个元素,或者另一个元素的一个元素,或者子元素。如果排除其他子元素,则使用术语元素。"
  • 8.3 选定名称第 1 段“选定名称用于表示一个命名实体,其声明出现在另一个命名实体的声明中或设计库中。”您对bar.b 的分配仅限于元素b。这里的重点是bar 不是bar.b 的对象。 bar 的声明是一个单对象声明(6.4.2 对象声明,6.4.2.1 总则第 3 段)。
  • 感谢 @user1155120 提供 LRM 的观点。但是,我可以想象在 LRM 的范围之外还有其他方法可以实现问题的目的。

标签: vhdl fpga asic


【解决方案1】:

由于函数参数可以有默认值,实现“部分初始化”的一种可能解决方法是使用 init 函数:

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

function init_t_foo(a : integer := 83423; b : std_logic := 'Z') return t_foo is
    variable ifoo : t_foo;
begin
    ifoo.a := a;
    ifoo.b := b;
    return ifoo;
end function init_t_foo;

constant bar : t_foo := init_t_foo(b => '1');

在调用函数时,只提供那些应该具有非默认值的参数,其他参数将保持不变。

编辑:固定变量赋值。

【讨论】:

  • 不太完整。 9.3.4 函数调用第 3 段“对于函数的每个形式参数,函数调用应准确指定一个对应的实际参数。此实际参数由关联中的关联元素(除了实际打开的部分)明确指定列表,或者在没有这样的关联元素的情况下,通过默认表达式(见 6.5.2)。” 6.5.2 接口对象声明第 7 段“如果接口声明包含“:=”符号后跟表达式,则该表达式被称为接口对象的默认表达式。...”
  • 你也可以注意 ifoo 是类变量(应该使用变量赋值语句)。如果没有默认表达式,init_t_foo 函数调用无法与函数声明匹配。
  • 您仍然没有为init_t_foo 子程序声明中的参数a 声明提供默认表达式。请参阅 6.5.2 接口对象声明中的 BNF。如果您从 sn-ps 构造 minimal reproducible example ,则如果没有默认表达式,它将无法成功分析(编译)。而adding the default expression allows analysis.
  • 您的困惑可能源于变量声明声明的对象和接口对象声明(6.5.2)之间的差异。对于前者(6.4.2.4 变量声明)“如果变量声明包括赋值符号后跟表达式,则表达式为声明的变量指定一个初始值;表达式的类型应为变量的类型。这样的表达式被称为初始值表达式。"和“在没有初始值表达式的情况下,应用默认初始值。”没有实际情况不适用。
  • 6.5.2 第 9 段“接口对象提供环境和描述的特定部分之间的通信通道。接口对象的值可以由关联对象的值或环境中的表达式;类似地,环境中对象的值可以由关联的接口对象的值确定。这种关联的方式在 6.5.7 中描述。没有默认表达式,关联的接口对象就没有值。
猜你喜欢
  • 2016-11-29
  • 2021-05-31
  • 2019-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-18
相关资源
最近更新 更多