verilator/test_regress/t/t_timing_wait2.v
Krzysztof Bieganski 519792d02b
Fix to commit coroutines immediately on wait statements (#4229)
Event-triggered coroutines live in two stages: 'uncommitted' and 'ready'. First
they land in 'uncommitted', meaning they can't be resumed yet. Only after
coroutines from the 'ready' queue are resumed, the 'uncommitted' ones are moved
to the 'ready' queue, and can be resumed. This is to avoid self-triggering in
situations like waiting for an event immediately after triggering it.

However, there is an issue with `wait` statements. If you have a `wait(b)`, it's
being translated into a loop that awaits a change in `b` as long as `b` is
false. If `b` is false at first, the coroutine is put into the `uncommitted`
queue. If `b` is set to true before it's committed, the coroutine won't get
resumed.

This patch fixes that by immediately committing event controls created from
`wait` statements. That means the coroutine from the example above will get
resumed from now on.
2023-05-25 20:20:44 -04:00

36 lines
639 B
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
module t;
bit s[3:0] = {0, 0, 0, 0};
initial begin
wait (s[1]);
s[0] = 1;
$display("0");
end
initial begin
wait (s[2]);
s[1] = 1;
$display("1");
#1 $write("*-* All Finished *-*\n");
$finish;
end
initial begin
wait (s[3]);
s[2] = 1;
$display("2");
end
initial begin
s[3] = 1;
end
initial #2 $stop; // timeout
endmodule