Rag*_*hav 2 multithreading system-verilog
我正在学习系统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
Run Code Online (Sandbox Code Playgroud)
我的输出是
Class A started
Run Code Online (Sandbox Code Playgroud)
程序正在运行.我认为应该打印
Class A started
Class B started
Run Code Online (Sandbox Code Playgroud)
并永远运行.有人能指出我在这里失踪了吗?谢谢
小智 8
SystemVerilog Fork..Join语句创建仅在模拟意义上并行的进程.但是这些进程在多核意义上并不平行 - 进程不会在处理器的多个线程上执行.这些进程将在同一模拟时间戳上的执行队列上进行调度.但是这些将在单个逻辑CPU上执行,因此从CPU的角度来看,它们将按顺序执行.在您的代码示例中,A类和B类运行任务都安排在同一模拟时间执行.当SystemVerilog模拟器遇到Fork..Join语句时,它会将它们放在执行队列中.运行模拟时,模拟器首先启动A.run.并且由于A.run进程进入无限循环并且不能产生,模拟器没有机会执行B.run.请注意,如果在同一模拟时间内安排了多个任务,则SystemVerilog LRM不会指定首先执行哪个任务.其他一些模拟器可能在启动A.run之前执行了B.run.