Я выполняю несколько разветвлений одновременно, я хочу пропустить один оператор в блоке разветвления, если он был выполнен в любом из других разветвлений - PullRequest
0 голосов
/ 13 мая 2019

допустим, у меня есть такой код:

for (int i=o;i<5;i++) begin
automatic int j=i;
fork
thread(i);
join_none
end 

предположим, что тема выглядит так: thread() begin statement 1; statement 2; statement 3; end

Моя проблема в том, что если оператор 2 был выполнен в первом блоке ветвления соединения, то он должен быть пропущен в оставшихся 4 блоках ветвления соединения. Не могли бы вы рассказать мне решение о том, как реализовать утверждение 2. Спасибо.

1 Ответ

1 голос
/ 13 мая 2019

Вы должны передать j в свою ветку вместо i.

for (int I=0;i<5;i++) begin
   automatic int j=i;
   fork
     thread(j);
   join_none
  end 
task thread (int n);
    statement 1;
    if (n==0) statement 2;
    statement 3;
endtask

Это именно то, что вы задали в теле вашего вопроса, но не соответствует названию.В этом случае вам понадобится семафор

   semaphore flag;
   flag.new(1);
   for (int i=0;i<5;i++) begin
       automatic int j=i;
       fork
         thread(j);
       join_none
      end
      ...
      task thread (int n);
       static bit flag;
            statement 1;
            if (flag.try_get()) statement 2;
            statement 3;
        endtask
...