Szukaj…
Składnia
- poczekaj [na SIGNAL1 [, SIGNAL2 [...]]] [do WARUNKU] [dla TIMEOUT];
- czekać; - Wieczne czekanie
- poczekaj na s1, s2; - Poczekaj, aż zmienią się sygnały s1 lub s2 (lub oba)
- poczekaj, aż s1 = 15; - Poczekaj, aż sygnał s1 zmieni się, a jego nowa wartość to 15
- poczekaj, aż s1 = 15 przez 10 ns; - Poczekaj, aż sygnał s1 zmieni się, a jego nowa wartość to 15 przez co najwyżej 10 ns
Wieczne czekanie
Najprostszą formą wait
jest po prostu:
wait;
Ilekroć proces to wykonuje, zostaje zawieszony na zawsze. Harmonogram symulacji nigdy go nie wznowi. Przykład:
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;
Listy wrażliwości i instrukcje oczekiwania
Proces z listą wrażliwości nie może również zawierać instrukcji oczekiwania. Jest to równoważne z tym samym procesem, bez listy wrażliwości i z jeszcze jednym ostatnim stwierdzeniem, które jest:
wait on <sensitivity_list>;
Przykład:
process(clock, reset)
begin
if reset = '1' then
q <= '0';
elsif rising_edge(clock) then
q <= d;
end if;
end process;
jest równa:
process
begin
if reset = '1' then
q <= '0';
elsif rising_edge(clock) then
q <= d;
end if;
wait on clock, reset;
end process;
VHDL2008 wprowadził all
słowa kluczowe na listach wrażliwości. Jest to równoważne ze wszystkimi sygnałami odczytywanymi gdzieś w trakcie procesu . Szczególnie przydatne jest unikanie niepełnych list wrażliwości przy projektowaniu procesów kombinatorycznych do syntezy. Przykład niepełnej listy wrażliwości:
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;
sygnał ci
nie jest częścią listy czułości i jest to bardzo prawdopodobne błąd kodowania, który doprowadzi do niedopasowań symulacji przed i po syntezie. Prawidłowy kod to:
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;
W VHDL2008 all
słowa kluczowe upraszczają to i zmniejszają ryzyko:
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;
Poczekaj na warunek
Można pominąć klauzule on <sensitivity_list>
i for <timeout>
, jak w:
wait until CONDITION;
co jest równoważne z:
wait on LIST until CONDITION;
gdzie LIST
to lista wszystkich sygnałów pojawiających się w CONDITION
. Jest to również równoważne z:
loop
wait on LIST;
exit when CONDITION;
end loop;
Ważną konsekwencją jest to, że jeśli CONDITION
nie zawiera sygnałów, wówczas:
wait until CONDITION;
jest równa:
wait;
Klasycznym tego przykładem jest słynny:
wait until now = 1 sec;
to nie robi tego, co można by pomyśleć: ponieważ now
jest funkcją, a nie sygnałem, wykonanie tej instrukcji zawiesza proces na zawsze.
Poczekaj na określony czas
przy użyciu tylko klauzuli for <timeout>
można uzyskać bezwarunkowe oczekiwanie, które trwa przez określony czas. Nie można tego syntetyzować (żaden prawdziwy sprzęt nie może tak łatwo wykonać tego zachowania), ale często jest wykorzystywany do planowania zdarzeń i generowania zegarów w środowisku testowym.
Ten przykład generuje zegar 100 MHz, 50% cyklu pracy w symulacyjnym stanowisku testowym do napędzania testowanego urządzenia:
constant period : time := 10 ns;
...
process
begin
loop
clk <= '0';
wait for period/2;
clk <= '1';
wait for period/2;
end loop;
end process;
Ten przykład pokazuje, jak można użyć literału czasu oczekiwania na sekwencjonowanie procesu bodźca / analizy testu:
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;