子程序中的重载功能,但我有"already been defined"



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

** 错误: 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;

仅当具有相同函数名称和不同参数列表时,才会发生函数重载。使用 impure 不会重载另一个函数。因此,您有两个版本的奇偶校验,它们不带输入并输出std_logic。因此编译错误。

您也没有在包正文中提供此版本的奇偶校验。

您的软件包中还有其他错误,这些错误在上下文子句中缺少库子句 (library ieee;(。过程paritybegin后有一个变量声明,奇偶校验 1 和 奇偶校验 2 的初始值为 0(数字文字(,没有rst_nmclk的声明,parpar <= ...中不是信号,没有过程parity主体或没有参数的函数parity

IEEE Std 1076-2008
12.3 可见性

紧接在同一声明性区域内的两个声明,除了组件实例化隐含的块的声明区域或泛型映射包或等效于包实例或子程序实例的子程序的声明区域之外,不应是

同形异义词,除非其中只有一个是预定义操作的隐式声明,或者是此类隐式声明的隐式别名。

(此处没有隐式声明,也没有预定义的操作,强调添加

同样在 12.3 中

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

4.5子程序重载
4.5.1

当且仅当两个形式参数列表具有相同数量的参数时,并且如果在每个参数位置,相应的参数具有相同的

基本类型,则称它们具有相同的参数类型配置文件。当且仅当两个子程序具有相同的参数类型配置文件时,并且如果两个子程序都是具有相同结果基类型的函数,或者两者都不是函数,则称两个子程序具有相同的参数和结果类型配置文件

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

Modelsim有一个verror工具提供了更多的解释:

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

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

相关内容

最新更新