如何在VHDL(87年后;即93,2008年)中为函数调用编写别名?

时间:2018-12-17 11:18:25

标签: function vhdl alias

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

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

87年以后的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.

别名定义是否错误或这是一个工具问题?

2 个答案:

答案 0 :(得分:2)

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

alias discard_current_elem is discard_elem[std_ulogic_vector, std_ulogic_vector return std_ulogic];

但是我不认为那是你想要的。

https://www.edaplayground.com/x/5QS_

答案 1 :(得分:1)

别名实际上就是重命名具有相同参数的相同功能(如@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;