Использование пользовательских пакетов вызывает циклическую зависимость

Я пытаюсь объявить беззнаковый массив в пакете, чтобы использовать один и тот же тип массива во всех своих компонентах. Сначала я объявил его в компоненте верхнего уровня, а затем использовал рабочую библиотеку и команду use для вызова пакета в каждом компоненте. Я получаю предупреждение, которое говорит

ПРЕДУПРЕЖДЕНИЕ: ProjectMgmt: 454 — круговая зависимость файла обнаружена с использованием правила: определить перед использованием.

Я также получаю сообщение об ошибке

Строка 27: Не удается найти <test2> в библиотеке <work>. Убедитесь, что библиотека была скомпилирована и что в файле VHDL присутствуют библиотека и предложение использования.

Почему существует круговая зависимость, и правильно ли я создаю и использую пакет?

Компонент верхнего уровня

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

package pkg is
  type array_unsigned is array (99 downto 0) of UNSIGNED(7 downto 0);
end package;

package body pkg is
end package body;

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
library work;
use work.pkg.ALL;

entity test1 is
end test1;

architecture Behavioral of test1 is
    signal input : array_unsigned;
begin
sub: entity work.test2(Behavioral)
    port map(input=>input);
end Behavioral;

Компонент нижнего уровня

library IEEE;
library work;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
use work.pkg.ALL;

entity test2 is
    Port (input : in array_unsigned);
end test2;

architecture Behavioral of test2 is

begin


end Behavioral;

person Eugene Wu    schedule 16.09.2015    source источник
comment
Какой инструмент вы используете? Ваш код отлично компилируется в ModelSim, изменив выходной порт test1 на входной. Кроме того, вам не нужно объявлять библиотеку work.   -  person scary_jeff    schedule 16.09.2015
comment
У меня он работает и на ModelSim, но его нельзя синтезировать в ISE Project Navigator.   -  person Eugene Wu    schedule 16.09.2015
comment
Попробуйте Project › Очистите файлы проекта. Кроме того, попробуйте удалить строки library work;, возможно, они сбивают с толку.   -  person scary_jeff    schedule 16.09.2015
comment
Я пробовал оба, но получил те же результаты.   -  person Eugene Wu    schedule 16.09.2015
comment
Возможно, ему не нравится, что ваш пакет находится в том же файле, что и test1; попробуйте поместить пакет в его собственный файл (в любом случае я думаю, что это будет более привычно). Если это не сработает, то мне не очень жаль!   -  person scary_jeff    schedule 16.09.2015
comment
Спасибо! Помещение его в собственный файл сработало.   -  person Eugene Wu    schedule 16.09.2015
comment
Должен ли я поставить это как ответ?   -  person scary_jeff    schedule 16.09.2015
comment
Да, это было бы отлично.   -  person Eugene Wu    schedule 16.09.2015


Ответы (2)


Проблема не в том, что первый файл содержит и pkg пакет, и test1 сущность. Это нормально, а не круговая зависимость. Хотя многие, в том числе и я, могут счесть это плохой практикой. Настоящая проблема заключается в том, что test1 создает экземпляр объекта test2 из отдельного файла, который также использует pkg. Таким образом, круговая зависимость, в которой test2 зависит от pkg, но файл, содержащий pkg и test1, зависит от test2, потому что он был создан там.

Modelsim поддерживает компиляцию только определенных единиц проекта в файле, поэтому он может справиться с ситуацией.

person kraigher    schedule 16.09.2015

Ваш пакет pkg, по-видимому, определен в том же файле, что и объект test1, который сам use является этим пакетом. Хотя я не считаю это абсолютно неправильным, похоже, что ISE заметил, что ему нужно скомпилировать ваш первый файл (для компиляции пакета), прежде чем он сможет скомпилировать тот же файл для компиляции сущности test1, и выдало ошибку. На самом деле, если бы он просто пошел дальше и скомпилировал файл, все было бы в порядке.

Перемещая пакет в его собственный файл, эта очевидная самозависимость удаляется.

person scary_jeff    schedule 16.09.2015
comment
Перемещение пакета в отдельный файл решает проблему, но ваш анализ проблемы неверен. Циклическая зависимость существует между файлом, содержащим test1 и pkg, и файлом, содержащим test2. Это связано с тем, что для первого файла требуется test2, поскольку он создается там, а для второго файла требуется pkg. - person kraigher; 16.09.2015
comment
Ах да, да, я полагаю, что это имеет больше смысла. Спасибо! - person scary_jeff; 22.09.2015