verilator/test_regress/t/t_semaphore.v
Krzysztof Bieganski 68e1b473e2
Support std::semaphore and typed std::mailbox (#3708)
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-11-28 16:53:55 +01:00

62 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, 2020 by Wilson Snyder.
// SPDX-License-Identifier: CC0-1.0
// Methods defined by IEEE:
// class semaphore;
// function new(int keyCount = 0);
// function void put(int keyCount = 1);
// task get(int keyCount = 1);
// function int try_get(int keyCount = 1);
// endclass
`ifndef SEMAPHORE_T
`define SEMAPHORE_T semaphore
`endif
// verilator lint_off DECLFILENAME
module t(/*AUTOARG*/);
// From UVM:
`SEMAPHORE_T s;
`SEMAPHORE_T s2;
initial begin
s = new(1);
if (s.try_get() == 0) $stop;
if (s.try_get() != 0) $stop;
s = new;
if (s.try_get() != 0) $stop;
s.put();
s.get();
s.put(2);
s.get(2);
s.put(2);
if (s.try_get(2) <= 0) $stop;
fork
begin
#10; // So later then get() starts below
s.put(1);
s.put(1);
end
begin
if (s.try_get(1) != 0) $stop;
s.get(); // Blocks until put
s.get();
end
join
s2 = new;
if (s2.try_get() != 0) $stop;
$write("*-* All Finished *-*\n");
$finish;
end
endmodule