从VHDL记录类型获取字段的属性

Mau*_*ice 6 attributes vhdl

考虑以下VHDL记录:

type big_record_t is record
    field_a : unsigned(15 downto 0);
    field_b : unsigned(23 downto 0);
end record;
Run Code Online (Sandbox Code Playgroud)

是否可以在记录字段上获取属性而无需实例化记录本身?例如

signal ex : unsigned(big_record_t.field_a'range);
Run Code Online (Sandbox Code Playgroud)

modelsim报告以下错误:

(vcom-1260) Type mark (big_record_t) cannot be prefix of selected name.
Run Code Online (Sandbox Code Playgroud)

我知道获取实例化信号的属性是可能的,但对于这种特定情况,我想从类型本身获取类型属性.

sca*_*eff 7

您不能'range类型上使用该属性,这是您在代码中尝试执行的操作.如果你要做这样的事情:

signal big_record_instance : big_record_t;
signal ex : unsigned(big_record_instance.field_a'range);
Run Code Online (Sandbox Code Playgroud)

它应该可以工作,因为您现在正在尝试获取实例的范围,而不是类型.

如果你没有实例,另一种方法可能是根据定义记录类型的同一个包中的常量来设置宽度,如下所示:

constant field_a_width : integer := 16;

type big_record_t is record
        field_a : std_logic_vector(field_a_width-1 downto 0);
        field_b : std_logic_vector(23 downto 0);
end record;

signal ex : std_logic_vector(field_a_width-1 downto 0);
Run Code Online (Sandbox Code Playgroud)

也许

constant field_a_width : integer := 16;

subtype field_a_type is std_logic_vector(field_a_width-1 downto 0);

type big_record_t is record
        field_a : field_a_type;
        field_b : std_logic_vector(23 downto 0);
end record;

signal ex : field_a_type;
Run Code Online (Sandbox Code Playgroud)