blob: 69af4f51359e19c0ec5ae7d30c57cbff787c1fb8 [file] [log] [blame]
/******************************************************************************
* (C) Copyright 2015 AMIQ Consulting
*
* 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.
*
* MODULE: svaunit_concurrent_assertion_info.svh
* PROJECT: svaunit
* Description: SVA info class - it contains the SVA name, the SVA path, the SVA type, if SVA was enabled during test,
* if it was tested, a list of details and coverage counters
*******************************************************************************/
`ifndef SVAUNIT_CONCURRENT_ASSERTION_INFO_SVH
`define SVAUNIT_CONCURRENT_ASSERTION_INFO_SVH
// SVA info class - it contains the SVA name, the SVA path, the SVA type
// if SVA was enabled during test,
// if it was tested, a list of details and coverage counters
class svaunit_concurrent_assertion_info extends uvm_object;
`uvm_object_utils(svaunit_concurrent_assertion_info)
// Shows that an SVA is enable or not during test
local bit enable;
// SVA name
local string sva_name;
// SVA path
local string sva_path;
// SVA type
local string sva_type;
// Shows that an SVA was tested or not during test
local svaunit_sva_tested_type tested;
// List of details for the SVA
local svaunit_concurrent_assertion_details sva_details[$];
// Counter used to store the number of failures for an SVA cover
local int nof_cover_failures;
// Counter used to store the number of successful attempts for an SVA cover
local int nof_cover_successfull;
// List of tests names where current SVA is enabled
local string lof_tests_sva_enabled[$];
// List of tests names where current SVA is tested
local string lof_tests_sva_tested[$];
/* Constructor for an svaunit_concurrent_assertion_info
* @param name : instance name for svaunit_concurrent_assertion_info object
*/
function new(string name = "svaunit_concurrent_assertion_info");
super.new(name);
// Initial the enable bit is 1
enable = 1;
endfunction
/* Create new SVA - the first detail is IDLE (the start and end time are the current time)
* @param a_sva_name : current name to initialize the new SVA
* @param a_sva_path : the path to the SVA which need to be created
* @param a_sva_type : current type to initialize the new SVA
*/
virtual function void create_new_sva(ref string a_sva_name, string a_sva_path, string a_sva_type);
// Initialize SVA : set name, type, IDLE state and end time
string test_name = "";
svaunit_concurrent_assertion_state_type idle_state = SVAUNIT_IDLE;
time current_time = $time();
sva_name = a_sva_name;
sva_type = a_sva_type;
sva_path = a_sva_path;
// Initial the enable bit is 1
enable = 1;
add_new_detail_sva(test_name, idle_state, current_time);
endfunction
/* Add new SVA details
* @param a_test_name : test name where this attempt was found
* @param a_sva_state : SVA state to be added
* @param a_sva_end_time : SVA end time to be added
*/
virtual function void add_new_detail_sva(string a_test_name,
svaunit_concurrent_assertion_state_type a_sva_state, time a_sva_end_time);
svaunit_concurrent_assertion_details details;
details = svaunit_concurrent_assertion_details::type_id::create(
$sformatf("%s_detail_%s", sva_name, sva_details.size() - 1));
// Increase the SVA details list size
// Create a new detail using factory mechanism
sva_details.push_back(details);
// Create new detail using given arguments
sva_details[sva_details.size() - 1].create_new_detail(a_test_name, a_sva_state, a_sva_end_time);
endfunction
/* Get the index of the last SVA detail which has finished
* @return the index of the last SVA detail which has finished
*/
virtual function int unsigned get_last_index_sva_finished();
// Variable used to store the last index
int unsigned last_index = 0;
// Verify for all details if they finished and store the last index of finished detail
foreach(sva_details[index])
if(sva_details[index].sva_state == SVAUNIT_FAILURE || sva_details[index].sva_state == SVAUNIT_SUCCESS)
last_index = index;
// Return the last index
return last_index;
endfunction
/* Get the state of the last SVA detail
* @return the state of the last SVA detail
*/
virtual function svaunit_concurrent_assertion_state_type get_sva_state();
return sva_details[sva_details.size() - 1].get_sva_state();
endfunction
/* Verify if last SVA has finished
* @return 1 if last SVA has finished, 0 otherwise
*/
virtual function bit sva_finished();
if(sva_details.size() > 0)
return (sva_details[$].sva_state == SVAUNIT_FAILURE || sva_details[$].sva_state == SVAUNIT_SUCCESS);
else
return 0;
endfunction
/* Verify if last SVA has not finished
* @return 1 if last SVA has not finished, 0 otherwise
*/
virtual function bit sva_not_finished();
return !sva_finished();
endfunction
/* Verify if the last SVA detail succeeded
* @return 1 if the last SVA detail succeeded and 0 otherwise
*/
virtual function bit sva_passed();
if(sva_details.size() > 0)
return (sva_details[$].sva_state == SVAUNIT_SUCCESS);
else
return 0;
endfunction
/* Verify if the last SVA detail failed
* @return 1 if the last SVA detail failed and 0 otherwise
*/
virtual function bit sva_failed();
if(sva_details.size() > 0)
return (sva_details[$].sva_state == SVAUNIT_FAILURE);
else
return 0;
endfunction
/* Print the array of states exercised to the SVA
* @param a_test_name : test name where this attempt was found
*/
virtual function void print_sva_array(string a_test_name);
string text = "";
for(int i = 0; i < sva_details.size(); i++)
text = {text, $sformatf("%s ", sva_details[i].get_sva_details(a_test_name))};
`uvm_info(get_name(), text, UVM_NONE);
endfunction
/* Compute the number of SVA details which contains FAILURE in it's state list
* @return the number of SVA details which failed
*/
virtual function int unsigned get_nof_times_sva_fails();
// Variable used to store the number of details which contains FAILURE in it's state list
int unsigned nof_times_sva_failed = 0;
foreach(sva_details[index])
if(sva_details[index].sva_state == SVAUNIT_FAILURE)
nof_times_sva_failed = nof_times_sva_failed + 1;
// Return the number of details which contains FAILURE in it's state list
return nof_times_sva_failed;
endfunction
/* Compute the number of SVA details which contains SUCCESS in it's state list
* @return the number of SVA details which succeeded
*/
virtual function int unsigned get_nof_times_sva_succeeded();
// Variable used to store the number of details which contains SUCCESS in it's state list
int unsigned nof_times_sva_succeeded = 0;
foreach(sva_details[index])
if(sva_details[index].sva_state == SVAUNIT_SUCCESS)
nof_times_sva_succeeded = nof_times_sva_succeeded + 1;
// Return the number of details which contains SUCCESS in it's state list
return nof_times_sva_succeeded;
endfunction
/* Get SVA name
* @return SVA name
*/
virtual function string get_sva_name();
return sva_name;
endfunction
/* Get SVA path
* @return SVA name
*/
virtual function string get_sva_path();
return sva_path;
endfunction
/* Get SVA type
* @return SVA type
*/
virtual function string get_sva_type();
return sva_type;
endfunction
/* Set the enable bit with a given bit
* @param a_test_name : the test name where the assertion have been tested
* @param a_enable_bit : current enable bit to set
*/
virtual function void set_enable(ref string a_test_name, bit a_enable_bit);
enable = a_enable_bit;
if(a_enable_bit) begin
lof_tests_sva_enabled.push_back(a_test_name);
end
endfunction
/* Get the enable bit - it shows that the SVA is enable during test
* @param a_test_name : the test name where the assertion have been tested
* @return SVA status - if it is enabled or not
*/
virtual function bit sva_enabled(string a_test_name);
print_sva_array(a_test_name);
if(get_sva_type() != "vpiCover") begin
foreach(lof_tests_sva_enabled[test_index]) begin
if(lof_tests_sva_enabled[test_index] == a_test_name) begin
return enable;
end
end
end else begin
return enable;
end
return 0;
endfunction
virtual function bit sva_disabled(string a_test_name);
return !sva_enabled(a_test_name);
endfunction
/* Verify if the SVA was enabled during test
* @param a_test_name : the test name where the assertion have been tested
* @return 1 if the SVA was enabled in given test and 0 otherwise
*/
virtual function bit was_enable(string a_test_name);
foreach(lof_tests_sva_enabled[test_index]) begin
if(lof_tests_sva_enabled[test_index] == a_test_name) begin
return 1;
end
end
return 0;
endfunction
/* Set the tested bit with 1
* @param a_test_name : the test name where the assertion have been tested
*/
virtual function void set_tested(string a_test_name);
tested = SVAUNIT_WAS_TESTED;
lof_tests_sva_tested.push_back(a_test_name);
endfunction
/* Get the tested bit - it shows that the SVA was tested during test
* @param a_test_name : the test name where the assertion have been tested
* @return SVA status - if it is tested or not
*/
virtual function svaunit_sva_tested_type was_tested(string a_test_name);
if(lof_tests_sva_tested.size() > 0) begin
foreach(lof_tests_sva_tested[test_index]) begin
if(lof_tests_sva_tested[test_index] == a_test_name) begin
return tested;
end
end
end
return SVAUNIT_NOT_TESTED;
endfunction
/* Sets the nof_cover_failures counter with the given number
* @param a_nof_attempts_failed : current number to set the counter
*/
virtual function void set_nof_attempts_failed_covered(int a_nof_attempts_failed);
// If a_nof_attempts_failed is (-1) the counter will be 0, otherwise it will have
// a_nof_attempts_failed value
if(a_nof_attempts_failed == (-1)) begin
nof_cover_failures = 0;
end else begin
nof_cover_failures = a_nof_attempts_failed;
end
endfunction
/* Get the number of failures for an SVA cover
* @return the nof_cover_failures counter
*/
virtual function int unsigned get_nof_attempts_failed_covered();
return nof_cover_failures;
endfunction
/* Sets the nof_cover_successfull counter with the given number
* @param a_nof_attempts_successfull : current number to set the counter
*/
virtual function void set_nof_attempts_successfull_covered(int a_nof_attempts_successfull);
// If a_nof_attempts_successfull is (-1) the counter will be 0, otherwise it will have
// a_nof_attempts_successfull value
if(a_nof_attempts_successfull == (-1)) begin
nof_cover_successfull = 0;
end else begin
nof_cover_successfull = a_nof_attempts_successfull;
end
endfunction
/* Get the number of successful attempts for an SVA cover
* @return the nof_cover_successfull counter
*/
virtual function int unsigned get_nof_attempts_successful_covered();
return nof_cover_successfull;
endfunction
/* Print SVA info for a given test
* @param a_test_name : test name from where the user wants to print SVA info
*/
virtual function void print_sva_info(string a_test_name);
// Variable used to store the details as a string
string details;
// Example:
// UVM_INFO @ 25000 ns [svaunit_concurrent_assertion_info]: SVA name = AN_SVA
// UVM_INFO @ 25000 ns [svaunit_concurrent_assertion_info]: SVA type = vpiAssert
// UVM_INFO @ 25000 ns [svaunit_concurrent_assertion_info]: SVA details[0] =
// states : IDLE,
// end time: 0
`uvm_info(get_name(), $sformatf("SVA name = %s", get_sva_name()), UVM_LOW)
`uvm_info(get_name(), $sformatf("SVA type = %s", get_sva_type()), UVM_LOW)
foreach(sva_details[index]) begin
details = sva_details[index].get_sva_details(a_test_name);
if(details != "") begin
`uvm_info(get_name(), $sformatf("[%s] SVA details[%0d] = %s",
sva_details[index].get_name(), index, details), UVM_LOW)
end
end
endfunction
endclass
`endif