systemverilog 中 fork 块内的 forever 循环和 fork 块内 forever 循环有什么区别?

What is the difference between forever loop inside fork block and fork block inside forever loop in systemverilog?

我在SystemVerilog中设计了FIFO内存模型的测试环境,我在其中遇到了这个问题。那么哪个选项更适合我?

当我在 fork 块中使用 forever 循环时,它会提供一些受控的输出,但是当我在 forever 内部使用 fork 时,它会在模拟器中进入无限循环。

一个:

forever begin
  fork
    p1; //thread-1
    p2; //thread-2
  join
end

两个:

fork
  forever begin
    p1;   //thread-1
    p2;   //thread-2
  end
join

据我了解,没有什么区别。那为什么会有如此不同的输出呢?

它们完全不同,因为在 fork-join 块之后的执行不会继续,直到其中的所有线程都完成。因此,您的第一个示例将在第一对线程完成后启动下一对线程(P1 和 P2),例如(假设 P2 花费的时间比 P1 长):

|----P1----    |----P1----    |----P1----    |----P1----    |
|------P2------|------P2------|------P2------|------P2------|

但是,在第二个示例中,fork-join 块(forever 循环)中只有一个线程,因此线程 P1 和 P2 顺序执行:

|----P1----|------P2------|----P1----|------P2------|----P1----|------P2------|