169 lines
4.8 KiB
Systemverilog
169 lines
4.8 KiB
Systemverilog
|
|
// DESCRIPTION: Verilator: Verilog Test module
|
||
|
|
//
|
||
|
|
// This file ONLY is placed into the Public Domain, for any use,
|
||
|
|
// without warranty, 2025 by Antmicro.
|
||
|
|
// SPDX-License-Identifier: CC0-1.0
|
||
|
|
|
||
|
|
module t ( /*AUTOARG*/
|
||
|
|
// Inputs
|
||
|
|
clk
|
||
|
|
);
|
||
|
|
|
||
|
|
input clk;
|
||
|
|
|
||
|
|
bit [3:0] val = 0;
|
||
|
|
event e1;
|
||
|
|
event e2;
|
||
|
|
event e3;
|
||
|
|
event e4;
|
||
|
|
event e5;
|
||
|
|
event e6;
|
||
|
|
event e7;
|
||
|
|
event e8;
|
||
|
|
event e9;
|
||
|
|
event e10;
|
||
|
|
event e11;
|
||
|
|
event e12;
|
||
|
|
integer cyc = 1;
|
||
|
|
|
||
|
|
always @(negedge clk) begin
|
||
|
|
val <= 4'(cyc % 4);
|
||
|
|
|
||
|
|
if (cyc >= 0 && cyc <= 4) begin
|
||
|
|
->e1;
|
||
|
|
`ifdef TEST_VERBOSE
|
||
|
|
$display("[%0t] triggered e1", $time);
|
||
|
|
`endif
|
||
|
|
end
|
||
|
|
if (cyc >= 5 && cyc <= 10) begin
|
||
|
|
->e2;
|
||
|
|
`ifdef TEST_VERBOSE
|
||
|
|
$display("[%0t] triggered e2", $time);
|
||
|
|
`endif
|
||
|
|
end
|
||
|
|
if (cyc >= 11 && cyc <= 15) begin
|
||
|
|
->e3;
|
||
|
|
`ifdef TEST_VERBOSE
|
||
|
|
$display("[%0t] triggered e3", $time);
|
||
|
|
`endif
|
||
|
|
end
|
||
|
|
if (cyc >= 16 && cyc <= 20) begin
|
||
|
|
->e4;
|
||
|
|
`ifdef TEST_VERBOSE
|
||
|
|
$display("[%0t] triggered e4", $time);
|
||
|
|
`endif
|
||
|
|
end
|
||
|
|
if (cyc >= 21 && cyc <= 25) begin
|
||
|
|
->e5;
|
||
|
|
`ifdef TEST_VERBOSE
|
||
|
|
$display("[%0t] triggered e5", $time);
|
||
|
|
`endif
|
||
|
|
end
|
||
|
|
if (cyc >= 26 && cyc <= 30) begin
|
||
|
|
->e6;
|
||
|
|
`ifdef TEST_VERBOSE
|
||
|
|
$display("[%0t] triggered e6", $time);
|
||
|
|
`endif
|
||
|
|
end
|
||
|
|
if (cyc >= 31 && cyc <= 35) begin
|
||
|
|
->e7;
|
||
|
|
`ifdef TEST_VERBOSE
|
||
|
|
$display("[%0t] triggered e7", $time);
|
||
|
|
`endif
|
||
|
|
end
|
||
|
|
if (cyc >= 36 && cyc <= 40) begin
|
||
|
|
->e8;
|
||
|
|
`ifdef TEST_VERBOSE
|
||
|
|
$display("[%0t] triggered e8", $time);
|
||
|
|
`endif
|
||
|
|
end
|
||
|
|
if (cyc >= 41 && cyc <= 45) begin
|
||
|
|
->e9;
|
||
|
|
`ifdef TEST_VERBOSE
|
||
|
|
$display("[%0t] triggered e9", $time);
|
||
|
|
`endif
|
||
|
|
end
|
||
|
|
if (cyc >= 46 && cyc <= 50) begin
|
||
|
|
->e10;
|
||
|
|
`ifdef TEST_VERBOSE
|
||
|
|
$display("[%0t] triggered e10", $time);
|
||
|
|
`endif
|
||
|
|
end
|
||
|
|
if (cyc >= 51 && cyc <= 55) begin
|
||
|
|
->e11;
|
||
|
|
`ifdef TEST_VERBOSE
|
||
|
|
$display("[%0t] triggered e11", $time);
|
||
|
|
`endif
|
||
|
|
end
|
||
|
|
if (cyc >= 56 && cyc <= 60) begin
|
||
|
|
->e12;
|
||
|
|
`ifdef TEST_VERBOSE
|
||
|
|
$display("[%0t] triggered e12", $time);
|
||
|
|
`endif
|
||
|
|
end
|
||
|
|
`ifdef TEST_VERBOSE
|
||
|
|
$display("cyc=%0d val=%0d", cyc, val);
|
||
|
|
`endif
|
||
|
|
cyc <= cyc + 1;
|
||
|
|
if (cyc == 100) begin
|
||
|
|
$write("*-* All Finished *-*\n");
|
||
|
|
$finish;
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
assert property (@(e1) ##1 1)
|
||
|
|
$display("[%0t] single delay with const stmt, fileline:%0d", $time, `__LINE__);
|
||
|
|
|
||
|
|
assert property (@(e2) ##1 val[0])
|
||
|
|
$display("[%0t] single delay with var stmt, fileline:%0d", $time, `__LINE__);
|
||
|
|
else $display("[%0t] single delay with var else, fileline:%0d", $time, `__LINE__);
|
||
|
|
|
||
|
|
assert property (@(e3) ##2 val[0])
|
||
|
|
$display("[%0t] single multi-cycle delay with var stmt, fileline:%0d", $time, `__LINE__);
|
||
|
|
else $display("[%0t] single multi-cycle delay with var else, fileline:%0d", $time, `__LINE__);
|
||
|
|
|
||
|
|
assert property (@(e4) ##1 (val[0]))
|
||
|
|
$display("[%0t] single delay with var brackets 1 stmt, fileline:%0d", $time, `__LINE__);
|
||
|
|
else $display("[%0t] single delay with var brackets 1 else, fileline:%0d", $time, `__LINE__);
|
||
|
|
|
||
|
|
assert property (@(e5) (##1 (val[0])))
|
||
|
|
$display("[%0t] single delay with var brackets 2 stmt, fileline:%0d", $time, `__LINE__);
|
||
|
|
else $display("[%0t] single delay with var brackets 2 else, fileline:%0d", $time, `__LINE__);
|
||
|
|
|
||
|
|
assert property (@(e6) (##1 val[0] && val[1]))
|
||
|
|
$display("[%0t] single delay with negated var stmt, fileline:%0d", $time, `__LINE__);
|
||
|
|
else $display("[%0t] single delay with negated var else, fileline:%0d", $time, `__LINE__);
|
||
|
|
|
||
|
|
assert property (@(e7) not ##1 val[0])
|
||
|
|
$display("[%0t] single delay with negated var stmt, fileline:%0d", $time, `__LINE__);
|
||
|
|
else $display("[%0t] single delay with negated var else, fileline:%0d", $time, `__LINE__);
|
||
|
|
|
||
|
|
assume property (@(e8) not (##1 val[0]))
|
||
|
|
$display("[%0t] single delay with negated var brackets stmt, fileline:%0d", $time, `__LINE__);
|
||
|
|
else
|
||
|
|
$display("[%0t] single delay with negated var brackets else, fileline:%0d", $time, `__LINE__);
|
||
|
|
|
||
|
|
assume property (@(e9) not (##1 val[0]))
|
||
|
|
else
|
||
|
|
$display("[%0t] single delay with negated var brackets else, fileline:%0d", $time, `__LINE__);
|
||
|
|
|
||
|
|
assert property (@(e10) not (not ##1 val[0]))
|
||
|
|
$display("[%0t] single delay with nested not stmt, fileline:%0d", $time, `__LINE__);
|
||
|
|
else $display("[%0t] single delay with nested not else, fileline:%0d", $time, `__LINE__);
|
||
|
|
|
||
|
|
restrict property (@(e11) ##1 val[0]);
|
||
|
|
|
||
|
|
restrict property (@(e11) not ##1 val[0]);
|
||
|
|
|
||
|
|
property prop;
|
||
|
|
@(e12) not ##1 val[0]
|
||
|
|
endproperty
|
||
|
|
|
||
|
|
assert property (prop) $display("[%0t] property, fileline:%0d", $time, `__LINE__);
|
||
|
|
else $display("[%0t] property, fileline:%0d", $time, `__LINE__);
|
||
|
|
|
||
|
|
assert property (@(posedge clk) not (not ##2 val[0] && val[1]))
|
||
|
|
$display("[%0t] concurrent assert stmt, fileline:%0d", $time, `__LINE__);
|
||
|
|
else $display("[%0t] concurrent assert else, fileline:%0d", $time, `__LINE__);
|
||
|
|
endmodule
|