在systemverilog中,fork块内的forever循环与forever循环内的fork块有什么区别?

时间:2019-07-09 06:26:35

标签: system-verilog

我已经在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

根据我的理解,这没有任何区别。那么为什么会有如此不同的输出呢?

1 个答案:

答案 0 :(得分:1)

它们是完全不同的,因为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------|