Questions (1) and (2) are really the same issue. You have a race condition between the first two initial
blocks. These blocks are running concurrently.
initial begin // forever unrolled
#10 clk = !clk;
#10 clk = !clk;
#10 clk = !clk;
...
end
and
initial begin:I1
#10 @(posedge clk);
$display("I1 done at time:%0t",$time);
end
If the first initial
block resumes after the #10 before the second initial
block resumes, you miss the first posedge of clk
. If the order is reversed, the @(posedge clk)` catches for first posedge.
For question (3), The properties p1 and p2 look at sampled value of clk
which are always 0 if you are also using clk
as the cycle event.