1.fork…join
fork…join能够启动产生多个并发进程,如图1所示,fork…join块可以指定一个或多个语句块,每一个语句块都应该作为并发进程执行。

fork...join的结构语法如下:
fork
code_block_1;
code_block_2;
...
code_block_n;
join/join_any/join_none
fork…join内的每个语句块称为子进程,执行这段fork…join代码的称为父进程。
2.三种并发方式
Verilog中的fork…join将执行fork语句的进程,并阻塞父进程的执行,直到fork…join中的所有进程(子进程)中止,通过加入 join_any和join_none关键字,SystemVerilog提供了三种选择来指定父进程何时恢复执行。
fork…join 结构中,父进程会被阻塞直到所有的子进程结束;join_any结构中,父进程会被阻塞直到其中任意一个子进程结束; join_none父进程会立即与产生的所有进程并发执行。如图2所示。

下面的例子采用了fork…join结构。目标地址为接口d的发包进程只有在其他三个目标地址为a/b/c的发包进程结束后才可以运行。假如采用fork…join_any结构,目标地址为d的发包进程将会在三个接口中的其中一个发包进程结束后立即运行。最后,若采用fork·join_none结构,所有四个发包进程将同时运行。
fork
send packet( interface_a);
send _packet( interface_b);
send_packet( interface_c);
join
send_packet( interface_d ) ;
在定义一个fork…join块的时候,将整个子进程封装在一个begin…end块中会将整个块作为单个进程执行,其中每条语句顺序地执行。
fork
begin
statement1;// 一个带有2条语句的子进程
statement2 ;
end
join