我已经在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
根据我的理解,这没有任何区别。那么为什么会有如此不同的输出呢?
答案 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------|