Блочный параллельный оператор 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