Where do the procedural block, fork - join, and specify-endspecify block lie in the Verilog timing region? Rough guess is Active or NBA region.
The region of execution for most statements depends solely on where the process that initiated it is located, not the statement itself. The
always, or continuous
assign statements are constructs that initiate processes. If those constructs are located in a
interface, then the process executes in the the active region. If those constructs are located in a
program (which I do not recommend ever using), the the process is executed in the re-active region.
Some procedural statements execute in one region, but schedule events in another. A nonblocking assignment evaluates the RHS as I just described above, but schedules the update of the LHS in the NBA or re-NBA region. The statements in the action block of a concurrent assertion always executes in the reactive region.
To answer your specific question about
fork/join, it should should now be clear that it only matters how the process got started where these procedural blocks are executed. A
specify block is not a procedural block.
The execution of Verilog statements depends on what statements are executed rather than where they are executed from. Blocking assignments, non blocking, assignments, $display, and $monitor/$strobe are treated differently.
does a nice job explaining the Verilog & SystemVerilog stratified event scheduler.
Here is figure 1 from that paper.
SystemVerilog is more complex than Verilog as explained in the paper. In SystemVerilog, statements executed from program blocks behave differently. The paper also explains the details of code executing from a SystemVerilog program block.