"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

Другие вопросы по тегам