The wait statement is a statement that causes suspension of a process or a procedure.
wait on signal_list;
wait until condition;
wait for time;
The wait statement suspends the execution of the process or procedure in which it is specified. Resuming the process or procedure depends on meting the condition(s) specified in the wait statement. There are three types of conditions supported with wait statements: sensitivity clause, condition clause, and timeout clause.
The most often used is the sensitivity clause. A sensitivity list defines a set of signals to which the process is sensitive and causes the process to resume (example 1).
If a wait statement does not contain a sensitivity list, then an implicit sensitivity list is assumed, one which contains all the signals that are present in that condition. If a process is resumed but no condition is met, then the process will not execute any other statements (example 2).
The second type of a condition supported with the wait statement is the condition clause. A process is resumed when the logical condition turns true due to a change of any signal listed in the condition (example 2).
The timeout clause defines the maximum time interval during which the process is not active. When the time elapses, the process is automatically resumed (example 3).
A single wait statement can have several different conditions. In such a case the process will be resumed when all the conditions are met (example 4).
If a wait on sensitivity_list is the only wait in the process and the last statement of the process, then it can be substituted by a sensitivity list of a process. See sensitivity list for details.
The syntax of the wait statement allows to use it without any conditions. Such a statement is equivalent to wait until true, which suspends a process forever and will never resume. While in simulation of normal models this is a disadvantage, this particular feature of a wait statement is widely used in testbenches. Example 5 shows an example of a testbench section.
signal S1, S2 : Std_Logic;
. . .
. . .
wait on S1, S2;
After executing all statements, the process will be suspended on the wait statement and will be resumed when one of the S1 or S2 signals changes its value.
wait until Enable = '1';
-- this is equivalent to
-- wait on Enable;
-- exit when Enable = '1';
-- end loop;
In this example, the wait statement will resume the process when the Enable signal changes its value to '1'. This is equivalent to the loop described in the comment below the first line. Please note that the process is resumed on any change of the Enable signal. However, it will awake the rest of the process only when the new value is '1'.
wait for 50 ns;
A process containing this statement will be suspended for 50 ns.
BIN_COMP : process
wait on A, B until CLK = '1';
. . .
The process BIN_COMP is resumed after a change on either A or B signal, but only when the value of the signal CLK is equal to '1'.
G0 <= '1' after 5 ns,
'0' after 10 ns,
'1' after 15 ns,
'0' after 20 ns;
G1 <= '1' after 5 ns,
'0' after 15 ns;
end process G;
In this process the values of signals G1 and G0 are set to '11', '10', '01', and '00' at the time intervals 5, 10, 15 and 20 ns, respectively. When the wait statement is encountered, the process is suspended forever.
The wait statement can be located anywhere between begin and end process.
A process with a sensitivity list may not contain any wait statements.