VHDL 2008 не может управлять сигналом с псевдонимом внешнего имени

Пожалуйста, взгляните на следующий код, особенно на 3 строки комментариев в конце. Я смоделировал это с помощью Questasim 10.6c:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

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

architecture primary of alias_extname_driving_signal is

  signal buried_control_vector16 : std_logic_vector(15 downto 0) := (others => '0');

begin

 buried_control_vector16 <= std_logic_vector(unsigned(buried_control_vector16) + 1) when rising_edge(clk);

end architecture primary;




library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity alias_extname_driving_signal_tb is
end alias_extname_driving_signal_tb;

architecture primary of alias_extname_driving_signal_tb is

  signal clk : std_logic := '0';
  signal control_vector16 : std_logic_vector(15 downto 0) := (others => '0');
  alias control_vector16_alias is control_vector16;
  alias buried_control_vector16_alias is << signal .alias_extname_driving_signal_tb.uut.buried_control_vector16 : std_logic_vector(15 downto 0) >>;
  signal vector16 : std_logic_vector(15 downto 0);

begin

  clk <= not clk after 10 ns;

  control_vector16 <= std_logic_vector(unsigned(control_vector16) + 1) when rising_edge(clk);

  uut : entity work.alias_extname_driving_signal
  port map(
    clk => clk
  );

  -- vector16 <= << signal .alias_extname_driving_signal_tb.uut.buried_control_vector16 : std_logic_vector(15 downto 0) >>; -- this statement works
  -- vector16 <= control_vector16_alias; -- this statement works
  -- vector16 <= buried_control_vector16_alias; -- vector16 remains perpetually undefined with this statement

end architecture primary;

Как видите, я могу управлять сигналом с внешним именем, псевдонимом локального сигнала, но не псевдонимом внешнего имени. Можно ли каким-либо образом использовать псевдоним внешнего имени для управления сигналом в vhdl-2008?

Заранее спасибо за вашу помощь.


person Michael Grover    schedule 19.01.2018    source источник
comment
Вы никогда не обновляете внешнее имя, вы всегда читаете его. Вам необходимо использовать принудительное назначение сигнала: buried_control_vector16_alias <= force X"1234";   -  person Paebbels    schedule 19.01.2018
comment
Кстати, я думаю, что ваш код не является допустимым кодом VHDL. Псевдоним должен быть объявлен после того, как было разработано указанное внешнее имя. Вы проанализировали и запустили свой пример, например. ГДЛ?   -  person Paebbels    schedule 19.01.2018
comment
Хм, ваш код, пусть GHDL выйдет из строя, могу ли я сообщить о вашем коде как об ошибке?   -  person Paebbels    schedule 19.01.2018
comment
Ваше заявление о силе направлено не в ту сторону. Я не пытаюсь контролировать сигнал hidden_control_vector16_alias. Я пытаюсь установить для vector16 значение hidden_control_vector16_alias. Однако я попробовал то, что вы предложили, в противоположном направлении, и vector16 все еще не обновлялся. Кроме того, что касается заявления о силе, я не думаю, что это необходимо. Я могу создать экземпляр другого компонента в тестовом стенде, подключить псевдоним внешнего имени к одному из его входных портов, и этот входной порт будет прекрасно обновляться в моделировании.   -  person Michael Grover    schedule 20.01.2018
comment
Что касается вашего заявления о разработке, я немного смущен. Я не могу объявлять заявление после того, как что-то разработано. Вы имеете в виду, что мне нужно объявить свой псевдоним где-то еще в коде? Не могли бы вы не сообщать об этом коде как об ошибке? Я скопировал и вставил этот код дословно в пустой файл, затем скомпилировал его с помощью Questasim 10.6c и отлично смоделировал. Спасибо!   -  person Michael Grover    schedule 20.01.2018
comment
Он хочет использовать ваш код для сообщения об ошибках GHDL, а не questasim.   -  person JHBonarius    schedule 20.01.2018
comment
Хорошо, если вы только читаете, вам не нужна сила - я неправильно понял ваш вопрос. Я сообщил об ошибке для GHDL. См. эту проблему для объявления псевдонима для внешнего имени.   -  person Paebbels    schedule 20.01.2018
comment
Спасибо за разъяснения по поводу отчета об ошибке и за сообщение о нем.   -  person Michael Grover    schedule 21.01.2018
comment
Я думал об этом, и либо это ошибка, либо вы назначаете псевдоним в декларативной области: это оценивается только один раз. т.е. если скрытый сигнал изменяется, локальный сигнал больше не обновляется.   -  person JHBonarius    schedule 21.01.2018
comment
Ваш код в том виде, в каком он есть, не должен компилироваться в том виде, в каком он написан в настоящее время. Ссылка псевдонима на внешнее имя до разработки ссылочного объекта является ошибкой.   -  person Jim Lewis    schedule 22.01.2018


