在 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