Функция перегрузки в подпрограмме, но я это уже «определил» - PullRequest
0 голосов
/ 09 октября 2018

Я пытаюсь скомпилировать пакет подпрограмм и получаю эту ошибку:

** Ошибка: 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 голосов
/ 10 октября 2018

В вашем пакете есть дополнительные ошибки, в которых отсутствует условие библиотеки (library ieee;) в предложении контекста.Процедура parity имеет объявление переменной после begin, ваши начальные значения для четности1 и четности2 равны 0 (числовой литерал), декларации для rst_n или mclk, par в par <= ... нет.сигнал, нет тела для процедуры parity или функции parity без параметров.

IEEE Std 1076-2008
12.3 Видимость

Два объявления, которые происходят непосредственно в пределах одной и той же декларативной области, кроме декларативной области блока, подразумеваемой созданием компонента илидекларативная область общего или сопоставленного пакета или подпрограммы, эквивалентная экземпляру пакета или экземпляру подпрограммы, не должна быть гомографами , если только один из них не является неявным объявлением предопределенногооперация или является неявным псевдонимом такого неявного объявления.

(Здесь нет неявного объявления и предопределенной операции, выделение добавлено .)

Также в 12.3

... Каждое из двух объявлений называется гомографией другого, если и только если оба объявления имеют одинаковый указатель, и они обозначают разные именованные объекты, и любая перегрузка допускается дляне более одного из двух, или перегрузка разрешена для обоих объявлений, и они имеют одинаковый параметр и профиль типа результата (см. 4.5.1).

4.5 Перегрузка подпрограммы
4.5.1

Говорят, что два списка формальных параметров имеют одинаковый профиль типа параметра тогда и только тогда, когда они имеют одинаковое количество параметров, и если в каждой позиции параметра соответствующие параметры имеюттот же базовый тип.Говорят, что две подпрограммы имеют один и тот же параметр и профиль типа результата тогда и только тогда, когда оба имеют одинаковый профиль типа параметра, и если оба они являются функциями с одним и тем же базовым типом результата или ни один из них не являетсяfunction.

У вас более одной из этих ошибок.Vcom выйти после первого.Порядок, в котором обнаруживаются ошибки, оставлен для капризов реализации инструмента VHDL с применением семантических правил (другие инструменты могут сначала найти другие ошибки, объясняя, как были найдены ошибки в первом абзаце выше).

У Modelsim естьинструмент verror, предоставляющий дополнительные пояснения:

vcom Сообщение № 1295:
Два объявления, которые происходят непосредственно в пределах одной и той же декларативной области, не должны быть гомографиями, если только одно из них не является объявлением предопределенной операции,Каждое из двух объявлений называется гомографией другого, если оба объявления имеют один и тот же идентификатор, символ оператора или символьный литерал и если перегрузка допустима не более чем для одного из двух.Если для обеих деклараций допустима перегрузка, то каждая из двух является гомографией другой, если они имеют одинаковый идентификатор, символ оператора или символьный литерал, а также один и тот же параметр и профиль типа результата (см. 3.1.1).Перегрузка определяется только для подпрограмм (включая те, чей указатель является символом оператора) и литералов перечисления (включая литералы символов).
[DOC: IEEE Std 1076-1993 VHDL LRM - 10.3 Видимость]

(эти ссылки взяты из редакции стандарта -1993).

0 голосов
/ 09 октября 2018

Перегрузка функций происходит только тогда, когда у вас одно и то же имя функции с другим списком параметров.Использование нечистых не перегружает другую функцию.Таким образом, у вас есть две версии контроля четности, которые не требуют ввода и вывода std_logic.Следовательно, ошибка компиляции.

Вы также не указали эту версию контроля четности в теле пакета.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...