The behaviour is in the details of the wait statement (the details of wait that
Jim Lewis refers to). The reason is that the wait
statements has three
parts:
wait
[on sensitivity_list]
[until condition]
[for time_expression]; -- Only for timeout, and not relevant here
The wait
in the relevant code only has an until
part, so the
sensitivity_list is created according to VHDL standard: "If no sensitivity
clause appears, the sensitivity set is constructed according to the following
(recursive) rule: ...". The generated sensitivity_list will in this case
contain r_CLK_TB
.
The VHDL standard has an example that matches the code precisely, and this states that:
wait until r_CLK_TB = '1';
is identical to:
loop
wait on r_CLK_TB;
exit when r_CLK_TB = '1';
end loop;
So even though the wait
does not explicitly contain a wait until
r_CLK_TB'event
(as written in comment), the execution results in waiting until
an event on r_CLK_TB
in order to pass the first wait
in wait on r_CLK_TB
.
Is that intuitive... judge for yourself ;-)
So maybe the original code should be changes so:
wait until r_CLK_TB = '1';
is replaced with:
if r_CLK_TB /= '1' then
wait until r_CLK_TB = '1';
end if;
In this case both "GOT HERE" and "GOT HERE 2" are shown at 20 ns, since the condition of all three constructions will be TRUE here.