ここで簡略化されたサンプル コードを参照してください。
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()
が決して返されないことです (それらは永遠にループを実行します)。そして、その呼び出しが begin/end ブロックの外側に配置されることの意味を完全には理解していません。永久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