Ответы (1)


Внешние имена могут быть объявлены только ПОСЛЕ разработки объекта, на который делается ссылка.

VHDL начинает разработку с тестового стенда. Сначала он разрабатывает область объявления. Затем он разрабатывает область кода по порядку. Если он находит компонент, он обрабатывает его и любые подкомпоненты. Когда он заканчивает разработку компонента (и любых подкомпонентов), он продолжает разработку в испытательном стенде с того места, где остановился.

Следовательно, вам нужно переместить объявление псевдонима либо в оператор блока, либо в процесс. Код оператора блока выглядит следующим образом. Обратите внимание, что метка с оператором блока обязательна.

architecture primary of alias_extname_driving_signal_tb is

  signal clk : std_logic := '0';
  signal control_vector16 : std_logic_vector(15 downto 0) := (others => '0');
  alias control_vector16_alias is control_vector16;
  signal vector16 : std_logic_vector(15 downto 0);

begin

  clk <= not clk after 10 ns;

  control_vector16 <= std_logic_vector(unsigned(control_vector16) + 1) when rising_edge(clk);

  uut : entity work.alias_extname_driving_signal
  port map(
    clk => clk
  );

  myblock : block 
    alias buried_control_vector16_alias is << signal .alias_extname_driving_signal_tb.uut.buried_control_vector16 : std_logic_vector(15 downto 0) >>;
  begin
     vector16 <= << signal .alias_extname_driving_signal_tb.uut.buried_control_vector16 : std_logic_vector(15 downto 0) >>; -- this statement works
     vector16 <= control_vector16_alias; -- this statement works
     vector16 <= buried_control_vector16_alias; -- vector16 remains perpetually undefined with this statement
  end block myblock ; 

end architecture primary;
person Jim Lewis    schedule 22.01.2018
comment
«созданный» неточен. Обратите внимание на примеры, найденные в IEEE Std 1076-2008 14.2 Разработка иерархии проектирования, стр. 202, где первый пример использования внешнего имени (alias DONE_SIG <<signal .TOP.DUT.DONE: BIT>>; -- legal помечен как допустимое использование внешнего имени и соответствует использованию OP. Также последний абзац перед примерами приведены два критерия, когда объект, обозначенный внешним именем, должен быть предварительно разработан. Использование OP не соответствует ни одному из этих двух критериев (значение не читается, и внешнее имя не является фактическим в ассоциации список). - person ; 22.01.2018
comment
WRT 14.2, утверждение, в котором говорится, что законно, должно быть сказано незаконно, и было исправлено в выпуске ISAC 05 в LRM, который пересматривается. См.: eda-twiki.org/cgi-bin/view. cgi/P1076/LCS2016_I05 - person Jim Lewis; 22.01.2018
comment
WRT принесла много извинений за то, что думала английскими синонимами. - person Jim Lewis; 22.01.2018
comment
Есть ли какой-либо возможный способ объявить псевдоним внешнего имени в декларативной области архитектуры или, по крайней мере, таким образом, чтобы я мог использовать этот псевдоним в любом месте в части оператора архитектуры? - person Michael Grover; 23.01.2018
comment
@MichaelGrover Для простого тестового стенда, в котором у вас есть экземпляр и код uut, вы можете обернуть все, кроме uut, в оператор блока или поместить псевдоним в процесс (но он будет виден только этому процессу). Для структурированного тестового стенда более высокого уровня, где стимул находится в компоненте секвенсора, экземпляр компонента секвенсора должен быть последним в архитектуре тестового стенда, а uut — первым. Таким образом, секвенсор тестов может иметь ссылку на внешнее имя либо в компоненте uut, либо в компонентах проверки. Для получения дополнительной информации см. наш блог и веб-сайт. synthworks.com - person Jim Lewis; 25.01.2018