Блочный параллельный оператор fork-join

Параллельный блок может выполнять инструкции одновременно, и управление задержкой может использоваться для обеспечения временного упорядочения выражений. Порядок инструкций внутри блока fork-join не имеет значения, т.к. все действия выполняются параллельно. Упорядочивание инструкций внутри оператора может обеспечиваться указанием временных задержек. Блок fork-join завершается, когда все инструкции были завершены.

Существуют варианты fork-join, которые позволяют основному потоку продолжать выполнение остальных инструкций в зависимости от того, когда дочерние потоки заканчиваются.

Синтаксис

fork
  // Thread 1
  // ...
join

Пример 1

module fork_join_tb1;
  reg [31:0] data;

  initial begin
    $display("Time [%0t]: data=0x%0h\t1", $time, data);
    #10   data = 8'hfe;
    $display("Time [%0t]: data=0x%0h\t2", $time, data);

    fork
      $display("Time [%0t]: data=0x%0h\t3", $time, data);
      #20 data = 8'h11;
      #19 $display("Time [%0t]: data=0x%0h\t4", $time, data);
      #20 $display("Time [%0t]: data=0x%0h\t5", $time, data);

      #10 data = 8'h00;
      #10 $display("Time [%0t]: data=0x%0h\t6", $time, data);
    join
  end
endmodule

Результат исполнения

Time [0]: data=0xxxxxxxxx 1
Time [10]: data=0xfe 2
Time [10]: data=0xfe 3
Time [20]: data=0xfe 6
Time [29]: data=0x0 4
Time [30]: data=0x0 5

Пример 2

module fork_join_tb2;
  initial begin
    $display("Time [%0t]: Main Thread: Fork join going to start", $time);
    fork
      // Поток (Thread) 1
      #30 $display("Time [%0t]: Thread1 finished", $time);

      // Поток (Thread) 2
      begin
        #5 $display("Time [%0t]: Thread2 ...", $time);
        #10 $display("Time [%0t]: Thread2 finished", $time);
      end

      // Поток (Thread) 3
      #20 $display("Time [%0t]: Thread3 finished", $time);
    join

    $display("Time [%0t]: Main Thread: Fork join has finished", $time);
  end
endmodule

Результат исполнения

Time [0]: Main Thread: Fork join going to start
Time [5]: Thread2 ...
Time [15]: Thread2 finished
Time [20]: Thread3 finished
Time [30]: Thread1 finished
Time [30]: Main Thread: Fork join has finished

Last updated