In reply to robert.liu:
This is an area where some tools have diverged from the LRM. According to the LRM section 9.5 Process execution threads, a static initialization does not create a process, nor does a continuous assignment. That is why section 13.4.4 Background processes spawned by function calls does not allow fork/join_none from anything but a process created by an initial or always block.
But there must be some kind process for executing static initializations. Some tool have lumped all of those initializations into a single process. Others have created a process for each initialization. The following code executes 4 different ways for each of the 4 simulators on EDAPlayground.
function automatic bit check_process;
static process previous;
if ( process::self() != null) begin
$display("can get a process in static initializer!");
if (previous != process::self())
$display("different self");
end
previous = process::self();
return 0;
endfunction
bit x = check_process();
bit y = check_process();
bit z = check_process();
wire w = check_process();
initial #10 $display("The end");
final x = check_process();
final y = check_process();
endmodule