В чем разница между вечным циклом внутри блока вилки и постоянным блоком внутри вечного цикла в systemverilog? - PullRequest
0 голосов
/ 09 июля 2019

Я разработал тестовую среду для модели памяти FIFO в SystemVerilog, в которой я сталкиваюсь с этой проблемой. Так какой вариант лучше для меня?

Когда я использовал forever loop внутри блока fork, он дает несколько контролируемый выход, но когда я использовал fork внутри forever, в симуляторе происходит бесконечный цикл.

ONE:

forever begin
  fork
    p1; //thread-1
    p2; //thread-2
  join
end

TWO:

fork
  forever begin
    p1;   //thread-1
    p2;   //thread-2
  end
join

Насколько я понимаю, это не имеет никакого значения. тогда почему такой разный вывод?

1 Ответ

1 голос
/ 09 июля 2019

Они совершенно разные, потому что выполнение после блока fork - join продолжается только после завершения всех потоков внутри него. Итак, ваш первый пример запустит следующую пару потоков (P1 и P2) после завершения первой пары, например (предположим, что P2 занимает больше времени, чем P1):

|----P1----    |----P1----    |----P1----    |----P1----    |
|------P2------|------P2------|------P2------|------P2------|

Но во втором примере внутри блока fork - join (цикл forever) есть только один поток, поэтому потоки P1 и P2 выполняются последовательно:

|----P1----|------P2------|----P1----|------P2------|----P1----|------P2------|
...