Используя Modelsim 10.7b (VHDL-2008), меня смущает поведение VHDL внешних имен при передаче в procedure
. В частности, я вижу множество различных вариантов поведения в зависимости от того, ссылается ли внешнее имя на port
или signal
, и использую ли я режим in
или inout
.
Единственная имеющаяся у меня книга, охватывающая внешние имена ( Ashenden, 3rd Ed. ), дает только один тривиальный пример port
, но подразумевает, что он в точности такой же, как a signal: « Это отражает правило VHDL, согласно которому порт считается сигналом, объявленным внутри объекта ». Кажется, он не охватывает то, что происходит в procedure
.
Поэтому мой вопрос заключается в том, может ли кто-нибудь дать объяснение наблюдаемого поведения в каждом из следующих трех простых тестовых случаев.
an_entity.vhd :
library ieee;
use ieee.std_logic_1164.all;
entity an_entity is
port (
i : in std_logic
);
end;
architecture rtl of an_entity is
signal s : std_logic;
begin
s <= i;
end;
tb.vhd :
library ieee;
use ieee.std_logic_1164.all;
entity tb is
end entity tb;
architecture rtl of tb is
procedure procedure_with_mode_in(signal x : in std_logic) is
begin
x <= force '1';
end procedure;
procedure procedure_with_mode_inout(signal x : inout std_logic) is
begin
x <= force '1';
end procedure;
signal i : std_logic := '0';
begin
uut : entity work.an_entity
port map(
i => i
);
process
begin
-- ### COPY-PASTE TEST CASE HERE ###
wait;
end process;
end architecture rtl;
SANITY CHECK: нет вызова процедуры
wait for 10 ns;
<<signal uut.i : std_logic>> <= force '1';
wait for 10 ns;
<<signal uut.i : std_logic>> <= release;
Результат : Принудительные действия и освобождение успешно:
ТЕСТОВЫЙ СЛУЧАЙ 1: Процедура вызвана port
, режим in
wait for 10 ns;
procedure_with_mode_in(<<signal uut.i : std_logic>>);
wait for 10 ns;
<<signal uut.i : std_logic>> <= release;
Результат : Принуждает, но не отпускает:
(Примечание: результат будет таким же, если процедура вызывается на signal
внешнее имя).
ТЕСТОВЫЙ СЛУЧАЙ 2: Процедура вызывается port
, режим inout
wait for 10 ns;
procedure_with_mode_inout(<<signal uut.i : std_logic>>);
wait for 10 ns;
<<signal uut.i : std_logic>> <= release;
Результат : Ошибка:
# ** Error: (vsim-8509) The object class "SIGNAL(read/driven)" of "uut.i" is different from the class "VHDL INPUT PORT" of the denoted object.
# Time: 0 ns Iteration: 0 Instance: /tb File: C:/path/tb.vhd Line: 32
ТЕСТОВЫЙ СЛУЧАЙ 3: Процедура вызвана на signal
, режим inout
wait for 10 ns;
procedure_with_mode_inout(<<signal uut.s : std_logic>>);
wait for 10 ns;
<<signal uut.s : std_logic>> <= release;
Результат : Сигнал не определен, но принудительно и отпускает: