При тестировании простой реализации счетчика симуляция GHDL не выходит из моделирования. Мое намерение состоит в том, чтобы остановить одновременные процессы с использованием общей переменной, измененной основным процессом. Но основной процесс не останавливает процесс синхронизации.Остановка моделирования VHDL с заявлениями ожидания
Моя реализация счетчика:
entity dff is
port(
direction, reset, clk, load : in std_logic;
din : in std_logic_vector(3 downto 0);
dout : out std_logic_vector(3 downto 0));
end dff;
architecture behav of dff is
signal temp : std_logic_vector(3 downto 0);
begin
process(clk, reset)
begin
if (reset='1') then
temp <= "0000";
elsif rising_edge(clk) then
if (load='1') then
temp <= din;
else
if (direction='0') then
temp <= std_logic_vector(unsigned(temp) + 1);
else
temp <= std_logic_vector(unsigned(temp) - 1);
end if;
end if;
end if;
dout <= temp;
end process;
end behav;
И мой испытательный стенд:
architecture behav of test_tb is
component dff port(
direction, reset, clk, load : in std_logic;
din : in std_logic_vector(3 downto 0);
dout : out std_logic_vector(3 downto 0));
end component;
signal direction, reset, clk, load : std_logic := '1';
signal din, dout : std_logic_vector(3 downto 0) := x"7";
shared variable simend : boolean := false;
begin
clkk : process
begin
if simend=false then
clk <= not clk after 50 ns;
else
wait;
end if;
end process clkk;
uut : dff port map(
direction, reset, clk, load, din, dout);
stim : process
begin
reset <= '0';
wait for 1 us;
load <= '0';
wait for 2 us;
direction <= '0';
wait for 2 us;
load <= '1';
wait for 1 us;
reset <= '1';
wait for 0.5 us;
simend := true;
wait;
end process stim;
end behav;
В последних выпусках ghdl вы можете использовать комбинацию [--assert-level =] (http://ghdl.readthedocs.io/en/latest/Simulation_and_runtime.html?highlight=severity) и --ieee- asserts = блокирует предупреждения из стандартных пакетов, чтобы разрешить говорить в SEVERITY_LEVEL HALT в утверждении. Вы также можете отделить задержку от назначения 'wait 50 ns; clk <= not clk; если simend = true, тогда подождите; end if; 'Операторы процесса естественно замкнуты. –
user1155120
Я бы рекомендовал избежать накладных расходов на убийцу часов и вместо этого использовать std.env.stop, как было предложено @scary_jeff. –