URL
https://opencores.org/ocsvn/uart2bus_testbench/uart2bus_testbench/trunk
Subversion Repositories uart2bus_testbench
[/] [uart2bus_testbench/] [trunk/] [tb/] [uvm_src/] [base/] [uvm_report_message.svh] - Rev 16
Compare with Previous | Blame | View Log
////------------------------------------------------------------------------------// Copyright 2007-2010 Mentor Graphics Corporation// Copyright 2007-2011 Cadence Design Systems, Inc.// Copyright 2010 Synopsys, Inc.// All Rights Reserved Worldwide//// 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.//------------------------------------------------------------------------------`ifndef UVM_REPORT_MESSAGE_SVH`define UVM_REPORT_MESSAGE_SVHtypedef class uvm_report_server;typedef class uvm_report_handler;typedef class uvm_root;//------------------------------------------------------------------------------//// CLASS: uvm_report_message_element_base//// Base class for report message element. Defines common interface.////------------------------------------------------------------------------------virtual class uvm_report_message_element_base;protected uvm_action _action;protected string _name;// Function: get_name//virtual function string get_name();return _name;endfunction// Function: set_name//// Get or set the name of the element//virtual function void set_name(string name);_name = name;endfunction// Function: get_action//virtual function uvm_action get_action();return _action;endfunction// Function: set_action//// Get or set the authorized action for the element//virtual function void set_action(uvm_action action);_action = action;endfunctionfunction void print(uvm_printer printer);if (_action & (UVM_LOG | UVM_DISPLAY))do_print(printer);endfunction : printfunction void record(uvm_recorder recorder);if (_action & UVM_RM_RECORD)do_record(recorder);endfunction : recordfunction void copy(uvm_report_message_element_base rhs);do_copy(rhs);endfunction : copyfunction uvm_report_message_element_base clone();return do_clone();endfunction : clonepure virtual function void do_print(uvm_printer printer);pure virtual function void do_record(uvm_recorder recorder);pure virtual function void do_copy(uvm_report_message_element_base rhs);pure virtual function uvm_report_message_element_base do_clone();endclass : uvm_report_message_element_base//------------------------------------------------------------------------------//// CLASS: uvm_report_message_int_element//// Message element class for integral type////------------------------------------------------------------------------------class uvm_report_message_int_element extends uvm_report_message_element_base;typedef uvm_report_message_int_element this_type;protected uvm_bitstream_t _val;protected int _size;protected uvm_radix_enum _radix;// Function: get_value//virtual function uvm_bitstream_t get_value(output int size,output uvm_radix_enum radix);size = _size;radix = _radix;return _val;endfunction// Function: set_value//// Get or set the value (integral type) of the element, with size and radix//virtual function void set_value(uvm_bitstream_t value,int size,uvm_radix_enum radix);_size = size;_radix = radix;_val = value;endfunctionvirtual function void do_print(uvm_printer printer);printer.print_int(_name, _val, _size, _radix);endfunction : do_printvirtual function void do_record(uvm_recorder recorder);recorder.record_field(_name, _val, _size, _radix);endfunction : do_recordvirtual function void do_copy(uvm_report_message_element_base rhs);this_type _rhs;$cast(_rhs, rhs);_name = _rhs._name;_val = _rhs._val;_size = _rhs._size;_radix = _rhs._radix;_action = rhs._action;endfunction : do_copyvirtual function uvm_report_message_element_base do_clone();this_type tmp = new;tmp.copy(this);return tmp;endfunction : do_cloneendclass : uvm_report_message_int_element//------------------------------------------------------------------------------//// CLASS: uvm_report_message_string_element//// Message element class for string type////------------------------------------------------------------------------------class uvm_report_message_string_element extends uvm_report_message_element_base;typedef uvm_report_message_string_element this_type;protected string _val;// Function: get_value//virtual function string get_value();return _val;endfunction// Function: set_value//// Get or set the value (string type) of the element//virtual function void set_value(string value);_val = value;endfunctionvirtual function void do_print(uvm_printer printer);printer.print_string(_name, _val);endfunction : do_printvirtual function void do_record(uvm_recorder recorder);recorder.record_string(_name, _val);endfunction : do_recordvirtual function void do_copy(uvm_report_message_element_base rhs);this_type _rhs;$cast(_rhs, rhs);_name = _rhs._name;_val = _rhs._val;_action = rhs._action;endfunction : do_copyvirtual function uvm_report_message_element_base do_clone();this_type tmp = new;tmp.copy(this);return tmp;endfunction : do_cloneendclass : uvm_report_message_string_element//------------------------------------------------------------------------------//// CLASS: uvm_report_message_object_element//// Message element class for object type////------------------------------------------------------------------------------class uvm_report_message_object_element extends uvm_report_message_element_base;typedef uvm_report_message_object_element this_type;protected uvm_object _val;// Function: get_value//// Get the value (object reference) of the element//virtual function uvm_object get_value();return _val;endfunction// Function: set_value//// Get or set the value (object reference) of the element//virtual function void set_value(uvm_object value);_val = value;endfunctionvirtual function void do_print(uvm_printer printer);printer.print_object(_name, _val);endfunction : do_printvirtual function void do_record(uvm_recorder recorder);recorder.record_object(_name, _val);endfunction : do_recordvirtual function void do_copy(uvm_report_message_element_base rhs);this_type _rhs;$cast(_rhs, rhs);_name = _rhs._name;_val = _rhs._val;_action = rhs._action;endfunction : do_copyvirtual function uvm_report_message_element_base do_clone();this_type tmp = new;tmp.copy(this);return tmp;endfunction : do_cloneendclass : uvm_report_message_object_element//------------------------------------------------------------------------------//// CLASS: uvm_report_message_element_container//// A container used by report message to contain the dynamically added elements,// with APIs to add and delete the elements.////------------------------------------------------------------------------------class uvm_report_message_element_container extends uvm_object;protected uvm_report_message_element_base elements[$];`uvm_object_utils(uvm_report_message_element_container)// Function: new//// Create a new uvm_report_message_element_container object//function new(string name = "element_container");super.new(name);endfunction// Function: size//// Returns the size of the container, i.e. the number of elements//virtual function int size();return elements.size();endfunction// Function: delete//// Delete the ~index~-th element in the container//virtual function void delete(int index);elements.delete(index);endfunction// Function: delete_elements//// Delete all the elements in the container//virtual function void delete_elements();elements.delete();endfunction// Function: get_elements//// Get all the elements from the container and put them in a queue//typedef uvm_report_message_element_base queue_of_element[$];virtual function queue_of_element get_elements();return elements;endfunction// Function: add_int//// This method adds an integral type of the name ~name~ and value ~value~ to// the container. The required ~size~ field indicates the size of ~value~.// The required ~radix~ field determines how to display and// record the field. The optional print/record bit is to specify whether// the element will be printed/recorded.//virtual function void add_int(string name, uvm_bitstream_t value,int size, uvm_radix_enum radix,uvm_action action = (UVM_LOG|UVM_RM_RECORD));process p;string rand_state;uvm_report_message_int_element urme;p = process::self();if (p != null)rand_state = p.get_randstate();urme = new();if (p != null)p.set_randstate(rand_state);urme.set_name(name);urme.set_value(value, size, radix);urme.set_action(action);elements.push_back(urme);endfunction// Function: add_string//// This method adds a string of the name ~name~ and value ~value~ to the// message. The optional print/record bit is to specify whether// the element will be printed/recorded.//virtual function void add_string(string name, string value,uvm_action action = (UVM_LOG|UVM_RM_RECORD));process p;string rand_state;uvm_report_message_string_element urme;p = process::self();if (p != null)rand_state = p.get_randstate();urme = new();if (p != null)p.set_randstate(rand_state);urme.set_name(name);urme.set_value(value);urme.set_action(action);elements.push_back(urme);endfunction// Function: add_object//// This method adds a uvm_object of the name ~name~ and reference ~obj~ to// the message. The optional print/record bit is to specify whether// the element will be printed/recorded.//virtual function void add_object(string name, uvm_object obj,uvm_action action = (UVM_LOG|UVM_RM_RECORD));process p;string rand_state;uvm_report_message_object_element urme;p = process::self();if (p != null)rand_state = p.get_randstate();urme = new();if (p != null)p.set_randstate(rand_state);urme.set_name(name);urme.set_value(obj);urme.set_action(action);elements.push_back(urme);endfunctionvirtual function void do_print(uvm_printer printer);super.do_print(printer);for(int i = 0; i < elements.size(); i++) beginelements[i].print(printer);endendfunctionvirtual function void do_record(uvm_recorder recorder);super.do_record(recorder);for(int i = 0; i < elements.size(); i++) beginelements[i].record(recorder);endendfunctionvirtual function void do_copy(uvm_object rhs);uvm_report_message_element_container urme_container;super.do_copy(rhs);if(!$cast(urme_container, rhs) || (rhs==null))return;delete_elements();foreach (urme_container.elements[i])elements.push_back(urme_container.elements[i].clone());endfunctionendclass//------------------------------------------------------------------------------//// CLASS: uvm_report_message//// The uvm_report_message is the basic UVM object message class. It provides// the fields that are common to all messages. It also has a message element// container and provides the APIs necessary to add integral types, strings and// uvm_objects to the container. The report message object can be initialized// with the common fields, and passes through the whole reporting system (i.e.// report object, report handler, report server, report catcher, etc) as an// object. The additional elements can be added/deleted to/from the message// object anywhere in the reporting system, and can be printed or recorded// along with the common fields.////------------------------------------------------------------------------------class uvm_report_message extends uvm_object;protected uvm_report_object _report_object;protected uvm_report_handler _report_handler;protected uvm_report_server _report_server;protected uvm_severity _severity;protected string _id;protected string _message;protected int _verbosity;protected string _filename;protected int _line;protected string _context_name;protected uvm_action _action;protected UVM_FILE _file;// Not documented.protected uvm_report_message_element_container _report_message_element_container;// Function: new//// Creates a new uvm_report_message object.//function new(string name = "uvm_report_message");super.new(name);_report_message_element_container = new();endfunction// Function: new_report_message//// Creates a new uvm_report_message object.// This function is the same as new(), but keeps the random stability.//static function uvm_report_message new_report_message(string name = "uvm_report_message");process p;string rand_state;p = process::self();if (p != null)rand_state = p.get_randstate();new_report_message = new(name);if (p != null)p.set_randstate(rand_state);endfunction// Function: print//// The uvm_report_message implements <uvm_object::do_print()> such that// ~print~ method provides UVM printer formatted output// of the message. A snippet of example output is shown here:////| --------------------------------------------------------//| Name Type Size Value//| --------------------------------------------------------//| uvm_report_message uvm_report_message - @532//| severity uvm_severity 2 UVM_INFO//| id string 10 TEST_ID//| message string 12 A message...//| verbosity uvm_verbosity 32 UVM_LOW//| filename string 7 test.sv//| line integral 32 'd58//| context_name string 0 ""//| color string 3 red//| my_int integral 32 'd5//| my_string string 3 foo//| my_obj my_class - @531//| foo integral 32 'd3//| bar string 8 hi therevirtual function void do_print(uvm_printer printer);uvm_verbosity l_verbosity;super.do_print(printer);printer.print_generic("severity", "uvm_severity",$bits(_severity), _severity.name());printer.print_string("id", _id);printer.print_string("message",_message);if ($cast(l_verbosity, _verbosity))printer.print_generic("verbosity", "uvm_verbosity",$bits(l_verbosity), l_verbosity.name());elseprinter.print_int("verbosity", _verbosity, $bits(_verbosity), UVM_HEX);printer.print_string("filename", _filename);printer.print_int("line", _line, $bits(_line), UVM_UNSIGNED);printer.print_string("context_name", _context_name);if (_report_message_element_container.size() != 0)_report_message_element_container.print(printer);endfunction`uvm_object_utils(uvm_report_message)// do_pack() not needed// do_unpack() not needed// do_compare() not needed// Not documented.virtual function void do_copy (uvm_object rhs);uvm_report_message report_message;super.do_copy(rhs);if(!$cast(report_message, rhs) || (rhs==null))return;_report_object = report_message.get_report_object();_report_handler = report_message.get_report_handler();_report_server = report_message.get_report_server();_context_name = report_message.get_context();_file = report_message.get_file();_filename = report_message.get_filename();_line = report_message.get_line();_action = report_message.get_action();_severity = report_message.get_severity();_id = report_message.get_id();_message = report_message.get_message();_verbosity = report_message.get_verbosity();_report_message_element_container.copy(report_message._report_message_element_container);endfunction//----------------------------------------------------------------------------// Group: Infrastructure References//----------------------------------------------------------------------------// Function: get_report_objectvirtual function uvm_report_object get_report_object();return _report_object;endfunction// Function: set_report_object//// Get or set the uvm_report_object that originated the message.virtual function void set_report_object(uvm_report_object ro);_report_object = ro;endfunction// Function: get_report_handlervirtual function uvm_report_handler get_report_handler();return _report_handler;endfunction// Function: set_report_handler//// Get or set the uvm_report_handler that is responsible for checking// whether the message is enabled, should be upgraded/downgraded, etc.virtual function void set_report_handler(uvm_report_handler rh);_report_handler = rh;endfunction// Function: get_report_servervirtual function uvm_report_server get_report_server();return _report_server;endfunction// Function: set_report_server//// Get or set the uvm_report_server that is responsible for servicing// the message's actions.virtual function void set_report_server(uvm_report_server rs);_report_server = rs;endfunction//----------------------------------------------------------------------------// Group: Message Fields//----------------------------------------------------------------------------// Function: get_severityvirtual function uvm_severity get_severity();return _severity;endfunction// Function: set_severity//// Get or set the severity (UVM_INFO, UVM_WARNING, UVM_ERROR or// UVM_FATAL) of the message. The value of this field is determined via// the API used (`uvm_info(), `uvm_waring(), etc.) and populated for the user.virtual function void set_severity(uvm_severity sev);_severity = sev;endfunction// Function: get_idvirtual function string get_id();return _id;endfunction// Function: set_id//// Get or set the id of the message. The value of this field is// completely under user discretion. Users are recommended to follow a// consistent convention. Settings in the uvm_report_handler allow various// messaging controls based on this field. See <uvm_report_handler>.virtual function void set_id(string id);_id = id;endfunction// Function: get_messagevirtual function string get_message();return _message;endfunction// Function: set_message//// Get or set the user message content string.virtual function void set_message(string msg);_message = msg;endfunction// Function: get_verbosityvirtual function int get_verbosity();return _verbosity;endfunction// Function: set_verbosity//// Get or set the message threshold value. This value is compared// against settings in the <uvm_report_handler> to determine whether this// message should be executed.virtual function void set_verbosity(int ver);_verbosity = ver;endfunction// Function: get_filenamevirtual function string get_filename();return _filename;endfunction// Function: set_filename//// Get or set the file from which the message originates. This value// is automatically populated by the messaging macros.virtual function void set_filename(string fname);_filename = fname;endfunction// Function: get_linevirtual function int get_line();return _line;endfunction// Function: set_line//// Get or set the line in the ~file~ from which the message originates.// This value is automatically populate by the messaging macros.virtual function void set_line(int ln);_line = ln;endfunction// Function: get_contextvirtual function string get_context();return _context_name;endfunction// Function: set_context//// Get or set the optional user-supplied string that is meant to convey// the context of the message. It can be useful in scopes that are not// inherently UVM like modules, interfaces, etc.virtual function void set_context(string cn);_context_name = cn;endfunction// Function: get_actionvirtual function uvm_action get_action();return _action;endfunction// Function: set_action//// Get or set the action(s) that the uvm_report_server should perform// for this message. This field is populated by the uvm_report_handler during// message execution flow.virtual function void set_action(uvm_action act);_action = act;endfunction// Function: get_filevirtual function UVM_FILE get_file();return _file;endfunction// Function: set_file//// Get or set the file that the message is to be written to when the// message's action is UVM_LOG. This field is populated by the// uvm_report_handler during message execution flow.virtual function void set_file(UVM_FILE fl);_file = fl;endfunction// Function: get_element_container//// Get the element_container of the messagevirtual function uvm_report_message_element_container get_element_container();return _report_message_element_container;endfunction// Function: set_report_message//// Set all the common fields of the report message in one shot.//virtual function void set_report_message(uvm_severity severity,string id,string message,int verbosity,string filename,int line,string context_name);this._context_name = context_name;this._filename = filename;this._line = line;this._severity = severity;this._id = id;this._message = message;this._verbosity = verbosity;endfunction//----------------------------------------------------------------------------// Group- Message Recording//----------------------------------------------------------------------------// Not documented.virtual function void m_record_message(uvm_recorder recorder);recorder.record_string("message", _message);endfunction// Not documented.virtual function void m_record_core_properties(uvm_recorder recorder);string l_string;uvm_verbosity l_verbosity;if (_context_name != "")recorder.record_string("context_name", _context_name);recorder.record_string("filename", _filename);recorder.record_field("line", _line, $bits(_line), UVM_UNSIGNED);recorder.record_string("severity", _severity.name());if ($cast(l_verbosity, _verbosity))recorder.record_string("verbosity", l_verbosity.name());else beginl_string.itoa(_verbosity);recorder.record_string("verbosity", l_string);endrecorder.record_string("id", _id);m_record_message(recorder);endfunction// Not documented.virtual function void do_record(uvm_recorder recorder);super.do_record(recorder);m_record_core_properties(recorder);_report_message_element_container.record(recorder);endfunction//----------------------------------------------------------------------------// Group: Message Element APIs//----------------------------------------------------------------------------// Function: add_int//// This method adds an integral type of the name ~name~ and value ~value~ to// the message. The required ~size~ field indicates the size of ~value~.// The required ~radix~ field determines how to display and// record the field. The optional print/record bit is to specify whether// the element will be printed/recorded.//virtual function void add_int(string name, uvm_bitstream_t value,int size, uvm_radix_enum radix,uvm_action action = (UVM_LOG|UVM_RM_RECORD));_report_message_element_container.add_int(name, value, size, radix, action);endfunction// Function: add_string//// This method adds a string of the name ~name~ and value ~value~ to the// message. The optional print/record bit is to specify whether// the element will be printed/recorded.//virtual function void add_string(string name, string value,uvm_action action = (UVM_LOG|UVM_RM_RECORD));_report_message_element_container.add_string(name, value, action);endfunction// Function: add_object//// This method adds a uvm_object of the name ~name~ and reference ~obj~ to// the message. The optional print/record bit is to specify whether// the element will be printed/recorded.//virtual function void add_object(string name, uvm_object obj,uvm_action action = (UVM_LOG|UVM_RM_RECORD));_report_message_element_container.add_object(name, obj, action);endfunctionendclass`endif
