Function 如何用VHDL(post-87;即932008)为函数调用编写别名?

Function 如何用VHDL(post-87;即932008)为函数调用编写别名?,function,vhdl,alias,Function,Vhdl,Alias,我有一个函数调用来简化信号转换,否则会在整个源代码中重复 现在,作为进一步的优化,我希望使用别名使相当复杂的函数调用(两个参数基本相同)更具可读性,更易于编写 1987年之后的VHDL标准允许非数据对象使用别名,例如子程序调用。在寻找解决方案时,我了解到函数需要签名作为别名声明的一部分。然而,我找不到帮助我为使用Synopsys VCS的函数声明别名的文档 function discard_elem ( signal discard_vector : in std_ulogic_vector

我有一个函数调用来简化信号转换,否则会在整个源代码中重复

现在,作为进一步的优化,我希望使用别名使相当复杂的函数调用(两个参数基本相同)更具可读性,更易于编写

1987年之后的VHDL标准允许非数据对象使用别名,例如子程序调用。在寻找解决方案时,我了解到函数需要签名作为别名声明的一部分。然而,我找不到帮助我为使用Synopsys VCS的函数声明别名的文档

function discard_elem (
  signal discard_vector : in std_ulogic_vector(63 downto 0);
  signal id             : in std_ulogic_vector(5 downto 0))
  return std_ulogic is
begin
  return discard_vector(to_integer(unsigned(id)));
end discard_elem;

alias discard_current_elem is 
  discard_elem(discard_vector_i, interface_i.id) [ return std_ulogic ];
VCS报告以下错误,然后因分段错误退出:

Error-[ANL-ALIAS-BADSIGNAT] Bad signature in alias declaration
                                                                          ^
  No subprogram or enumeration literal matches the signature of the alias 
  declaration DISCARD_ELEM.
  Please verify that the signature matches the parameter and result type 
  profile of exactly one of the subprograms or enumeration literals.

别名定义是错误的还是工具问题?

我认为您将别名与宏(在Verilog和其他语言中)混淆了。别名中不能包含实际值(函数参数)。因此,您可以这样做:

alias discard_current_elem is discard_elem[std_ulogic_vector, std_ulogic_vector return std_ulogic];
但我不认为这是你所希望的


别名实际上就是对相同函数的重命名,使用相同的参数(如@Matthew Taylor所述)。您无法更改签名,因此仍必须使用与原始函数相同的参数调用别名

您建议的是一个包装器/助手函数/过程,它使用局部作用域访问局部信号/变量:

signal discard_vector_i : std_ulogic_vector(63 downto 0);
signal interface_id     : some_record_type;

impure function discard_current_elem return std_ulogc is 
begin
  return discard_elem(discard_vector_i, interface_i.id); -- scope used to access these parameters
end function;

IEEE Std 1076-2008 6.6.3非对象别名“以下规则适用于非对象别名:,,,,,,b)如果名称表示子程序(包括运算符)或枚举文字,则需要签名。在这种情况下,签名需要匹配(见4.5.3)由名称表示的一个子程序或枚举文字的参数和结果类型配置文件。“VCS找不到具有签名类型标记(4.5.3签名)的discard_vector_i和interface_i.id的声明函数discard_elem。子程序不是一个”非数据对象”(6.4对象),它是一个命名实体(6.1)。这是我一直在寻找的,谢谢。在声明别名之前,我已经尝试了函数调用-虽然是默认的纯函数。对于不纯函数,可以使用输入参数以外的其他对象()。感谢您的澄清。使用具有相同参数的另一个名称并不是我想要的,是的。我想让它更容易阅读。