Внешние имена портов VHDL и режимы процедур - PullRequest
2 голосов
/ 27 мая 2020

Используя 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;

Результат : Принудительные действия и освобождение успешно:

Test 1 Result

ТЕСТОВЫЙ СЛУЧАЙ 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 внешнее имя).

enter image description here

ТЕСТОВЫЙ СЛУЧАЙ 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;

Результат : Сигнал не определен, но принудительно и отпускает:

enter image description here

...