进程常见问题
- fork_join、fork_join_any 和 fork_join_none 之间的区别
fork_join | fork_join_any | fok_join_none |
---|---|---|
在 fork_join 中,主(父)线程在 fork_join 中的所有线程(子线程)执行完毕后才会执行 | 在 fork_join_any 中,如果任何一个子线程执行,则主(父)线程执行 | 在 fork_join_none 中,子线程和主(父)线程同时执行 |
- 我们可以在 fork_join 中使用 wait_fork 吗?
我们知道,在 fork_join 中,仅当 fork_join 中的所有线程执行完毕时,主线程才会执行,因此不需要使用 wait_fork。 我们可以在 fork_join_any 或 fork_join_none 语句后使用 wait fork,以等待 fork-join_any 或 fork_join_none 中的所有线程完成。 因此,在 fork_join 中不需要 wait_fork。
- 阻塞和非阻塞赋值的区别
阻塞 | 非阻塞 |
---|---|
在阻塞赋值中,一条语句执行完毕后,下一条语句将执行,即右侧表达式的第一个表达式被评估并立即分配给左侧变量 | 在非阻塞赋值中,对当前时间单位的所有右侧表达式进行评估,并在时间单位结束时分配给左侧变量 |
由 " = " 表示 | 由 " <= " 表示 |
它按顺序执行 | 它并行执行 |
阻塞用于组合逻辑 | 非阻塞用于时序逻辑 |
- wait event 和 @ event 之间的区别
如果我们在相同的延迟下触发 wait 和 @,那么 wait 语句会被执行,因为 wait 捕获速度比 @ 快。
- 我们可以使用不同延迟执行 wait 和 @ 吗?
module tb;
event e;
initial begin
#20 ->e;
$display($time,"thread1");
end
initial
begin
#25 @e;
$display($time,"thread2");
end
initial
begin
#15 wait(e.triggered);
$display($time,"thread3");
end
endmodule
在上面的例子中,我们可以看到事件、wait 和 @ 的延迟是不同的。我们还可以看到这里 @ 的延迟大于事件的延迟,而 wait 的延迟小于事件的延迟,所以这里只有 wait 语句与事件的延迟一起执行。因此,在下面的图中,我们可以看到线程 1 和线程 3 使用相同的延迟(#20)执行。