verilator/test_regress/t/t_assert_ctl_lock_arg.v

71 lines
2.1 KiB
Systemverilog

// DESCRIPTION: Verilator: Verilog Test module
//
// This file ONLY is placed under the Creative Commons Public Domain.
// SPDX-FileCopyrightText: 2026 Wilson Snyder
// SPDX-License-Identifier: CC0-1.0
// Run with +verilator+assert+lock, which freezes the enabled assertions, so
// every assertion control below is ignored and all directives keep firing.
// verilog_format: off
`define checkd(gotv,expv) do if ((gotv) !== (expv)) begin $write("%%Error: %s:%0d: got=%0d exp=%0d\n", `__FILE__,`__LINE__, (gotv), (expv)); $stop; end while(0);
// verilog_format: on
`ifdef T_ASSERT_CTL_LOCK_ARG_NOASSERT
`define ctl_on_off 3 // On, ignored as the assertions stay disabled
`define expected 0
`else
`define ctl_on_off 4 // Off, ignored as the assertions stay enabled
`define expected 10
`endif
module t;
logic clk = 0;
logic fals = 1'b0;
int imm_fails = 0;
int conc_fails = 0;
int assume_fails = 0;
int ctl;
always #5 clk = ~clk;
// posedge clk at t = 5, 15, 25, 35, 45, 55, 65, 75, 85, 95
always @(posedge clk) imm_assert : assert (fals) else imm_fails = imm_fails + 1;
conc_assert : assert property (@(posedge clk) fals) else conc_fails = conc_fails + 1;
conc_assume : assume property (@(posedge clk) fals) else assume_fails = assume_fails + 1;
initial begin
#6; // t=6
$assertcontrol(`ctl_on_off); // On or Off, whichever would flip all types
#10; // t=16
$assertcontrol(`ctl_on_off, 2); // Same, but only for SIMPLE_IMMEDIATE
#10; // t=26
$assertcontrol(1); // Lock
$assertcontrol(2); // Unlock
#10; // t=36
$assertcontrol(5); // Kill
#10; // t=46
$assertpassoff;
$assertfailoff;
#10; // t=56
ctl = `ctl_on_off;
$assertcontrol(ctl); // Same again, via a non-constant control_type
#10; // t=66
$assertkill;
#34; // t=100
$finish;
end
// Every directive kept the enabled state it started with, as no control
// above took effect
final begin
`checkd(imm_fails, `expected);
`checkd(conc_fails, `expected);
`checkd(assume_fails, `expected);
$write("*-* All Finished *-*\n");
end
endmodule