Zoeken…
Syntaxis
- wacht [op SIGNAL1 [, SIGNAL2 [...]]] [tot CONDITION] [voor TIMEOUT];
- wacht; - Eeuwig wachten
- wacht op s1, s2; - Wacht tot signalen s1 of s2 (of beide) veranderen
- wacht tot s1 = 15; - Wacht tot signaal s1 verandert en de nieuwe waarde 15 is
- wacht tot s1 = 15 gedurende 10 ns; - Wacht tot signaal s1 verandert en de nieuwe waarde maximaal 15 ns is
Eeuwig wachten
De eenvoudigste vorm van wait
is eenvoudig:
wait;
Wanneer een proces dit uitvoert, wordt het voor altijd opgeschort. De simulatieplanner zal deze nooit meer hervatten. Voorbeeld:
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;
Gevoeligheidslijsten en wachtafspraken
Een proces met een gevoeligheidslijst kan ook geen wachtinstructies bevatten. Het is gelijk aan hetzelfde proces, zonder een gevoeligheidslijst en met nog een laatste verklaring die is:
wait on <sensitivity_list>;
Voorbeeld:
process(clock, reset)
begin
if reset = '1' then
q <= '0';
elsif rising_edge(clock) then
q <= d;
end if;
end process;
is gelijk aan:
process
begin
if reset = '1' then
q <= '0';
elsif rising_edge(clock) then
q <= d;
end if;
wait on clock, reset;
end process;
VHDL2008 introduceerde het all
keyword in gevoeligheidslijsten. Het is gelijk aan alle signalen die ergens in het proces worden gelezen . Het is vooral handig om onvolledige gevoeligheidslijsten te vermijden bij het ontwerpen van combinatorische processen voor synthese. Voorbeeld van onvolledige gevoeligheidslijst:
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;
het ci
signaal maakt geen deel uit van de gevoeligheidslijst en dit is zeer waarschijnlijk een coderingsfout die zal leiden tot simulatiemismatches voor en na de synthese. De juiste code is:
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;
In VHDL2008 vereenvoudigt het all
keyword dit en vermindert het risico:
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;
Wacht tot conditie
Het is mogelijk om de clausules on <sensitivity_list>
en for <timeout>
, zoals in:
wait until CONDITION;
wat overeenkomt met:
wait on LIST until CONDITION;
waarbij LIST
de lijst is van alle signalen die in CONDITION
verschijnen. Het is ook gelijk aan:
loop
wait on LIST;
exit when CONDITION;
end loop;
Een belangrijk gevolg is dat als de CONDITION
geen signalen bevat, dan:
wait until CONDITION;
is gelijk aan:
wait;
Een klassiek voorbeeld hiervan is het beroemde:
wait until now = 1 sec;
dat doet niet wat men zou kunnen denken: zoals now
een functie is, geen signaal, schorst het uitvoeren van deze verklaring het proces voor altijd.
Wacht een specifieke duur
met alleen de clausule for <timeout>
is het mogelijk om een onvoorwaardelijke wachttijd te krijgen die een specifieke duur duurt. Dit is niet synthetisch (geen echte hardware kan dit gedrag zo eenvoudig uitvoeren), maar wordt vaak gebruikt voor het plannen van gebeurtenissen en het genereren van klokken binnen een testbank.
Dit voorbeeld genereert een 100 MHz, 50% duty cycle-klok in de simulatietestbank voor het besturen van de geteste eenheid:
constant period : time := 10 ns;
...
process
begin
loop
clk <= '0';
wait for period/2;
clk <= '1';
wait for period/2;
end loop;
end process;
Dit voorbeeld laat zien hoe men een letterlijke wachttijd zou kunnen gebruiken om het testbankstimulatie- / analyseproces te sequencen:
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;