mirror of
https://github.com/verilator/verilator.git
synced 2025-01-09 16:17:36 +00:00
7d5e19365e
Signed-off-by: Bartłomiej Chmiel <bchmiel@antmicro.com>
193 lines
7.6 KiB
Systemverilog
193 lines
7.6 KiB
Systemverilog
// DESCRIPTION: Verilator: Verilog Test module
|
|
//
|
|
// This file ONLY is placed under the Creative Commons Public Domain, for
|
|
// any use, without warranty, 2024 by Antmicro.
|
|
// SPDX-License-Identifier: CC0-1.0
|
|
|
|
`define DISPLAY_PASS(file, line) \
|
|
$display("Passed '%m' at %s:%g", file, line)
|
|
|
|
`define DISPLAY_FAIL(file, line) \
|
|
$display("Failed '%m' at %s:%g", file, line)
|
|
|
|
`define RUN_ALL_ASSERTS \
|
|
$display("==========\nRunning all asserts at: %s:%g\n==========", `__FILE__, `__LINE__); \
|
|
run_all_asserts(`__FILE__, `__LINE__); \
|
|
cover_simple_immediate_`__LINE__: cover(1); \
|
|
cover_simple_immediate_stmt_`__LINE__: cover(1) `DISPLAY_PASS(`__FILE__, `__LINE__); \
|
|
cover_observed_deferred_immediate_`__LINE__: cover #0 (1); \
|
|
cover_observed_deferred_immediate_stmt_`__LINE__: cover #0 (1) `DISPLAY_PASS(`__FILE__, `__LINE__); \
|
|
cover_final_deferred_immediate_`__LINE__: cover final (1); \
|
|
cover_final_deferred_immediate_stmt_`__LINE__: cover final (1) `DISPLAY_PASS(`__FILE__, `__LINE__); \
|
|
|
|
module t (/*AUTOARG*/
|
|
clk
|
|
);
|
|
input clk;
|
|
|
|
let ON = 3;
|
|
let OFF = 4;
|
|
let KILL = 5;
|
|
|
|
let CONCURRENT = 1;
|
|
let SIMPLE_IMMEDIATE = 2;
|
|
let OBSERVED_DEFERRED_IMMEDIATE = 4;
|
|
let FINAL_DEFERRED_IMMEDIATE = 8;
|
|
|
|
let ALL_TYPES = CONCURRENT|SIMPLE_IMMEDIATE|OBSERVED_DEFERRED_IMMEDIATE|FINAL_DEFERRED_IMMEDIATE;
|
|
|
|
let ASSERT = 1;
|
|
let COVER = 2;
|
|
let ASSUME = 4;
|
|
|
|
concurrent concurrent(.clk(clk));
|
|
|
|
initial begin
|
|
// simple immediate
|
|
$assertcontrol(OFF, ALL_TYPES);
|
|
$assertcontrol(ON, SIMPLE_IMMEDIATE);
|
|
`RUN_ALL_ASSERTS
|
|
$assertcontrol(OFF, SIMPLE_IMMEDIATE);
|
|
`RUN_ALL_ASSERTS
|
|
|
|
// observed deferred immediate
|
|
$assertcontrol(OFF, ALL_TYPES);
|
|
$assertcontrol(ON, OBSERVED_DEFERRED_IMMEDIATE);
|
|
`RUN_ALL_ASSERTS
|
|
$assertcontrol(OFF, OBSERVED_DEFERRED_IMMEDIATE);
|
|
`RUN_ALL_ASSERTS
|
|
|
|
// final deferred immediate
|
|
$assertcontrol(OFF, ALL_TYPES);
|
|
$assertcontrol(ON, FINAL_DEFERRED_IMMEDIATE);
|
|
`RUN_ALL_ASSERTS
|
|
$assertcontrol(OFF, FINAL_DEFERRED_IMMEDIATE);
|
|
`RUN_ALL_ASSERTS
|
|
|
|
// on, off, kill test
|
|
$assertoff;
|
|
`RUN_ALL_ASSERTS;
|
|
$asserton;
|
|
`RUN_ALL_ASSERTS;
|
|
$assertkill;
|
|
`RUN_ALL_ASSERTS;
|
|
|
|
$assertcontrol(ON, SIMPLE_IMMEDIATE|OBSERVED_DEFERRED_IMMEDIATE);
|
|
`RUN_ALL_ASSERTS;
|
|
$assertcontrol(ON, FINAL_DEFERRED_IMMEDIATE);
|
|
`RUN_ALL_ASSERTS;
|
|
$assertcontrol(OFF, OBSERVED_DEFERRED_IMMEDIATE|FINAL_DEFERRED_IMMEDIATE);
|
|
`RUN_ALL_ASSERTS;
|
|
$assertcontrol(OFF, FINAL_DEFERRED_IMMEDIATE);
|
|
`RUN_ALL_ASSERTS;
|
|
$assertcontrol(OFF, SIMPLE_IMMEDIATE);
|
|
`RUN_ALL_ASSERTS;
|
|
$assertcontrol(ON, SIMPLE_IMMEDIATE);
|
|
`RUN_ALL_ASSERTS;
|
|
$assertcontrol(OFF, ALL_TYPES);
|
|
`RUN_ALL_ASSERTS;
|
|
$assertcontrol(ON, ALL_TYPES);
|
|
`RUN_ALL_ASSERTS;
|
|
$assertcontrol(KILL, ALL_TYPES);
|
|
`RUN_ALL_ASSERTS;
|
|
|
|
// directive_type test
|
|
$assertoff;
|
|
$assertcontrol(ON, ALL_TYPES, ASSERT);
|
|
`RUN_ALL_ASSERTS;
|
|
$assertcontrol(OFF, ALL_TYPES, ASSERT);
|
|
$assertcontrol(ON, ALL_TYPES, COVER);
|
|
`RUN_ALL_ASSERTS;
|
|
$assertcontrol(OFF, ALL_TYPES, COVER);
|
|
$assertcontrol(ON, ALL_TYPES, ASSUME);
|
|
`RUN_ALL_ASSERTS;
|
|
$assertcontrol(OFF, ALL_TYPES, ASSUME);
|
|
$assertcontrol(ON, ALL_TYPES, ASSERT|COVER);
|
|
`RUN_ALL_ASSERTS;
|
|
$assertcontrol(ON, ALL_TYPES, ASSUME);
|
|
`RUN_ALL_ASSERTS;
|
|
$assertoff;
|
|
`RUN_ALL_ASSERTS;
|
|
$assertcontrol(ON, SIMPLE_IMMEDIATE|FINAL_DEFERRED_IMMEDIATE, COVER|ASSUME);
|
|
`RUN_ALL_ASSERTS;
|
|
$assertoff;
|
|
|
|
// concurrent test
|
|
#10;
|
|
$display("Disabling concurrent asserts, time: %g", $time);
|
|
$assertcontrol(ON, ALL_TYPES);
|
|
$assertcontrol(OFF, CONCURRENT);
|
|
#10;
|
|
$display("Enabling concurrent asserts, time: %g", $time);
|
|
$assertcontrol(ON, CONCURRENT);
|
|
$finish;
|
|
end
|
|
endmodule
|
|
|
|
task run_all_asserts(string file, integer line);
|
|
run_simple_immediate(file, line);
|
|
run_observed_deferred_immediate(file, line);
|
|
run_final_deferred_immediate(file, line);
|
|
endtask
|
|
|
|
task run_simple_immediate(string file, integer line);
|
|
$display("Testing assert_simple_immediate at %s:%g", file, line);
|
|
assert_simple_immediate: assert(0);
|
|
assert_simple_immediate_else: assert(0) else `DISPLAY_FAIL(file, line);
|
|
assert_simple_immediate_stmt: assert(0) `DISPLAY_PASS(file, line);
|
|
assert_simple_immediate_stmt_else: assert(0) `DISPLAY_PASS(file, line); else `DISPLAY_FAIL(file, line);
|
|
|
|
$display("Testing assume_simple_immediate at %s:%g", file, line);
|
|
assume_simple_immediate: assume(0);
|
|
assume_simple_immediate_else: assume(0) else `DISPLAY_FAIL(file, line);
|
|
assume_simple_immediate_stmt: assume(0) `DISPLAY_PASS(file, line);
|
|
assume_simple_immediate_stmt_else: assume(0) `DISPLAY_PASS(file, line); else `DISPLAY_FAIL(file, line);
|
|
endtask
|
|
|
|
task run_observed_deferred_immediate(string file, integer line);
|
|
$display("Testing assert_observed_deferred_immediate at %s:%g", file, line);
|
|
assert_observed_deferred_immediate: assert #0 (0);
|
|
assert_observed_deferred_immediate_else: assert #0 (0) else `DISPLAY_FAIL(file, line);
|
|
assert_observed_deferred_immediate_stmt: assert #0 (0) `DISPLAY_PASS(file, line);
|
|
assert_observed_deferred_immediate_stmt_else: assert #0 (0) `DISPLAY_PASS(file, line); else `DISPLAY_FAIL(file, line);
|
|
|
|
$display("Testing assume_observed_deferred_immediate at %s:%g", file, line);
|
|
assume_observed_deferred_immediate: assume #0 (0);
|
|
assume_observed_deferred_immediate_else: assume #0 (0) else `DISPLAY_FAIL(file, line);
|
|
assume_observed_deferred_immediate_stmt: assume #0 (0) `DISPLAY_PASS(file, line);
|
|
assume_observed_deferred_immediate_stmt_else: assume #0 (0) `DISPLAY_PASS(file, line); else `DISPLAY_FAIL(file, line);
|
|
endtask
|
|
|
|
task run_final_deferred_immediate(string file, integer line);
|
|
$display("Testing assert_final_deferred_immediate at %s:%g", file, line);
|
|
assert_final_deferred_immediate: assert final (0);
|
|
assert_final_deferred_immediate_else: assert final (0) else `DISPLAY_FAIL(file, line);
|
|
assert_final_deferred_immediate_stmt: assert final (0) `DISPLAY_PASS(file, line);
|
|
assert_final_deferred_immediate_stmt_else: assert final (0) `DISPLAY_PASS(file, line); else `DISPLAY_FAIL(file, line);
|
|
|
|
$display("Testing assume_final_deferred_immediate at %s:%g", file, line);
|
|
assume_final_deferred_immediate: assume final (0);
|
|
assume_final_deferred_immediate_else: assume final (0) else `DISPLAY_FAIL(file, line);
|
|
assume_final_deferred_immediate_stmt: assume final (0) `DISPLAY_PASS(file, line);
|
|
assume_final_deferred_immediate_stmt_else: assume final (0) `DISPLAY_PASS(file, line); else `DISPLAY_FAIL(file, line);
|
|
endtask
|
|
|
|
module concurrent(input clk);
|
|
property prop();
|
|
@(posedge clk) 0
|
|
endproperty
|
|
|
|
assert_concurrent: assert property (prop);
|
|
assert_concurrent_else: assert property(prop) else `DISPLAY_FAIL(`__FILE__, `__LINE__);
|
|
assert_concurrent_stmt: assert property(prop) `DISPLAY_PASS(`__FILE__, `__LINE__);
|
|
assert_concurrent_stmt_else: assert property(prop) `DISPLAY_PASS(`__FILE__, `__LINE__); else `DISPLAY_FAIL(`__FILE__, `__LINE__);
|
|
|
|
assume_concurrent: assume property(prop);
|
|
assume_concurrent_else: assume property(prop) else `DISPLAY_FAIL(`__FILE__, `__LINE__);
|
|
assume_concurrent_stmt: assume property(prop) `DISPLAY_PASS(`__FILE__, `__LINE__);
|
|
assume_concurrent_stmt_else: assume property(prop) `DISPLAY_PASS(`__FILE__, `__LINE__); else `DISPLAY_FAIL(`__FILE__, `__LINE__);
|
|
|
|
cover_concurrent: cover property(prop);
|
|
cover_concurrent_stmt: cover property(prop) `DISPLAY_PASS(`__FILE__, `__LINE__);
|
|
endmodule
|