gpt4 book ai didi

multithreading - System Verilog fork join - 实际上不是并行的?

转载 作者:行者123 更新时间:2023-12-03 12:44:53 26 4
gpt4 key购买 nike

我正在学习系统 verilog,并认为在 fork/join 中为每个进程创建了单独的线程.但是,我发现我是否有 while在我的第一个进程中循环,我的第二个进程没有启动,这让我想到fork/join实际上并不平行。

class A;

task run();
$display("A started");
while(1);
endtask

endclass

class B;

task run();
$display("B started");
endtask

endclass

class C;

task run();
fork
A.run();
B.run();
join
endtask

endclass

我的输出是
 Class A started 

并且程序永远运行。我认为它应该打印
 Class A started
Class B started

并永远运行。
有人可以指出我在这里缺少什么吗?

最佳答案

SystemVerilog fork/join语句创建仅在模拟意义上并行的进程。但是,进程在多核意义上不是并行的——进程不会在处理器的多个线程上执行。这些进程将在相同的模拟时间戳上安排在执行队列上。但是,这些将在单个逻辑 CPU 上执行,因此,从 CPU 的角度来看,它们将按顺序执行。

在您的代码示例中,A 类和 B 类 run任务被安排在同一模拟时间执行。当 SystemVerilog 模拟器遇到 fork/join语句,它将它们放在执行队列中。当您运行模拟时,您的模拟器启动 A.run第一的。从 A.run进程进入不屈服的无限循环,模拟器没有机会执行B.run .请注意,如果您在同一仿真时间安排了多个任务,SystemVerilog LRM 不会规定首先执行哪个任务。其他一些模拟器可能已经执行了 B.run开始前 A.run .

关于multithreading - System Verilog fork join - 实际上不是并行的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24922227/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com