考虑以下VHDL记录:
type big_record_t is record
field_a : unsigned(15 downto 0);
field_b : unsigned(23 downto 0);
end record;
是否可以在记录字段上获取属性而不实例化记录本身?例如
signal ex : unsigned(big_record_t.field_a'range);
modelsim报告以下错误:
(vcom-1260) Type mark (big_record_t) cannot be prefix of selected name.
我知道获取实例化信号的属性是可能的,但是对于这种特定情况,我想从类型本身获取类型属性。
答案 0 :(得分:6)
您无法在类型上使用'range
属性,这是您在代码中尝试执行的操作。如果你要做这样的事情:
signal big_record_instance : big_record_t;
signal ex : unsigned(big_record_instance.field_a'range);
它应该可以工作,因为您现在正在尝试获取实例的范围,而不是类型。
如果您没有实例,另一种方法可能是根据定义记录类型的同一个包中的常量来设置宽度,如下所示:
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);
或者
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;
答案 1 :(得分:1)
另一个建议是做类似的事情:
subtype field_a_range is range 15 downto 0;
subtype field_b_range is range 31 downto 0:
type big_record_t is record
field_a : unsigned(field_a_range);
field_b : unsigned(field_b_range);
end record;
之后您可以执行以下操作:
signal ex : unsigned(field_a_range);
另一个修复可能是使用一个有点傻的函数 - 使用一个函数。虽然这有效地创建了一个实例(虽然隐藏了一点)。
function field_a_length return natural is
variable tmp : big_record_t;
begin
return tmp.field_a'length;
end function field_a_length;
然后将其用作:
signal ex : unsigned(field_a_length-1 downto 0);