blob: 899a02b330ed7805fa9618638318dd685309335b [file] [log] [blame]
//###########################################################################
//
// Copyright 2011 The SVUnit Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//###########################################################################
/*
Assertion Macros
*/
`ifndef FAIL_IF
`define FAIL_IF(exp) \
begin \
if (svunit_pkg::current_tc.fail(`"fail_if`", (exp), `"exp`", `__FILE__, `__LINE__)) begin \
if (svunit_pkg::current_tc.is_running()) svunit_pkg::current_tc.give_up(); \
end \
end
`endif
`ifndef FAIL_IF_LOG
`define FAIL_IF_LOG(exp,msg) \
begin \
if (svunit_pkg::current_tc.fail(`"fail_if`", (exp), `"exp`", `__FILE__, `__LINE__, msg)) begin \
if (svunit_pkg::current_tc.is_running()) svunit_pkg::current_tc.give_up(); \
end \
end
`endif
`ifndef FAIL_IF_EQUAL
`define FAIL_IF_EQUAL(a,b) \
begin \
if (svunit_pkg::current_tc.fail(`"fail_if_equal`", ((a)===(b)), `"(a) === (b)`", `__FILE__, `__LINE__)) begin \
if (svunit_pkg::current_tc.is_running()) svunit_pkg::current_tc.give_up(); \
end \
end
`endif
`ifndef FAIL_UNLESS
`define FAIL_UNLESS(exp) \
begin \
if (svunit_pkg::current_tc.fail(`"fail_unless`", !(exp), `"exp`", `__FILE__, `__LINE__)) begin \
if (svunit_pkg::current_tc.is_running()) svunit_pkg::current_tc.give_up(); \
end \
end
`endif
`ifndef FAIL_UNLESS_LOG
`define FAIL_UNLESS_LOG(exp,msg) \
begin \
if (svunit_pkg::current_tc.fail(`"fail_unless`", !(exp), `"exp`", `__FILE__, `__LINE__, msg)) begin \
if (svunit_pkg::current_tc.is_running()) svunit_pkg::current_tc.give_up(); \
end \
end
`endif
`ifndef FAIL_UNLESS_EQUAL
`define FAIL_UNLESS_EQUAL(a,b) \
begin \
if (svunit_pkg::current_tc.fail(`"fail_unless_equal`", ((a)!==(b)), `"(a) !== (b)`", `__FILE__, `__LINE__)) begin \
if (svunit_pkg::current_tc.is_running()) svunit_pkg::current_tc.give_up(); \
end \
end
`endif
`ifndef FAIL_IF_STR_EQUAL
`define FAIL_IF_STR_EQUAL(a,b) \
begin \
string stra; \
string strb; \
stra = a; \
strb = b; \
if (svunit_pkg::current_tc.fail(`"fail_if_str_equal`", stra.compare(strb)==0, $sformatf(`"\"%s\" == \"%s\"`",stra,strb), `__FILE__, `__LINE__)) begin \
if (svunit_pkg::current_tc.is_running()) svunit_pkg::current_tc.give_up(); \
end \
end
`endif
`ifndef FAIL_UNLESS_STR_EQUAL
`define FAIL_UNLESS_STR_EQUAL(a,b) \
begin \
string stra; \
string strb; \
stra = a; \
strb = b; \
if (svunit_pkg::current_tc.fail(`"fail_unless_str_equal`", stra.compare(strb)!=0, $sformatf(`"\"%s\" != \"%s\"`",stra,strb), `__FILE__, `__LINE__)) begin \
if (svunit_pkg::current_tc.is_running()) svunit_pkg::current_tc.give_up(); \
end \
end
`endif
/*
Macro: `INFO
Displays info message to screen and in log file
Parameters:
msg - string to display
*/
`define INFO(msg) \
$display("INFO: [%0t][%0s]: %s", $time, name, msg)
/*
Macro: `ERROR
Displays error message to screen and in log file
Parameters:
msg - string to display
*/
`define ERROR(msg) \
$display("ERROR: [%0t][%0s]: %s", $time, name, msg)
/*
Macro: `LF
Displays a blank line in log file
*/
`define LF $display("");
/*
Macro: `SVUNIT_TESTS_BEGIN
START a block of unit tests
*/
`define SVUNIT_TESTS_BEGIN \
task automatic run(); \
`INFO("RUNNING");
/*
Macro: `SVUNIT_TESTS_END
END a block of unit tests
*/
`define SVUNIT_TESTS_END endtask
/*
Macro: `SVTEST
START an svunit test within an SVUNIT_TEST_BEGIN/END block
REQUIRES ACCESS TO error_count
*/
`define SVTEST(_NAME_) \
begin : _NAME_ \
string _testName = `"_NAME_`"; \
integer local_error_count = svunit_ut.get_error_count(); \
string fileName; \
int lineNumber; \
\
`INFO($sformatf(`"%s::RUNNING`", _testName)); \
svunit_pkg::current_tc = svunit_ut; \
svunit_ut.add_junit_test_case(_testName); \
svunit_ut.start(); \
setup(); \
fork \
begin \
fork \
begin
/*
Macro: `SVTEST_END
END an svunit test within an SVUNIT_TEST_BEGIN/END block
*/
`define SVTEST_END \
end \
begin \
if (svunit_ut.get_error_count() == local_error_count) begin \
svunit_ut.wait_for_error(); \
end \
end \
`SVUNIT_FUSE \
join_any \
#0; \
disable fork; \
end \
join \
svunit_ut.stop(); \
teardown(); \
if (svunit_ut.get_error_count() == local_error_count) \
`INFO($sformatf(`"%s::PASSED`", _testName)); \
else \
`INFO($sformatf(`"%s::FAILED`", _testName)); \
svunit_ut.update_exit_status(); \
end
`define SVUNIT_FUSE \
`ifdef SVUNIT_TIMEOUT \
begin \
bit svunit_timeout = 1; \
#(`SVUNIT_TIMEOUT); \
`FAIL_IF(svunit_timeout) \
end \
`endif
/*
Macro: `SVUNIT_CLK_GEN(_clk_variable, _half_period)
Generate a clock that runs only while this unit test
is running.
*/
`define SVUNIT_CLK_GEN(_clk_variable, _half_period) \
initial begin \
_clk_variable = 0; \
wait(svunit_ut != null); \
forever begin \
if( svunit_ut.is_running() ) \
#_half_period _clk_variable = !_clk_variable; \
else \
wait( svunit_ut.is_running() ); \
end \
end