Vhdl 设置初始值时对记录类型信号的部分赋值

Vhdl 设置初始值时对记录类型信号的部分赋值,vhdl,fpga,asic,Vhdl,Fpga,Asic,是否可以在初始化时对记录类型进行部分赋值? 比如: type t_foo is record a : integer; b : std_logic; end record; signal bar : t_foo := (b => '0'); 在正常信号分配的情况下,我可以: bar.b <= '1'; 然而,当初始化信号或常数时,这是不可能的。在我看来,在设置初始值时,似乎必须分配所有记录成员,或者根本不分配。 使用函数可能有一种解决方法,但是否有一种更简单/更

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

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

signal bar : t_foo := (b => '0');
在正常信号分配的情况下,我可以:

bar.b <= '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');
调用函数时,仅提供那些应具有非默认值的参数,其他参数将保持不变


编辑:固定变量赋值。

由于函数参数可以有默认值,因此实现部分初始化的一个可能解决方法是使用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');
调用函数时,仅提供那些应具有非默认值的参数,其他参数将保持不变


编辑:固定变量分配。

IEEE Std 1076-2008 6.4.2.3信号声明第5段部分默认表达式定义了与信号相关的默认值,或者对于复合信号,定义了与信号的每个标量子元素相关的默认值。对于包含记录的复合类型,表示每个子元素。5.类型,5.1总则第10段本标准中使用术语“子元素”代替术语“元素”,以表示一个元素或另一个元素或子元素的元素。如果排除了其他子元素,则使用术语元素。8.3选定名称第1段选定名称用于表示命名实体,其声明出现在另一命名实体的声明或设计库中。您对bar.b的赋值仅限于元素b。这里的要点是,bar是对象,而不是bar。bar声明是单对象声明6.4.2对象声明,6.4.2.1一般第3段。感谢@user1155120就此给出LRM的观点。然而,我可以想象,在LRM.IEEE Std 1076-2008 6.4.2.3信号声明的范围之外,还有其他方法可以实现问题的要求。第5段中,部分默认表达式定义了与信号相关的默认值,或者,对于复合信号,定义了其每个标量子元素。对于包含记录的复合类型,表示每个子元素。5.类型,5.1总则第10段本标准中使用术语“子元素”代替术语“元素”,以表示一个元素或另一个元素或子元素的元素。如果排除了其他子元素,则使用术语元素。8.3选定名称第1段选定名称用于表示命名实体,其声明出现在另一命名实体的声明或设计库中。您对bar.b的赋值仅限于元素b。这里的要点是,bar是对象,而不是bar。bar声明是单对象声明6.4.2对象声明,6.4.2.1一般第3段。感谢@user1155120就此给出LRM的观点。然而,我可以想象,在LRM的范围之外,还有其他方法可以实现问题所要求的,但还不完全。9.3.4函数调用第3段对于函数的每个形式参数,函数调用应精确指定一个对应的实际参数。该实际参数由关联列表中打开的实际零件以外的关联元素明确指定,或在没有此类关联元素的情况下,由默认表达式指定,见6.5.2。6.5.2接口对象声明第7段如果接口声明包含“:=”符号后跟表达式,则该表达式称为接口对象的默认表达式。。。您还可以注意到ifoo是类变量,应该使用变量赋值语句。如果没有默认表达式,则init\u t\u foo函数调用无法与函数声明匹配。您仍然没有为init\u t\u foo子程序声明中的参数a声明提供默认表达式。参见6.5.2接口对象声明中的BNF。如果用代码段构造一个表达式,如果没有默认表达式,它将无法成功地分析compile。然而,您的混淆可能源于变量声明声明的对象与接口对象声明6.5.2之间的差异。对于前面的6.4.2.4变量声明,如果变量声明包括赋值符号,后跟表达式,则表达式指定声明变量的初始值;表达式的类型应为变量的类型。这种表达式被称为初始值表达式。在没有初始值的情况下
默认值表达式,应用默认初始值。如果没有实际的接口,则不适用。6.5.2第9段接口对象在环境和描述的特定部分之间提供通信通道。接口对象的值可由环境中关联对象或表达式的值确定;类似地,环境中对象的值可以由关联接口对象的值确定。6.5.7中描述了此类关联的方式。如果没有默认表达式,关联的接口对象没有值。不完全。9.3.4函数调用第3段对于函数的每个形式参数,函数调用应精确指定一个对应的实际参数。该实际参数由关联列表中打开的实际零件以外的关联元素明确指定,或在没有此类关联元素的情况下,由默认表达式指定,见6.5.2。6.5.2接口对象声明第7段如果接口声明包含“:=”符号后跟表达式,则该表达式称为接口对象的默认表达式。。。您还可以注意到ifoo是类变量,应该使用变量赋值语句。如果没有默认表达式,则init\u t\u foo函数调用无法与函数声明匹配。您仍然没有为init\u t\u foo子程序声明中的参数a声明提供默认表达式。参见6.5.2接口对象声明中的BNF。如果用代码段构造一个表达式,如果没有默认表达式,它将无法成功地分析compile。然而,您的混淆可能源于变量声明声明的对象与接口对象声明6.5.2之间的差异。对于前面的6.4.2.4变量声明,如果变量声明包括赋值符号,后跟表达式,则表达式指定声明变量的初始值;表达式的类型应为变量的类型。这种表达式被称为初始值表达式。如果没有初始值表达式,则应用默认初始值。如果没有实际的接口,则不适用。6.5.2第9段接口对象在环境和描述的特定部分之间提供通信通道。接口对象的值可由环境中关联对象或表达式的值确定;类似地,环境中对象的值可以由关联接口对象的值确定。6.5.7中描述了此类关联的方式。如果没有默认表达式,则关联的接口对象没有值。