在 VHDL 中将 Others 与 Aggregate 一起使用
Use Others with Aggregate in VHDL
我正在尝试 return 一个 word
定义为:
subtype word is std_logic_vector(word_len - 1 downto 0);
通过像这样连接来自记录的一大堆其他输入(这在开关块内):
return get_opc(ins.op) & std_logic_vector(ins.val) & "0000"; -- TODO Replace these with some sort of others construct
但是,不同的操作码具有不同的其他输入集,因此需要用零右填充的数量会发生变化。我不是手动硬编码尾随零的忠实拥护者,这是一团糟的广告,如果我调整字的大小,它就不会很好地播放。
我的直觉是尝试:
return get_opc(ins.op) & std_logic_vector(ins.val) & (others => '0');
但显然您不能在这种情况下使用 others
作为聚合。
我知道我可以创建一个单词大小的缓冲区,用零填充它,然后将我的不同输入插入不同的切片,但是 AFAIK,这会非常冗长,需要我指定开始和结束点每个切片,而不仅仅是将它们连接在左侧。这很快就会变得非常混乱。
是否有任何简单的方法可以使所有内容简洁明了?
如果您使用 VHDL-2008(或 VHDL-2019!),您可以 return 像这样的聚合:
return (get_opc(ins.op), std_logic_vector(ins.val), others => '0');
这假设您的 return 类型是 constrained。换句话说,这是可以的:
function F return word is
begin
return (get_opc(ins.op), std_logic_vector(ins.val), others => '0');
end function;
而如果您的 return 类型是 unconstrained 这样的,那就不行了:
function F return std_logic_vector is
我正在尝试 return 一个 word
定义为:
subtype word is std_logic_vector(word_len - 1 downto 0);
通过像这样连接来自记录的一大堆其他输入(这在开关块内):
return get_opc(ins.op) & std_logic_vector(ins.val) & "0000"; -- TODO Replace these with some sort of others construct
但是,不同的操作码具有不同的其他输入集,因此需要用零右填充的数量会发生变化。我不是手动硬编码尾随零的忠实拥护者,这是一团糟的广告,如果我调整字的大小,它就不会很好地播放。
我的直觉是尝试:
return get_opc(ins.op) & std_logic_vector(ins.val) & (others => '0');
但显然您不能在这种情况下使用 others
作为聚合。
我知道我可以创建一个单词大小的缓冲区,用零填充它,然后将我的不同输入插入不同的切片,但是 AFAIK,这会非常冗长,需要我指定开始和结束点每个切片,而不仅仅是将它们连接在左侧。这很快就会变得非常混乱。
是否有任何简单的方法可以使所有内容简洁明了?
如果您使用 VHDL-2008(或 VHDL-2019!),您可以 return 像这样的聚合:
return (get_opc(ins.op), std_logic_vector(ins.val), others => '0');
这假设您的 return 类型是 constrained。换句话说,这是可以的:
function F return word is
begin
return (get_opc(ins.op), std_logic_vector(ins.val), others => '0');
end function;
而如果您的 return 类型是 unconstrained 这样的,那就不行了:
function F return std_logic_vector is