verilator/test_regress/t/t_assertcontrol.v

114 lines
2.8 KiB
Systemverilog

// DESCRIPTION: Verilator: Verilog Test module
//
// This file ONLY is placed under the Creative Commons Public Domain.
// SPDX-FileCopyrightText: 2026 Antmicro
// SPDX-License-Identifier: CC0-1.0
// verilog_format: off
`define stop $stop
`define checkd(gotv, expv) do if ((gotv) !== (expv)) begin \
$write("%%Error: %s:%0d: got=%0d exp=%0d (%s !== %s)\n", \
`__FILE__, `__LINE__, (gotv), (expv), `"gotv`", `"expv`"); \
`stop; \
end while (0)
// verilog_format: on
module t;
let LOCK = 1;
let UNLOCK = 2;
let ON = 3;
let OFF = 4;
let PASS_ON = 6;
let PASS_OFF = 7;
let FAIL_ON = 8;
let FAIL_OFF = 9;
let SIMPLE_IMMEDIATE = 2;
let ASSERT = 1;
int pass_count = 0;
int fail_count = 0;
int ctl_type = 0;
task automatic run_pass();
assert (1) begin
pass_count++;
end else
`stop;
endtask
task automatic run_fail();
assert (0)
`stop;
else begin
fail_count++;
end
endtask
initial begin
$assertcontrol(ON, 255, 7);
$assertcontrol(PASS_ON, 255, 7);
$assertcontrol(FAIL_ON, 255, 7);
run_pass();
`checkd(pass_count, 1);
// Lock preserves the enabled checking state against OFF.
$assertcontrol(LOCK, SIMPLE_IMMEDIATE, ASSERT);
ctl_type = OFF;
$assertcontrol(ctl_type, SIMPLE_IMMEDIATE, ASSERT);
run_pass();
`checkd(pass_count, 2);
$assertcontrol(UNLOCK, SIMPLE_IMMEDIATE, ASSERT);
$assertcontrol(OFF, SIMPLE_IMMEDIATE, ASSERT);
run_pass();
`checkd(pass_count, 2);
// Lock preserves the disabled checking state against ON.
$assertcontrol(LOCK, SIMPLE_IMMEDIATE, ASSERT);
$assertcontrol(ON, SIMPLE_IMMEDIATE, ASSERT);
run_pass();
`checkd(pass_count, 2);
$assertcontrol(UNLOCK, SIMPLE_IMMEDIATE, ASSERT);
$assertcontrol(ON, SIMPLE_IMMEDIATE, ASSERT);
run_pass();
`checkd(pass_count, 3);
// Lock also preserves pass-action state.
$assertcontrol(LOCK, SIMPLE_IMMEDIATE, ASSERT);
$assertcontrol(PASS_OFF, SIMPLE_IMMEDIATE, ASSERT);
run_pass();
`checkd(pass_count, 4);
$assertcontrol(UNLOCK, SIMPLE_IMMEDIATE, ASSERT);
$assertcontrol(PASS_OFF, SIMPLE_IMMEDIATE, ASSERT);
run_pass();
`checkd(pass_count, 4);
$assertcontrol(PASS_ON, SIMPLE_IMMEDIATE, ASSERT);
run_fail();
`checkd(fail_count, 1);
// Lock also preserves fail-action state.
$assertcontrol(LOCK, SIMPLE_IMMEDIATE, ASSERT);
$assertcontrol(FAIL_OFF, SIMPLE_IMMEDIATE, ASSERT);
run_fail();
`checkd(fail_count, 2);
$assertcontrol(UNLOCK, SIMPLE_IMMEDIATE, ASSERT);
$assertcontrol(FAIL_OFF, SIMPLE_IMMEDIATE, ASSERT);
run_fail();
`checkd(fail_count, 2);
$assertcontrol(FAIL_ON, SIMPLE_IMMEDIATE, ASSERT);
run_fail();
`checkd(fail_count, 3);
$write("*-* All Finished *-*\n");
$finish;
end
endmodule