Глобальный пакет для объединения нескольких пакетов vhdl

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

Но проблема в том, что на самом деле при синтезе типы и константы, объявленные в конфиг-пакетах, не видны.

Я попытался объявить «использовать my_package.all» в файле глобального пакета выше объявления глобального пакета, и я попытался также внутри глобального пакета.

Я имею в виду, что я пытался:

use work.config1.all;
package global_package is
   ...
end global_package;

и я пробовал:

package global_package is
   use work.config1.all;
   ...
end global_package;

что на самом деле принимает синтезатор.

У кого-нибудь есть решение? Мне очень не хочется комментировать и раскомментировать во всех своих файлах нужный мне конфиг.

Благодарю вас!

РЕДАКТИРОВАТЬ :

Например, если у меня есть:

файл 1:

package config1 is
    constant my_variable : integer := 1;
end config1;

файл 2:

package config2 is
    constant my_variable : integer := 2;
end config2;

файл 3:

use work.config1.all
-- use work.config2.all

package global is
    constant another_variable : integer := 5;
end global;

файл 4:

use work.global.all

entity my_entity is
    port(clk : in std_logic);
end my_entity ;

architecture Behavioral of my_entity is
     signal sig1, sig2 : integer;
begin
     sig1 <= another_variable;  -- I can see and use here the constant "another_variable".
     sig2 <= my_variable; -- Error ! I would like to have access here to the constant "my_variable" that the synthesizer can't see. 
end Behavioral;

Имея тогда эти 4 файла, я не могу получить доступ к "my_variable" только через "глобальный" пакет. Кроме того, я хотел бы, чтобы эта константа имела значение, указанное в пакете config1 или config2, в зависимости от того, что не прокомментировано.


person Oliver    schedule 28.11.2016    source источник
comment
Я не понимаю вашего вопроса. Не могли бы вы опубликовать MCVE?   -  person Matthew Taylor    schedule 28.11.2016
comment
Эй, Мэтью! Спасибо за ваш интерес. Я отредактировал сообщение, чтобы вы могли увидеть пример.   -  person Oliver    schedule 28.11.2016


Ответы (2)


Вы пробовали объявление контекстного предложения и ссылку на него? Вот один из них, который у меня есть для справки:

context OsvvmContext is
    library OSVVM ;  
    use OSVVM.AlertLogPkg.all ; 
    use OSVVM.RandomPkg.all ;
    use OSVVM.CoveragePkg.all ;
    use OSVVM.MemoryPkg.all ;
    . . . 
end context OsvvmContext ; 

Затем в своем дизайне вы ссылаетесь на него:

library osvvm ;
  context osvvm.OsvvmContext ; 

Таким образом, вы можете отредактировать свое контекстное предложение и изменить набор пакетов, которые вы включаете для всего проекта. Это VHDL-2008, поэтому для синтеза YMMV, но для моделирования он хорошо поддерживается.

person Jim Lewis    schedule 28.11.2016
comment
Это именно то, что я искал! Большое спасибо ! - person Oliver; 29.11.2016

Я не знаю простого способа сделать что-то в одном пакете видимым с помощью другого пакета. (Это возможно в system-verilog с использованием export, но это вам не поможет.)

Вместо этого существуют различные другие способы решения вашей проблемы. Я точно не знаю, в чем проблема, но вот одно предложение:

package global is
  constant another_variable : integer := 5;
  function set_my_variable (i : integer) return integer;
  constant my_variable : integer := set_my_variable(another_variable);
end global;

package body global is
  function set_my_variable (i : integer) return integer is
  begin
    if i = 5 then
      return 1;
    else
      return 2;
    end if;
  end function;
end package body global;

library IEEE;
use IEEE.std_logic_1164.all;
use work.global.all;

entity my_entity is
    port(clk : in std_logic);
end my_entity ;

architecture Behavioral of my_entity is
     signal sig1, sig2 : integer;
begin
     sig1 <= another_variable;  -- I can see and use here the constant "another_variable".
     sig2 <= my_variable; -- Error ! I would like to have access here to the constant "my_variable" that the synthesizer can't see. 
end Behavioral;

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

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

Интересно, что такая функция выполняется во время проработки. Это может затруднить отладку. Если вам нужно отладить его, вы, возможно, можете вызвать функцию для инициализации сигнала или переменной, чтобы функция выполнялась после времени 0, а не до него.

person Matthew Taylor    schedule 28.11.2016
comment
Спасибо, Мэтью, это ответ, который я также получил от коллеги. Кажется, что VHDL не предлагает такой возможности, чтобы увидеть пакет, вызываемый через другой пакет, не так ли? - person Oliver; 28.11.2016