"fork disable" отключает другой форк, хотя он включен в fork-join
У меня есть проблема с "вилкой отключить", которая отключает другие процессы. я уже обернул его внутри fork join". есть другое решение для этого? это проблемный код внутри агента:
fork
begin
fork
begin
this.collect_tr();
ap.write(collected_trans);
collected_trans.i2c_trans_cg.sample();
end
begin
wait (this.flow_is_ok == 1'b0);
end
join_any;
disable fork;
end
join
"отключить" предотвращает появление еще одной развилки в моей эталонной модели. (Когда я удаляю вилку отключения агента, форк в RM происходит. Я играл с печатью, и это происходит на тех же часах)
2 ответа
Я решил проблему. "другая вилка" в эталонной модели, которая была отключена, была вызвана из реализации функции ара записи () в эталонной модели. так как ap.write () в агенте был отключен, запись () в эталонной модели отключена, а также. поэтому я просто переместил ap.write () за пределы вилки.
fork
begin
fork
begin
this.collect_tr();
//ap.write(collected_trans);
//collected_trans.i2c_trans_cg.sample();
end
begin
wait (this.flow_is_ok == 1'b0);
end
join_any;
disable fork;
end
join
if(this.flow_is_ok == 1'b1)begin
ap.write(collected_trans);
collected_trans.i2c_trans_cg.sample();
end
`
Если вы хотите отключить внутреннюю разветвленность, вы можете назвать блоки разветвления, а затем отключить именованный блок.
Пример:
fork: outer
begin
#10;
$display($stime, " outer");
end
begin
fork: inner
begin
#5;
$display($stime, " inner 1");
end
begin
#7;
$display($stime, " inner 2");
end
join_any
disable inner;
end
join
Выход:
# 5 inner 1
# 10 outer
Полный пример запуска здесь: http://www.edaplayground.com/x/26d