always @* block in sequential circuit
The always @* statement executes asynchrounously. It is equivalent to writing the code below:

always begin
     // wait for one of these signals to change
     @(syn_clr or load or up or en or r_reg)
     if (syn_clr)
      r_next = 0;
    else if (load)
      r_next = d;
    else if (en &amp;&amp; up)
      r_next = r_reg + 1;
    else if (en &amp;&amp; ~up)
      r_next = r_reg - 1;
    else
      r_next = r_reg;
end


If you look at the value of r_next, you will see that it gets evaluated after any change in the listed signals. It may be that all those signals are changing on a clock edge as well, so you don't see the difference.