子程序中的重载函数,但是我已经“已经定义”

时间:2018-10-09 13:41:16

标签: vhdl overloading pack questasim

我正在尝试编译子程序包,但出现此错误:

  

**错误:C:/Users/kmgrytte/Downloads/subprog_pck.vhd(16):(vcom-1295)功能“奇偶校验”已在该区域中定义。   ** =====>“奇偶校验”的先前声明位于C:/Users/kmgrytte/Downloads/subprog_pck.vhd(12)。   **错误:C:/Users/kmgrytte/Downloads/subprog_pck.vhd(20):VHDL编译器退出

这样的重载在我的主程序中起作用,并且在在线子程序中找不到任何重载的好例子。

use IEEE.std_logic_1164.all;
use ieee.numeric_std.all;

package subprog_pck is
    procedure parity;
    procedure parity(
    in1 : in std_logic_vector(15 downto 0);
    in2 : in std_logic_vector(15 downto 0);
    par : out std_logic);

    function parity return std_logic;
    function parity(
    indata : in std_logic_vector(15 downto 0)) return std_logic;

    impure function parity return std_logic;
    impure function parity(
    indata : in unsigned(15 downto 0)) return std_logic;

end package subprog_pck;

package body subprog_pck is

procedure parity(
    in1 : in std_logic_vector(15 downto 0);
    in2 : in std_logic_vector(15 downto 0);
    par : out std_logic) is
    begin
    variable parity1, parity2 : std_logic:=0;
    if (rst_n = '0') then       
      parity1 := '0';
      parity2 := '0';
      par <= '0';
    elsif rising_edge(mclk) then
      parity1 := '0';
      for i in in1'range loop
        if in1(i) = '1' then
          parity1 := not parity1;
        end if;        
      end loop;      
      parity2 := '0';
      for j in in2'range loop
        parity2 := parity2 xor in2(j); 
      end loop;
      par <= parity1 xor parity2;
    end if;
    end parity;

function parity(indata : in std_logic_vector(15 downto 0))  return std_logic     is
    variable parity_var : std_logic := '0';
    begin
        for i in indata'range loop
            if (indata(i) = '1') then
                parity_var := not parity_var;
            end if;
        end loop;
    return parity_var;
end function parity;

function parity(indata : in unsigned(15 downto 0))
    return std_logic is
    variable parity_var : std_logic := '0';
    begin
        for j in indata'range loop  
            parity_var := parity_var xor indata(j);
        end loop;
    return parity_var;
end function parity;


end package body subprog_pck;

2 个答案:

答案 0 :(得分:1)

仅当您具有相同的函数名称和不同的参数列表时,才会发生函数重载。使用不纯不会使其他功能过载。因此,您有两个版本的奇偶校验不带任何输入,却输出一个std_logic。因此出现编译错误。

您还没有在包主体中提供此版本的奇偶校验。

答案 1 :(得分:0)

您的程序包中还有其他错误,其中缺少context子句中的library子句(library ieee;)。过程paritybegin之后有一个变量声明,您的parity1和parity2的初始值为0(数字文字),没有rst_nmclk的声明,{ par中的{1}}不是信号,没有任何参数的过程par <= ...或函数parity的主体。

IEEE Std 1076-2008
12.3可见性

  

两个声明立即在同一声明性区域中发生,但组件实例隐含的块的声明性区域或等同于包实例或子程序实例的通用映射包或子程序的声明性区域所隐含的块的声明性区域< strong> 不得为同形异义词 ,除非其中之一恰好是预定义操作的隐式声明或该隐式声明的隐式别名。

(这里没有隐式声明,也没有预定义的操作,已添加 强调 。)

也在12.3

  

...当且仅当两个声明具有相同的指示符,并且它们表示不同的命名实体,并且允许重载时,才将两个声明中的每个声明为另一个的同形文字。最多为两个声明之一,或者两个声明都允许重载,并且它们具有相同的参数和结果类型配置文件(请参见4.5.1)。

4.5子程序重载
4.5.1

  

两个形式参数列表,只要且仅当它们具有相同数量的参数,并且在每个参数位置处对应的参数具有相同的基本类型时,才称为具有相同的参数类型配置文件。当且仅当两个子程序具有相同的参数类型配置文件,并且两个子程序都是具有相同结果基类型的函数,或者两个子程序都不相同时,才说这两个子程序具有相同的参数和结果类型配置文件一个功能。

您有多个以上错误之一。 vcom在第一个之后退出。发现错误的顺序留给了应用语义规则的VHDL工具实现的变幻莫测(其他工具可能会先发现其他错误,解释如何找到上面第一段中的错误)。

Modelsim有一个错误工具,提供了更多解释:

  

vcom消息#1295:
  在同一个声明中立即出现的两个声明   区域一定不能是同形异义词,除非其中一个恰好是   声明预定义的操作。   如果两个声明中的每一个都被认为是另一个的同形异义词   声明具有相同的标识符,运算符或字符   字面值,并且最多允许两者之一重载。   如果两个声明都允许重载,则两个都为   另一个同形异义词(如果它们具有相同的标识符)   符号或字符文字,以及相同的参数和结果   类型配置文件(请参阅3.1.1)。重载仅针对子程序定义   (包括那些指定者是操作员符号的人)和   枚举文字(包括字符文字)。
  [DOC:IEEE Std 1076-1993 VHDL LRM-10.3可见性]

(这些参考资料来自标准的-1993修订版。)