在此处查看简化的示例代码:
process job[num_objs];
// assume also, arr_obj1s (array of type obj1) and
// arr_obj2s (array of type obj2) are arrays of size
// num_objs, and the objects define a run() function
foreach (arr_obj1s[i]) begin
fork
automatic int j = i;
arr_obj1s[j].run(); // these run forever loops
begin
job[j] = process::self();
arr_obj2s[j].run(); // these run finite logic
end
join_none
end
foreach (job[i]) begin
wait (job[i] != null);
job[i].await();
end
// How do we ever reach here?
我的困惑是对的调用arr_obj1s[j].run()
永远不会返回(它们永远循环运行),而且我不太理解该调用在开始/结束块之外放置的含义。哪个进程是永远执行的,如果某个进程正在运行一个不会返回的进程run()
,那么每次调用怎么会返回?await()
run()
编辑:这里有更多信息。发布完整的代码将是页面和页面,但我希望这额外的一点帮助。
obj1 的run()
函数如下所示:
virtual task run;
fork
run_a(); // different logically separated tasks
run_b();
run_c();
join
endtask: run
作为一个例子,run_a
看起来基本上是这样的(它们都是相似的):
virtual task run_a;
// declare some local variables
forever begin
@(posedge clk)
// ...
end
endtask: run_a
但是obj2的run()
函数看起来基本上是这样的:
virtual task run;
fork
run_d(); // different logically separated tasks
run_e();
join
endtask: run
例如,run_d()
如下所示:
virtual task run_d;
while ((data_que.size() > 0)) begin
// process a pre-loaded queue,
// data will not be pushed on during the simulation
end
endtask:run_d