I still do not fully get this matching with what I see. E.g. if my test’s run_phase contains only:
$display("start of test");
for(int i=0;i<10000;i++) begin
#0;
end
$display("after 10000 x #0 (%0t)",$realtime);
#1ns
$display("after #1ns (%0t)",$realtime);
returns:
start of test
after 10000 x #0 (0.0 ns)
Hence the phase doesn’t end after the first #0, but only when time needs to be advanced.
EDIT: raising and dropping an objection prior to the above code has the same effect.