Поиск…
Синтаксис
- wait [on SIGNAL1 [, SIGNAL2 [...]]] [до СОСТОЯНИЯ] [для TIMEOUT];
- Подождите; - Вечное ожидание
- подождите на s1, s2; - Подождите, пока не будут изменены сигналы s1 или s2 (или оба)
- дождитесь, пока s1 = 15; - Подождите, пока сигнал s1 не изменится, и его новое значение равно 15
- дождитесь, пока s1 = 15 на 10 нс; - Подождите, пока сигнал s1 не изменится, и его новое значение равно 15 в течение не более 10 нс
Вечный дождик
Простейшая форма wait
выглядит просто:
wait;
Всякий раз, когда процесс выполняет это, он временно приостанавливается. Планировщик моделирования никогда больше не возобновит его. Пример:
signal end_of_simulation: boolean := false;
...
process
begin
clock <= '0';
wait for 500 ps;
clock <= '1';
wait for 500 ps;
if end_of_simulation then
wait;
end if;
end process;
Списки чувствительности и ожидания ожидания
Процесс с списком чувствительности также не может содержать команды ожидания. Это эквивалентно одному и тому же процессу, без списка чувствительности и еще с одним последним утверждением:
wait on <sensitivity_list>;
Пример:
process(clock, reset)
begin
if reset = '1' then
q <= '0';
elsif rising_edge(clock) then
q <= d;
end if;
end process;
эквивалентно:
process
begin
if reset = '1' then
q <= '0';
elsif rising_edge(clock) then
q <= d;
end if;
wait on clock, reset;
end process;
VHDL2008 представила ключевое слово all
в списках чувствительности. Это эквивалентно всем сигналам, которые читаются где-то в этом процессе . Особенно удобно избегать неполных списков чувствительности при разработке комбинаторных процессов синтеза. Пример неполного списка чувствительности:
process(a, b)
begin
if ci = '0' then
s <= a xor b;
co <= a and b;
else
s <= a xnor b;
co <= a or b;
end if;
end process;
ci
сигнал не является частью списка чувствительности, и это, скорее всего, ошибка кодирования, которая приведет к несоответствиям моделирования до и после синтеза. Правильный код:
process(a, b, ci)
begin
if ci = '0' then
s <= a xor b;
co <= a and b;
else
s <= a xnor b;
co <= a or b;
end if;
end process;
В VHDL2008 all
ключевые слова упрощают это и уменьшают риск:
process(all)
begin
if ci = '0' then
s <= a xor b;
co <= a and b;
else
s <= a xnor b;
co <= a or b;
end if;
end process;
Подождите, пока условие
Можно опустить в on <sensitivity_list>
и предложения for <timeout>
, например, в:
wait until CONDITION;
что эквивалентно:
wait on LIST until CONDITION;
где LIST
- это список всех сигналов, которые появляются в CONDITION
. Это также эквивалентно:
loop
wait on LIST;
exit when CONDITION;
end loop;
Важным следствием является то, что если CONDITION
содержит сигналов, то:
wait until CONDITION;
эквивалентно:
wait;
Классическим примером этого является знаменитый:
wait until now = 1 sec;
что не делает то, что можно было бы подумать: поскольку now
это функция, а не сигнал, выполнение этого утверждения приостанавливает процесс навсегда.
Подождите определенную продолжительность
используя только условие for <timeout>
, можно получить безусловное ожидание, которое длится в течение определенной продолжительности. Это не синтезируемо (никакое реальное оборудование не может так просто выполнять такое поведение), но часто используется для планирования событий и генерации часов в тестовом банке.
В этом примере генерируется тактовый импульс рабочего времени 100 МГц, 50% в испытательном стенде моделирования для управления тестируемым устройством:
constant period : time := 10 ns;
...
process
begin
loop
clk <= '0';
wait for period/2;
clk <= '1';
wait for period/2;
end loop;
end process;
Этот пример демонстрирует, как можно использовать длительность литерала для последовательности процесса стимуляции / анализа testbench:
process
begin
rst <= '1';
wait for 50 ns;
wait until rising_edge(clk); --deassert reset synchronously
rst <= '0';
uut_input <= test_constant;
wait for 100 us; --allow time for the uut to process the input
if uut_output /= expected_output_constant then
assert false report "failed test" severity error;
else
assert false report "passed first stage" severity note;
uut_process_stage_2 <= '1';
end if;
...
wait;
end process;