verilator/test_regress/t/t_timing_zerodly.v
2023-12-01 13:08:58 -05:00

43 lines
1.3 KiB
Systemverilog

// DESCRIPTION: Verilator: Verilog Test module
//
// This file ONLY is placed under the Creative Commons Public Domain, for
// any use, without warranty, 2023 by Antmicro Ltd.
// SPDX-License-Identifier: CC0-1.0
class Foo;
static task fork_w_zerodly(longint unsigned current_time);
bit my_bit;
bit zero_dly_first = 0;
// Th code below relies on Verilator's deterministic scheduler and is not
// compatible across different simulators.
//
// The `zero_dly` block is going to be executed first and then suspended at the #0 delay.
// Then the `finish_before` block is going to be executed. Once that happens, the
// execution of `zero_dly` block should be resumed, all within a single time-slot.
//
// IF THIS TEST FAILS AFTER CHANGES TO VERILATOR'S SCHEDULER, IT DOESN'T NECESSARILY
// MEAN THE CHANGES ARE WRONG.
fork
begin : zero_dly
zero_dly_first = 1;
#0;
if (current_time != $time) $stop;
if (my_bit == 0) $stop;
end : zero_dly
begin : finish_before
if (!zero_dly_first) $stop;
my_bit = 1;
end : finish_before
join_none
#1 $display("After fork."); // Check if there's no skipped coroutine
endtask
endclass
module test();
initial begin
Foo::fork_w_zerodly($time);
$write("*-* All Finished *-*\n");
$finish;
end
endmodule