iverilog/examples/mailbox_sem/mbx_sem_basic.sv

83 lines
1.5 KiB
Systemverilog

// Tier A #5 smoke: built-in mailbox #(int) + semaphore API.
module mbx_sem_basic;
mailbox #(int) mb = new();
semaphore sem = new(1);
int v, n, ok;
int pass;
initial begin
pass = 1;
mb.put(7);
mb.get(v);
if (v !== 7) begin
$display("FAIL: mb.get got %0d want 7", v);
pass = 0;
end
ok = mb.try_put(8);
if (ok !== 1) begin
$display("FAIL: try_put expected 1 got %0d", ok);
pass = 0;
end
ok = mb.try_get(v);
if (ok !== 1 || v !== 8) begin
$display("FAIL: try_get ok=%0d v=%0d", ok, v);
pass = 0;
end
n = mb.num();
if (n !== 0) begin
$display("FAIL: num expected 0 got %0d", n);
pass = 0;
end
ok = mb.try_get(v);
if (ok !== 0) begin
$display("FAIL: empty try_get expected 0 got %0d", ok);
pass = 0;
end
sem.get(1);
sem.put(1);
ok = sem.try_get(1);
if (ok !== 1) begin
$display("FAIL: sem.try_get expected 1 got %0d", ok);
pass = 0;
end
ok = sem.try_get(1);
if (ok !== 0) begin
$display("FAIL: sem.try_get empty expected 0 got %0d", ok);
pass = 0;
end
fork
begin
#5;
mb.put(42);
end
begin
mb.get(v);
if (v !== 42) begin
$display("FAIL: blocking get got %0d", v);
pass = 0;
end
end
join
fork
begin
#5;
sem.put(1);
end
begin
sem.get(1);
end
join
if (pass) $display("PASSED");
else $display("FAILED");
end
endmodule