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