когда изменение переменной в списке конфиденциальности запускает процесс в vhdl?

Мне трудно понять эффекты этого кода: Мой компонент:

library IEEE;
use IEEE.std_logic_1164.all;

entity problem is
  port(
    clk : in std_logic;
    a : in std_logic);
end problem;

architecture impl of problem is
  signal a_sig : std_logic;

begin
  clk_proc : process(clk)
  begin
    if rising_edge(clk) then
      a_sig <= '0';
    end if;
  end process;

  a_proc : process(a)
  begin
    report "a received : " & std_logic'image(a);
    a_sig <= a;
  end process;

  a_sig_proc : process(a_sig)
  begin
    report "a_sig set : " & std_logic'image(a_sig);
  end process;
end impl;

а это мой testbench.vhd:

library IEEE;
use IEEE.std_logic_1164.all;

entity testbench is
end testbench;

architecture tb of testbench is
  component problem is
    port ( clk : in std_logic;
           a : in std_logic);
  end component;

  constant clk_period : time := 1 ms;
  signal clk_sig : std_logic;
  signal a_sig : std_logic;
begin
  dut : problem port map (clk_sig, a_sig);

  process
  begin
    clk_sig <= '1';
    wait for clk_period/2;
    clk_sig <= '0';
    wait for clk_period/2;
  end process;

  process
  begin
    wait for clk_period * 0.75;
    a_sig <= '1';
  end process;

end tb;

и результат запуска кода выглядит следующим образом:

$ ghdl -r testbench --vcd=testbench.vcd --stop-time=2ms
problem.vhd:23:5:@0ms:(report note): a received : 'U'
problem.vhd:29:5:@0ms:(report note): a_sig set : 'U'
problem.vhd:23:5:@750us:(report note): a received : '1'
problem.vhd:29:5:@1ms:(report note): a_sig set : 'X'
./testbench:info: simulation stopped by --stop-time

Я могу понять сигналы «U», полученные в 0 мс, и я могу понять сигнал «1», полученный в Problem.a_proc в 750 микросекунд. Первое, что меня смущает, это то, почему проблема .a_sig_proc не запускается установкой a_sig в ​​том же процессе? И затем, когда запускается проблема.a_sig_proc, a_sig имеет значение «X». Если бы кто-то мог указать мне на ресурс, чтобы объяснить это, было бы здорово :)

Заранее спасибо!


person ehrt1974    schedule 17.01.2017    source источник


Ответы (1)


Вы управляете сигналом a_sig от нескольких процессов (clk_proc и a_proc). Вам нужно будет убрать назначение на a_sig в ​​одном из процессов (поскольку симулятор не может определить, какое назначение имеет приоритет) или вбить 'Z' (высокий импеданс) на a_sig от процессов, пока не "их очередь". Есть хорошие объяснения здесь и здесь

person gsm    schedule 17.01.2017