Sök…
Syntax
- vänta [på SIGNAL1 [, SIGNAL2 [...]]] [tills CONDITION] [för TIMEOUT];
- vänta; - Evig vänta
- vänta på s1, s2; - Vänta tills signalerna s1 eller s2 (eller båda) ändras
- vänta tills s1 = 15; - Vänta tills signalen s1 ändras och dess nya värde är 15
- vänta tills s1 = 15 i 10 ns; - Vänta tills signalen s1 ändras och dess nya värde är 15 för högst 10 ns
Evig vänta
Den enklaste formen av wait
uttalande är helt enkelt:
wait;
Varje gång en process körs avbryts den för alltid. Simuleringsschemaläggaren kommer aldrig att återuppta den igen. Exempel:
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;
Känslighetslistor och väntande uttalanden
En process med en känslighetslista kan inte också innehålla väntande uttalanden. Det motsvarar samma process, utan en känslighetslista och med ett sista påstående som är:
wait on <sensitivity_list>;
Exempel:
process(clock, reset)
begin
if reset = '1' then
q <= '0';
elsif rising_edge(clock) then
q <= d;
end if;
end process;
är ekvivalent med:
process
begin
if reset = '1' then
q <= '0';
elsif rising_edge(clock) then
q <= d;
end if;
wait on clock, reset;
end process;
VHDL2008 introducerade all
sökord i känslighetslistor. Det motsvarar alla signaler som läses någonstans i processen . Det är särskilt praktiskt att undvika ofullständiga känslighetslistor när man utformar kombinatoriska processer för syntes. Exempel på ofullständig känslighetslista:
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
signalen är inte en del av känslighetslistan och detta är mycket troligt ett kodningsfel som kommer att leda till simuleringsmatchningar före och efter syntes. Rätt kod är:
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;
I VHDL2008 förenklar all
sökord detta och minskar risken:
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;
Vänta tills tillstånd
Det är möjligt att utelämna klausulerna on <sensitivity_list>
och for <timeout>
, som i:
wait until CONDITION;
vilket motsvarar:
wait on LIST until CONDITION;
där LIST
är listan över alla signaler som visas i CONDITION
. Det motsvarar också:
loop
wait on LIST;
exit when CONDITION;
end loop;
En viktig konsekvens är att om CONDITION
innehåller några signaler, så:
wait until CONDITION;
är ekvivalent med:
wait;
Ett klassiskt exempel på detta är det berömda:
wait until now = 1 sec;
det gör inte vad man skulle kunna tänka: som now
är en funktion, inte en signal, att genomföra detta uttalande stoppar processen för evigt.
Vänta på en viss tid
med endast for <timeout>
-klausulen är det möjligt att få en ovillkorlig vänta som varar under en viss tid. Detta är inte syntetiserbart (ingen riktig maskinvara kan utföra detta beteende så enkelt), men används ofta för att schemalägga händelser och generera klockor i en testbänk.
Detta exempel genererar en 100 MHz, 50% arbetscykelklocka i simuleringstestbänken för att köra enheten under test:
constant period : time := 10 ns;
...
process
begin
loop
clk <= '0';
wait for period/2;
clk <= '1';
wait for period/2;
end loop;
end process;
Detta exempel visar hur man kan använda en bokstavlig varaktighet vänta med att sekvensera testbänkens stimulans / analysprocess:
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;