| |
verilog中的fork...join将执行fork语句的进程,并阻塞父进程的执行,直到fork...join中所有进程(子进程)中止。通过加入join...any和join...none关键字,systemverilog提供了三种选择来指定父进程何时恢复执行。
fork...join结构中,父进程会被阻塞直到所有的子进程结束;join...any结构中,父进程会
被阻塞直到其中任意一个子进程结束;join_none父进程会立即与产生的所有进程并发执行。
在下面的例子中,包含两个进程分支,第一个等待20ns,第二个等待命名事件eventA被触发。因为指定了join关键字,父进程应该阻塞直到这两个进程结束;也就是说,直到过了20ns并且eventA被触发。
fork begin $display("First Block\n"); #20ns; end begin $display("Second Block\n"); @eventA; end join
在一个fork...join语句的关联文中使用return语句是非法的,并且会导致一个编译错误。例如:
task wait_20; fork #20; return; // 非法的:不能返回;任务位于另外一个进程中 join_none endtask
只要fork...join块作用范围内声明的自动变量进入它们的作用范围,在产生任何进程之前,这些自动变量应该被初始化成它们的初始值。这些变量对于循环结构产生的进程存储唯一的、每次都交互的数据非常有用。例如:
initial for(int j = 1; j <= 3; ++j) fork automatic int k = j; // 对每一个j值的本地拷贝 #k $write("%0d", k); begin automatic int m = j; // m的值是不确定的 ... end join_none
上面的例子的输出为:123。