verilator/test_regress/t/t_timing_fork_many.v

44 lines
935 B
Systemverilog

// DESCRIPTION: Verilator: Verilog Test module
//
// This file ONLY is placed under the Creative Commons Public Domain, for
// any use, without warranty, 2022 by Antmicro Ltd.
// SPDX-License-Identifier: CC0-1.0
module t;
int counter = 0;
// As Verilator doesn't support recursive calls, let's use macros to generate tasks
`define FORK2_END(i) \
task fork2_``i; \
#1 counter++; \
endtask
`define FORK2(i, j) \
task fork2_``i; \
fork \
#1 fork2_``j; \
#1 fork2_``j; \
join \
endtask
`FORK2_END(0);
`FORK2(1, 0);
`FORK2(2, 1);
`FORK2(3, 2);
`FORK2(4, 3);
`FORK2(5, 4);
`FORK2(6, 5);
`FORK2(7, 6);
`FORK2(8, 7);
initial begin
fork2_8;
`ifdef TEST_VERBOSE
$write("[%0t] process counter == %0d\n", $time, counter);
`endif
if (counter != 1 << 8) $stop;
$write("*-* All Finished *-*\n");
$finish;
end
endmodule