| // $Id: //dvt/vtech/dev/main/ovm/src/compatibility/urm_message.sv#25 $ |
| //---------------------------------------------------------------------- |
| // Copyright 2007-2009 Mentor Graphics Corporation |
| // Copyright 2007-2009 Cadence Design Systems, 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. |
| //---------------------------------------------------------------------- |
| |
| |
| `include "compatibility/urm_message.svh" |
| |
| |
| // Utility Functions |
| |
| |
| function string m_urm_mask_worker(int multi_i, string multi_s, int mask, string text); |
| if ( multi_i & mask ) begin |
| if ( multi_s == "" ) begin m_urm_mask_worker = text; end |
| else begin m_urm_mask_worker = { multi_s, "|", text }; end |
| end |
| else begin m_urm_mask_worker = multi_s; end |
| endfunction |
| |
| function string m_urm_msg_style_string(int style_i); |
| string style_s; |
| case (style_i) |
| OVM_URM_STYLE_NONE: begin style_s = "NO_STYLE"; end |
| OVM_URM_LONG: begin style_s = "LONG"; end |
| OVM_URM_RAW: begin style_s = "RAW"; end |
| OVM_URM_SHORT: begin style_s = "SHORT"; end |
| default: begin |
| style_s = ""; |
| style_s = m_urm_mask_worker(style_i,style_s,OVM_URM_STYLE_FILE,"FILE"); |
| style_s = m_urm_mask_worker(style_i,style_s,OVM_URM_STYLE_HIERARCHY,"HIERARCHY"); |
| style_s = m_urm_mask_worker(style_i,style_s,OVM_URM_STYLE_LINE,"LINE"); |
| style_s = m_urm_mask_worker(style_i,style_s,OVM_URM_STYLE_MESSAGE_TEXT,"MESSAGE_TEXT"); |
| style_s = m_urm_mask_worker(style_i,style_s,OVM_URM_STYLE_SCOPE,"SCOPE"); |
| style_s = m_urm_mask_worker(style_i,style_s,OVM_URM_STYLE_SEVERITY,"SEVERITY"); |
| style_s = m_urm_mask_worker(style_i,style_s,OVM_URM_STYLE_TAG,"TAG"); |
| style_s = m_urm_mask_worker(style_i,style_s,OVM_URM_STYLE_TIME,"TIME"); |
| style_s = m_urm_mask_worker(style_i,style_s,OVM_URM_STYLE_UNIT,"UNIT"); |
| style_s = m_urm_mask_worker(style_i,style_s,OVM_URM_STYLE_VERBOSITY,"VERBOSITY"); |
| end |
| endcase |
| return style_s; |
| endfunction |
| |
| function string m_urm_destination_string(int destination_i); |
| string destination_s; |
| $swrite(destination_s,"%0h",destination_i); |
| return destination_s; |
| endfunction |
| |
| function string m_urm_severity_string(int severity_i); |
| string severity_s; |
| case (severity_i) |
| OVM_INFO: begin severity_s = ovm_urm_message_format::info_text; end |
| OVM_WARNING: begin severity_s = ovm_urm_message_format::warning_text; end |
| OVM_ERROR: begin severity_s = ovm_urm_message_format::error_text; end |
| OVM_FATAL: begin severity_s = ovm_urm_message_format::fatal_text; end |
| default: begin |
| $swrite(severity_s,"%s%0d",ovm_urm_message_format::info_text,severity_i); |
| end |
| endcase |
| return severity_s; |
| endfunction |
| |
| // I, W, E, F -- used by URM formatter |
| function string m_urm_severity_S(int severity_i); |
| case (severity_i) |
| OVM_WARNING: begin m_urm_severity_S = "W"; end |
| OVM_ERROR: begin m_urm_severity_S = "E"; end |
| OVM_FATAL: begin m_urm_severity_S = "F"; end |
| default: begin m_urm_severity_S = "I"; end |
| endcase |
| endfunction |
| |
| // Info, Warning, Error, Fatal, used for DUT messages |
| function string m_urm_severity_Severity(int severity_i); |
| string severity_s; |
| case (severity_i) |
| OVM_WARNING: begin severity_s = "Warning"; end |
| OVM_ERROR: begin severity_s = "Error"; end |
| OVM_FATAL: begin severity_s = "Fatal"; end |
| default: begin severity_s = "Info"; end |
| endcase |
| return severity_s; |
| endfunction |
| |
| // info, warning, error, fatal, used for DUT messages |
| function string m_urm_severity_severity(int severity_i); |
| string severity_s; |
| case (severity_i) |
| OVM_WARNING: begin severity_s = "warning"; end |
| OVM_ERROR: begin severity_s = "error"; end |
| OVM_FATAL: begin severity_s = "fatal"; end |
| default: begin severity_s = "info"; end |
| endcase |
| return severity_s; |
| endfunction |
| |
| // use when accessing verbosity via get_*verbosity |
| function string m_urm_verbosity_string(int verbosity_i); |
| string verbosity_s; |
| case (verbosity_i) |
| OVM_NONE: begin verbosity_s = ovm_urm_message_format::none_text; end |
| OVM_LOW: begin verbosity_s = ovm_urm_message_format::low_text; end |
| OVM_MEDIUM: begin verbosity_s = ovm_urm_message_format::medium_text; end |
| OVM_HIGH: begin verbosity_s = ovm_urm_message_format::high_text; end |
| OVM_FULL: begin verbosity_s = ovm_urm_message_format::full_text; end |
| default: begin |
| $swrite(verbosity_s,"%s%0d",ovm_urm_message_format::info_text,verbosity_i); |
| end |
| endcase |
| return verbosity_s; |
| endfunction |
| |
| function string m_urm_action_string(int action_i); |
| string action_s; |
| action_s = ""; |
| // special handling for OVM_NO_ACTION |
| if (ovm_action_type'(action_i) == OVM_NO_ACTION) action_s = "NO_ACTION"; |
| else begin |
| action_s = m_urm_mask_worker(action_i,action_s,OVM_CALL_HOOK,"CALL_HOOK"); |
| action_s = m_urm_mask_worker(action_i,action_s,OVM_COUNT,"COUNT"); |
| action_s = m_urm_mask_worker(action_i,action_s,OVM_DISPLAY,"DISPLAY"); |
| action_s = m_urm_mask_worker(action_i,action_s,OVM_EXIT,"EXIT"); |
| action_s = m_urm_mask_worker(action_i,action_s,OVM_LOG,"LOG"); |
| action_s = m_urm_mask_worker(action_i,action_s,OVM_STOP,"STOP"); |
| end |
| return action_s; |
| endfunction |
| |
| function string m_urm_actions_string_worker(ovm_report_object h, ovm_severity severity_val); |
| ovm_report_handler m_rh; m_rh = h.get_report_handler(); |
| return { |
| " actions[", m_urm_severity_string(severity_val), "]: ", |
| m_urm_action_string(m_rh.severity_actions[severity_val]) |
| }; |
| endfunction |
| |
| function string m_urm_actions_string(ovm_report_object h); |
| string image; |
| image = { m_urm_actions_string_worker(h,OVM_INFO), "\n" }; |
| image = { image, m_urm_actions_string_worker(h,OVM_WARNING), "\n" }; |
| image = { image, m_urm_actions_string_worker(h,OVM_ERROR), "\n" }; |
| image = { image, m_urm_actions_string_worker(h,OVM_FATAL) }; |
| return image; |
| endfunction |
| |
| |
| //---------------------------------------------------------------------------- |
| // |
| // CLASS- ovm_urm_message |
| // |
| //---------------------------------------------------------------------------- |
| |
| |
| function ovm_urm_message::new( |
| string id, string text, int typ, ovm_severity sev, int verbosity, string hier, |
| ovm_report_object client, string file, int line, string scope |
| ); |
| |
| ovm_component ch; |
| ovm_report_handler m_rh; |
| |
| ovm_urm_report_server::init_urm_report_server(); |
| |
| if ( client == null ) client = _global_reporter; |
| m_rh = client.get_report_handler(); |
| |
| if ( urm_msg_type'(typ) == OVM_URM_MSG_DUT ) begin |
| sev = ovm_global_urm_report_server.m_global_severity; |
| end |
| |
| if ( urm_msg_type'(typ) == OVM_URM_MSG_DEBUG && ovm_severity_type'(sev) != OVM_INFO ) begin |
| typ = OVM_URM_MSG_DUT; |
| end |
| |
| if ( urm_msg_type'(typ) == OVM_URM_MSG_DUT ) begin |
| verbosity = OVM_NONE; |
| end |
| |
| if ( file == "" && line == 0 ) file = "<unknown>"; |
| |
| if ( scope == "" ) begin |
| if ( client == _global_reporter ) scope = "__global__"; |
| else scope = client.get_full_name(); |
| end |
| |
| if ( hier == "" ) begin |
| if ( client == _global_reporter ) hier = scope; |
| else hier = client.get_full_name(); |
| end |
| |
| m_id = id; |
| m_text = text; |
| m_type = typ; |
| m_severity = sev; |
| m_verbosity = verbosity; |
| m_max_verbosity = m_rh.m_max_verbosity_level; |
| m_style = ovm_urm_report_server::get_global_debug_style(); |
| m_client = client; |
| m_file = file; |
| m_line = line; |
| m_action = m_rh.get_action(sev,id); |
| m_destination = m_rh.get_file_handle(sev,id); |
| m_scope = scope; |
| m_hierarchy = hier; |
| m_name = client.get_full_name(); |
| |
| endfunction |
| |
| |
| //---------------------------------------------------------------------------- |
| // |
| // CLASS- ovm_urm_override_request |
| // |
| //---------------------------------------------------------------------------- |
| |
| |
| function ovm_urm_override_request::new(string hierarchy="", |
| string scope="", |
| string name="", |
| string file="", |
| int line=-1, |
| string text="", |
| string tag="", |
| ovm_urm_override_operator op=null); |
| match_hierarchy = hierarchy; |
| match_scope = scope; |
| match_name = name; |
| match_file = file; |
| match_line = line; |
| match_text = text; |
| match_tag = tag; |
| operator = op; |
| endfunction |
| |
| |
| function bit ovm_urm_override_request::is_applicable_to_message(ovm_urm_message msg); |
| // breaking into multiple if-statements instead of one large || |
| // to stop matching as soon as the first one fails... |
| if ( !ovm_is_match(match_hierarchy, msg.m_hierarchy) ) |
| return(0); |
| else if ( !ovm_is_match(match_scope, msg.m_scope) ) |
| return(0); |
| else if ( !ovm_is_match(match_name, msg.m_name) ) |
| return(0); |
| else if ( !ovm_is_match(match_text, msg.m_text) ) |
| return(0); |
| else if ( !ovm_is_match(match_tag, msg.m_id) ) |
| return(0); |
| else if ( !ovm_is_match(match_file, msg.m_file) ) |
| return(0); |
| else if ( (match_line != -1) && (match_line != msg.m_line) ) |
| return(0); |
| else |
| return(1); |
| endfunction |
| |
| |
| function void ovm_urm_override_request::apply_override(ovm_urm_message msg); |
| if (operator != null) operator.apply_overrides(msg); |
| endfunction |
| |
| |
| function string ovm_urm_override_request::dump_request_details(); |
| string result; |
| |
| if (operator == null) return("Invalid request - null operator"); |
| result = "ovm_message "; |
| if (match_hierarchy != "*") |
| result = { result, "-hierarchy \"", match_hierarchy, "\" "}; |
| |
| if (match_scope != "*") |
| result = { result, "-scope \"", match_scope, "\" " }; |
| |
| if (match_name != "*") |
| result = { result, "-name \"", match_name, "\" " }; |
| |
| if (match_file != "*") |
| result = { result, "-file \"", match_file, "\" " }; |
| |
| if (match_line != -1) |
| result = { result, "-line ", $psprintf("%0d ", match_line) }; |
| |
| if (match_text != "*") |
| result = { result, "-text \"", match_text, "\" "}; |
| |
| if (match_tag != "*") |
| result = { result, "-tag \"", match_tag, "\" "}; |
| |
| result = { result, operator.dump_override_details()}; |
| return(result); |
| endfunction |
| |
| |
| //---------------------------------------------------------------------------- |
| // |
| // CLASS- ovm_urm_override_operator |
| // |
| //---------------------------------------------------------------------------- |
| |
| |
| function void ovm_urm_override_operator::apply_overrides(ovm_urm_message msg); |
| if (m_enable_style) msg.m_style = m_style; |
| if (m_enable_verbosity) msg.m_max_verbosity = m_verbosity; |
| if (m_enable_destination) msg.m_destination = m_destination; |
| |
| if (m_enable_severity) begin |
| ovm_report_handler m_rh; |
| ovm_severity adjusted_severity; |
| m_rh = msg.m_client.get_report_handler(); |
| msg.m_severity = m_severity; |
| if ((ovm_severity_type'(m_severity) >= OVM_INFO) && (ovm_severity_type'(m_severity) <= OVM_FATAL)) |
| adjusted_severity = m_severity; |
| else |
| adjusted_severity = OVM_INFO; |
| msg.m_action = m_rh.get_action(adjusted_severity,msg.m_id); |
| end |
| |
| if (m_enable_action && (msg.m_severity == m_severity_for_action)) |
| msg.m_action = m_action; |
| endfunction |
| |
| |
| function string ovm_urm_override_operator::dump_override_details(); |
| string result; |
| result = ""; |
| |
| if (m_enable_style) |
| result = { result, "-set_style ", m_urm_msg_style_string(m_style), " "}; |
| |
| if (m_enable_verbosity) |
| result = { result, "-set_verbosity ", m_urm_verbosity_string(m_verbosity), " "}; |
| |
| if (m_enable_destination) |
| result = { result, "-set_destination ", $psprintf("%0d", m_destination), " "}; |
| |
| if (m_enable_severity) |
| result = { result, "-set_severity ", m_urm_severity_string(m_severity), " "}; |
| |
| if (m_enable_action) |
| result = { result, "-severity ", m_urm_severity_string(m_severity_for_action), |
| " -set_actions ", m_urm_action_string(m_action) }; |
| |
| return(result); |
| |
| endfunction |
| |
| |
| //---------------------------------------------------------------------------- |
| // |
| // CLASS- ovm_urm_report_server |
| // |
| //---------------------------------------------------------------------------- |
| |
| |
| function ovm_urm_report_server::new(); |
| super.new(); |
| if ( m_initialized != 1 ) begin |
| m_initialized = 1; |
| m_global_debug_style = OVM_URM_SHORT; |
| m_global_hier = ""; |
| m_global_scope = ""; |
| m_global_severity = OVM_ERROR; |
| m_global_default_type = OVM_URM_MSG_DEBUG; |
| m_global_type = OVM_URM_MSG_DEBUG; |
| end |
| endfunction |
| |
| function void ovm_urm_report_server::report( |
| ovm_severity severity, |
| string name, |
| string id, |
| string message, |
| int verbosity_level, |
| string filename, |
| int line, |
| ovm_report_object client |
| ); |
| static bit m_action_change_warn_once=1; |
| ovm_urm_message msg; |
| |
| msg = new( |
| id, message, m_global_type, severity, verbosity_level, m_global_hier, |
| client, filename, line, m_global_scope |
| ); |
| m_apply_override_requests(msg); |
| |
| if (ovm_action_type'(msg.m_action) == OVM_NO_ACTION) return; |
| // consolidate destination information |
| if ( ! ( msg.m_action & OVM_LOG ) ) msg.m_destination = 0; |
| if ( msg.m_action & OVM_DISPLAY ) msg.m_destination |= 1; |
| |
| // enforce limitations on `message actions |
| if ( urm_msg_type'(msg.m_type) == OVM_URM_MSG_DEBUG ) begin |
| if ((msg.m_action & ~(OVM_DISPLAY|OVM_LOG))&&(m_action_change_warn_once)) begin |
| $display("OVM messaging ignores OVM_CALL_HOOK, OVM_COUNT, OVM_EXIT and OVM_STOP actions on messages created via `message. "); |
| m_action_change_warn_once = 0; |
| end |
| msg.m_action &= (OVM_DISPLAY|OVM_LOG); |
| end |
| |
| // if ( ! msg.handler.filter(msg) ) return; |
| if ( msg.m_verbosity > msg.m_max_verbosity ) return; |
| |
| // update counts |
| ovm_global_urm_report_server.incr_severity_count(msg.m_severity); |
| ovm_global_urm_report_server.incr_id_count(msg.m_id); |
| |
| if ( msg.m_destination != 0 ) begin |
| |
| case (msg.m_type) |
| |
| OVM_URM_MSG_DEBUG : begin |
| bit first; |
| first = 1; |
| if ( msg.m_style & OVM_URM_STYLE_TIME ) begin |
| first = 0; |
| $fwrite(msg.m_destination,"[%0t]",$time); |
| end |
| if ( msg.m_style & OVM_URM_STYLE_VERBOSITY ) begin |
| if ( first ) first = 0; else $write(" "); |
| $fwrite(msg.m_destination,"(%0s)",m_urm_verbosity_string(msg.m_verbosity)); |
| end |
| if ( msg.m_style & OVM_URM_STYLE_SEVERITY ) begin |
| if ( first ) first = 0; else $write(" "); |
| $fwrite(msg.m_destination,"severity=%0s",m_urm_severity_string(msg.m_severity)); |
| end |
| if ( msg.m_style & OVM_URM_STYLE_TAG ) begin |
| if ( first ) first = 0; else $write(" "); |
| $fwrite(msg.m_destination,"tag=%0s",msg.m_id); |
| end |
| if ( msg.m_style & OVM_URM_STYLE_SCOPE ) begin |
| if ( first ) first = 0; else $write(" "); |
| $fwrite(msg.m_destination,"scope=%0s",msg.m_scope); |
| end |
| if ( msg.m_style & OVM_URM_STYLE_HIERARCHY ) begin |
| if ( first ) first = 0; else $write(" "); |
| $fwrite(msg.m_destination,"hier=%0s",msg.m_hierarchy); |
| end |
| if ( msg.m_style & OVM_URM_STYLE_MESSAGE_TEXT ) begin |
| if ( ! first ) $fwrite(msg.m_destination,": "); |
| $fdisplay(msg.m_destination,"%s",msg.m_text); |
| end |
| else begin |
| if ( ! first ) $fdisplay(msg.m_destination); |
| end |
| first = 1; |
| if ( ( msg.m_style & OVM_URM_STYLE_FILE ) && ( msg.m_style & OVM_URM_STYLE_LINE ) ) begin |
| first = 0; |
| $fwrite(msg.m_destination,"%0s, %0d",msg.m_file,msg.m_line); |
| end |
| else if ( msg.m_style & OVM_URM_STYLE_FILE ) begin |
| first = 0; |
| $fwrite(msg.m_destination,"%0s",msg.m_file); |
| end |
| else if ( msg.m_style & OVM_URM_STYLE_LINE ) begin |
| first = 0; |
| $fwrite(msg.m_destination,"%0d",msg.m_line); |
| end |
| if ( ( msg.m_style & OVM_URM_STYLE_UNIT ) ) begin |
| ovm_component ch; |
| if ( $cast(ch,msg.m_client) ) begin |
| if ( first ) first = 0; else $fwrite(msg.m_destination," "); |
| $fwrite(msg.m_destination,"%0s",ch.get_full_name()); |
| end |
| end |
| if ( ! first ) $fdisplay(msg.m_destination); |
| end |
| |
| OVM_URM_MSG_DUT : begin |
| $fdisplay( |
| msg.m_destination, |
| "*** OVM: DUT %s at time %0t\nChecked at line %0d in %s\nIn %s", |
| m_urm_severity_severity(msg.m_severity), |
| $time, msg.m_line, msg.m_file, |
| msg.m_hierarchy |
| ); |
| $fdisplay(msg.m_destination,"%s",msg.m_text); |
| if ( msg.m_action & (OVM_EXIT|OVM_STOP) ) begin |
| ovm_report_handler m_rh; |
| m_rh = msg.m_client.get_report_handler(); |
| $fdisplay( |
| msg.m_destination, |
| "Will stop execution immediately (check effect is %0s)", |
| m_rh.format_action(msg.m_action) |
| ); |
| end |
| $fdisplay( |
| msg.m_destination, |
| "*** %0s: A DUT %0s has occurred\n", |
| m_urm_severity_Severity(msg.m_severity), |
| m_urm_severity_severity(msg.m_severity) |
| ); |
| end |
| |
| OVM_URM_MSG_TOOL : begin |
| $fwrite( |
| msg.m_destination, |
| "ovm: *%s,%s (%s,%0d): ", |
| m_urm_severity_S(msg.m_severity), msg.m_id, |
| msg.m_file, msg.m_line |
| ); |
| $fdisplay(msg.m_destination,"%s",msg.m_text); |
| end |
| |
| OVM_URM_MSG_OVM : begin |
| string image; |
| image = ovm_global_urm_report_server.compose_message( |
| msg.m_severity, msg.m_name, msg.m_id, |
| msg.m_text, msg.m_file, msg.m_line |
| ); |
| $fdisplay(msg.m_destination,"%s",image); |
| end |
| |
| endcase |
| |
| end |
| |
| if ( msg.m_action & OVM_COUNT ) begin |
| if ( ovm_global_urm_report_server.get_max_quit_count() != 0 ) begin |
| ovm_global_urm_report_server.incr_quit_count(); |
| if ( ovm_global_urm_report_server.is_quit_count_reached() ) begin |
| $display("** ERROR LIMIT REACHED **"); |
| msg.m_action |= OVM_EXIT; |
| end |
| end |
| end |
| |
| if ( msg.m_action & OVM_EXIT ) |
| if( (msg.m_action & OVM_COUNT) && ovm_global_urm_report_server.is_quit_count_reached() ) |
| msg.m_client.die(); |
| |
| if ( msg.m_action & OVM_STOP ) $stop; |
| |
| endfunction |
| |
| function int ovm_urm_report_server::get_global_max_quit_count(); |
| ovm_urm_report_server::init_urm_report_server(); |
| return ovm_global_urm_report_server.get_max_quit_count(); |
| endfunction |
| |
| function void ovm_urm_report_server::set_global_max_quit_count(int value); |
| ovm_urm_report_server::init_urm_report_server(); |
| ovm_global_urm_report_server.set_max_quit_count(value); |
| endfunction |
| |
| function int ovm_urm_report_server::get_global_debug_style(); |
| ovm_urm_report_server::init_urm_report_server(); |
| return ovm_global_urm_report_server.m_global_debug_style; |
| endfunction |
| |
| function void ovm_urm_report_server::set_global_debug_style(int value); |
| ovm_urm_report_server::init_urm_report_server(); |
| ovm_global_urm_report_server.m_global_debug_style = value; |
| endfunction |
| |
| function void ovm_urm_report_server::set_message_debug_style( |
| string hierarchy, // wildcard for message hierarchy, default "*" |
| string scope, // wildcard for message scope, default "*" |
| string name, // wildcard for message name, default "*" |
| string file, // wildcard for file name, default "*" |
| int line, // wildcard for line number, default -1 (matches all) |
| string text, // wildcard for message text, default "*" |
| string tag, // wildcard for message tag, default "*" |
| bit remove, // FALSE --> add rule, TRUE --> remove it |
| int value |
| ); |
| ovm_urm_override_operator op; |
| ovm_urm_override_request new_req; |
| op = new; |
| if (! op.set_style(value)) return; |
| new_req = new(hierarchy, scope, name, file, line, text, tag, op); |
| m_handle_new_request(new_req, remove); |
| endfunction |
| |
| function int ovm_urm_report_server::get_global_verbosity(); |
| ovm_report_handler m_rh; |
| ovm_urm_report_server::init_urm_report_server(); |
| m_rh = _global_reporter.get_report_handler(); |
| return m_rh.m_max_verbosity_level; |
| endfunction |
| |
| function void ovm_urm_report_server::set_global_verbosity(int value); |
| ovm_report_handler m_rh; |
| ovm_urm_report_server::init_urm_report_server(); |
| m_rh = _global_reporter.get_report_handler(); |
| m_rh.m_max_verbosity_level = value; |
| endfunction |
| |
| function void ovm_urm_report_server::set_message_verbosity( |
| string hierarchy, // wildcard for message hierarchy, default "*" |
| string scope, // wildcard for message scope, default "*" |
| string name, // wildcard for message name, default "*" |
| string file, // wildcard for file name, default "*" |
| int line, // wildcard for line number, default -1 (matches all) |
| string text, // wildcard for message text, default "*" |
| string tag, // wildcard for message tag, default "*" |
| bit remove, // FALSE --> add rule, TRUE --> remove it |
| int value |
| ); |
| ovm_urm_override_operator op; |
| ovm_urm_override_request new_req; |
| op = new; |
| if (! op.set_verbosity(value)) return; |
| // verbosity is applied by default to messages with a "DEBUG" tag |
| if (tag == "*") tag = "DEBUG"; |
| new_req = new(hierarchy, scope, name, file, line, text, tag, op); |
| m_handle_new_request(new_req, remove); |
| endfunction |
| |
| function int ovm_urm_report_server::get_global_destination(); |
| ovm_report_handler m_rh; |
| ovm_urm_report_server::init_urm_report_server(); |
| m_rh = _global_reporter.get_report_handler(); |
| return m_rh.default_file_handle; |
| endfunction |
| |
| function void ovm_urm_report_server::set_global_destination(int value); |
| ovm_report_handler m_rh; |
| ovm_urm_report_server::init_urm_report_server(); |
| m_rh = _global_reporter.get_report_handler(); |
| `ifdef OVM_AVOID_SFORMATF |
| `urm_static_warning(("Changing destination on messages is not supported in this version of URM")) |
| `else |
| m_rh.default_file_handle = value; |
| `endif |
| endfunction |
| |
| function void ovm_urm_report_server::set_message_destination( |
| string hierarchy, // wildcard for message hierarchy, default "*" |
| string scope, // wildcard for message scope, default "*" |
| string name, // wildcard for message name, default "*" |
| string file, // wildcard for file name, default "*" |
| int line, // wildcard for line number, default -1 (matches all) |
| string text, // wildcard for message text, default "*" |
| string tag, // wildcard for message tag, default "*" |
| bit remove, // FALSE --> add rule, TRUE --> remove it |
| int value |
| ); |
| ovm_urm_override_operator op; |
| ovm_urm_override_request new_req; |
| `ifdef OVM_AVOID_SFORMATF |
| if ( remove ) |
| `urm_warning(("Cannot find a matching rule to remove. Ignoring.")) |
| else |
| `urm_warning(("Changing destination on messages is not supported in this version of URM")) |
| `else |
| op = new; |
| if (! op.set_destination(value)) return; |
| new_req = new(hierarchy, scope, name, file, line, text, tag, op); |
| m_handle_new_request(new_req, remove); |
| `endif |
| endfunction |
| |
| function ovm_severity ovm_urm_report_server::get_global_severity(); |
| ovm_urm_report_server::init_urm_report_server(); |
| return ovm_global_urm_report_server.m_global_severity; |
| endfunction |
| |
| function void ovm_urm_report_server::set_global_severity(ovm_severity value); |
| ovm_urm_report_server::init_urm_report_server(); |
| ovm_global_urm_report_server.m_global_severity = value; |
| endfunction |
| |
| function void ovm_urm_report_server::set_message_severity( |
| string hierarchy, // wildcard for message hierarchy, default "*" |
| string scope, // wildcard for message scope, default "*" |
| string name, // wildcard for message name, default "*" |
| string file, // wildcard for file name, default "*" |
| int line, // wildcard for line number, default -1 (matches all) |
| string text, // wildcard for message text, default "*" |
| string tag, // wildcard for message tag, default "*" |
| bit remove, // FALSE --> add rule, TRUE --> remove it |
| ovm_severity value |
| ); |
| ovm_urm_override_operator op; |
| ovm_urm_override_request new_req; |
| op = new; |
| if (! op.set_severity(value)) return; |
| // severity is applied by default to messages with a "DUT" tag |
| if (tag == "*") tag = "DUT"; |
| new_req = new(hierarchy, scope, name, file, line, text, tag, op); |
| m_handle_new_request(new_req, remove); |
| endfunction |
| |
| function int ovm_urm_report_server::get_global_actions(ovm_severity sev); |
| ovm_report_handler m_rh; |
| ovm_urm_report_server::init_urm_report_server(); |
| m_rh = _global_reporter.get_report_handler(); |
| return m_rh.severity_actions[sev]; |
| endfunction |
| |
| function void ovm_urm_report_server::set_global_actions(ovm_severity sev, int value); |
| ovm_report_handler m_rh; |
| ovm_urm_report_server::init_urm_report_server(); |
| m_rh = _global_reporter.get_report_handler(); |
| m_rh.severity_actions[sev] = value; |
| endfunction |
| |
| function void ovm_urm_report_server::set_message_actions( |
| string hierarchy, // wildcard for message hierarchy, default "*" |
| string scope, // wildcard for message scope, default "*" |
| string name, // wildcard for message name, default "*" |
| string file, // wildcard for file name, default "*" |
| int line, // wildcard for line number, default -1 (matches all) |
| string text, // wildcard for message text, default "*" |
| string tag, // wildcard for message tag, default "*" |
| bit remove, // FALSE --> add rule, TRUE --> remove it |
| ovm_severity severity_val, |
| int value |
| ); |
| ovm_urm_override_operator op; |
| ovm_urm_override_request new_req; |
| op = new; |
| if (! op.set_action(severity_val, value)) return; |
| new_req = new(hierarchy, scope, name, file, line, text, tag, op); |
| m_handle_new_request(new_req, remove); |
| endfunction |
| |
| function void ovm_urm_report_server::init_urm_report_server(); |
| if ( ovm_global_urm_report_server == null ) begin |
| ovm_report_handler m_rh; |
| ovm_report_global_server glob; |
| ovm_global_urm_report_server = new; |
| glob = new; |
| glob.set_server(ovm_global_urm_report_server); |
| m_rh = _global_reporter.get_report_handler(); |
| m_rh.set_severity_action(OVM_INFO,OVM_DISPLAY); |
| m_rh.set_severity_action(OVM_WARNING,OVM_DISPLAY); |
| m_rh.set_severity_action(OVM_ERROR,OVM_COUNT|OVM_DISPLAY|OVM_EXIT); |
| m_rh.set_severity_action(OVM_FATAL,OVM_COUNT|OVM_DISPLAY|OVM_EXIT); |
| end |
| endfunction |
| |
| function void ovm_urm_report_server::set_default_report_type(int value); |
| ovm_urm_report_server::init_urm_report_server(); |
| ovm_global_urm_report_server.m_global_default_type = value; |
| ovm_global_urm_report_server.m_global_type = value; |
| endfunction |
| |
| function bit ovm_urm_report_server::m_message_header(ovm_urm_message message); |
| static bit m_action_change_warn_once =1; |
| |
| m_apply_override_requests(message); |
| // consolidate destination information |
| if ( ! ( message.m_action & OVM_LOG ) ) message.m_destination = 0; |
| if ( message.m_action & OVM_DISPLAY ) message.m_destination |= 1; |
| |
| // enforce limitations on `message actions |
| if ( urm_msg_type'(message.m_type) == OVM_URM_MSG_DEBUG ) begin |
| if ((message.m_action & ~(OVM_DISPLAY|OVM_LOG))&&(m_action_change_warn_once)) begin |
| $display("OVM messaging ignores OVM_CALL_HOOK, OVM_COUNT, OVM_EXIT and OVM_STOP actions on messages created via `message. "); |
| m_action_change_warn_once = 0; |
| end |
| message.m_action &= (OVM_DISPLAY|OVM_LOG); |
| end |
| |
| // return message.handler.filter(message); |
| return message.m_verbosity <= message.m_max_verbosity; |
| endfunction |
| |
| function bit ovm_urm_report_server::m_message_subheader(ovm_urm_message message); |
| |
| // update counts |
| ovm_global_urm_report_server.incr_severity_count(message.m_severity); |
| ovm_global_urm_report_server.incr_id_count(message.m_id); |
| |
| if ( message.m_destination == 0 ) return 0; |
| |
| case (message.m_type) |
| |
| OVM_URM_MSG_DEBUG : begin |
| bit first; |
| first = 1; |
| if ( message.m_style & OVM_URM_STYLE_TIME ) begin |
| first = 0; |
| $write("[%0t]",$time); |
| end |
| if ( message.m_style & OVM_URM_STYLE_VERBOSITY ) begin |
| if ( first ) first = 0; else $write(" "); |
| $write("(%0s)",m_urm_verbosity_string(message.m_verbosity)); |
| end |
| if ( message.m_style & OVM_URM_STYLE_SEVERITY ) begin |
| if ( first ) first = 0; else $write(" "); |
| $write("severity=%0s",m_urm_severity_string(message.m_severity)); |
| end |
| if ( message.m_style & OVM_URM_STYLE_TAG ) begin |
| if ( first ) first = 0; else $write(" "); |
| $write("tag=%0s",message.m_id); |
| end |
| if ( message.m_style & OVM_URM_STYLE_SCOPE ) begin |
| if ( first ) first = 0; else $write(" "); |
| $write("scope=%0s",message.m_scope); |
| end |
| if ( message.m_style & OVM_URM_STYLE_HIERARCHY ) begin |
| if ( first ) first = 0; else $write(" "); |
| $write("hier=%0s",message.m_hierarchy); |
| end |
| if ( message.m_style & OVM_URM_STYLE_MESSAGE_TEXT ) begin |
| if ( ! first ) $write(": "); |
| return 1; |
| end |
| else begin |
| if ( ! first ) $display; |
| return 0; |
| end |
| end |
| |
| OVM_URM_MSG_DUT : begin |
| $display( |
| "\n*** OVM: DUT %s at time %0t\n Checked at line %0d in %s\n In %s\n", |
| m_urm_severity_severity(message.m_severity), |
| $time, message.m_line, message.m_file, |
| message.m_hierarchy |
| ); |
| end |
| |
| OVM_URM_MSG_TOOL : begin |
| $write( |
| "ovm: *%s,%s (%s,%0d): ", |
| m_urm_severity_S(message.m_severity), message.m_id, |
| message.m_file, message.m_line |
| ); |
| end |
| |
| OVM_URM_MSG_OVM : begin |
| string image; |
| image = ovm_global_urm_report_server.compose_message( |
| message.m_severity, message.m_name, message.m_id, |
| "", message.m_file, message.m_line |
| ); |
| $write("%s",image); |
| end |
| |
| endcase |
| |
| return 1; |
| |
| endfunction |
| |
| function void ovm_urm_report_server::m_message_footer(ovm_urm_message message); |
| |
| if ( message.m_destination != 0 ) begin |
| |
| case (message.m_type) |
| |
| OVM_URM_MSG_DEBUG : begin |
| bit first; |
| first = 1; |
| if ( ( message.m_style & OVM_URM_STYLE_FILE ) && ( message.m_style & OVM_URM_STYLE_LINE ) ) begin |
| first = 0; |
| $write("%0s, %0d",message.m_file,message.m_line); |
| end |
| else if ( message.m_style & OVM_URM_STYLE_FILE ) begin |
| first = 0; |
| $write("%0s",message.m_file); |
| end |
| else if ( message.m_style & OVM_URM_STYLE_LINE ) begin |
| first = 0; |
| $write("%0d",message.m_line); |
| end |
| if ( ( message.m_style & OVM_URM_STYLE_UNIT ) ) begin |
| ovm_component ch; |
| if ( $cast(ch,message.m_client) ) begin |
| if ( first ) first = 0; else $write(" "); |
| $write("%0s",ch.get_full_name()); |
| end |
| end |
| if ( ! first ) $display; |
| end |
| |
| OVM_URM_MSG_DUT : begin |
| if ( message.m_action & (OVM_EXIT|OVM_STOP) ) begin |
| ovm_report_handler m_rh; |
| m_rh = message.m_client.get_report_handler(); |
| $display( |
| "Will stop execution immediately (check effect is %0s)", |
| m_rh.format_action(message.m_action) |
| ); |
| end |
| $display( |
| "*** %0s: A DUT %0s has occurred\n", |
| m_urm_severity_Severity(message.m_severity), |
| m_urm_severity_severity(message.m_severity) |
| ); |
| end |
| |
| endcase |
| |
| end |
| |
| if ( message.m_action & OVM_COUNT ) begin |
| if ( ovm_global_urm_report_server.get_max_quit_count() != 0 ) begin |
| ovm_global_urm_report_server.incr_quit_count(); |
| if ( ovm_global_urm_report_server.is_quit_count_reached() ) begin |
| $display("** ERROR LIMIT REACHED **"); |
| message.m_action |= OVM_EXIT; |
| end |
| end |
| end |
| |
| if ( message.m_action & OVM_EXIT ) |
| if( (message.m_action & OVM_COUNT) && ovm_global_urm_report_server.is_quit_count_reached() ) |
| message.m_client.die(); |
| |
| if ( message.m_action & OVM_STOP ) $stop; |
| |
| endfunction |
| |
| function void ovm_urm_report_server::m_set_report_hier(string hier); |
| ovm_urm_report_server::init_urm_report_server(); |
| ovm_global_urm_report_server.m_global_hier = hier; |
| endfunction |
| |
| function void ovm_urm_report_server::m_set_report_scope(string scope); |
| ovm_urm_report_server::init_urm_report_server(); |
| ovm_global_urm_report_server.m_global_scope = scope; |
| endfunction |
| |
| function void ovm_urm_report_server::m_set_report_type(int typ); |
| ovm_urm_report_server::init_urm_report_server(); |
| ovm_global_urm_report_server.m_global_type = typ; |
| endfunction |
| |
| function void ovm_urm_report_server::m_reset_report_flags(); |
| ovm_urm_report_server::init_urm_report_server(); |
| ovm_global_urm_report_server.m_global_hier = ""; |
| ovm_global_urm_report_server.m_global_scope = ""; |
| ovm_global_urm_report_server.m_global_type = ovm_global_urm_report_server.m_global_default_type; |
| endfunction |
| |
| function string ovm_urm_report_server::m_dump_global_debug_style(); |
| int style_e; |
| style_e = get_global_debug_style(); |
| return m_urm_msg_style_string(style_e); |
| endfunction |
| |
| function string ovm_urm_report_server::m_dump_rules_debug_style(); |
| string result; |
| result = ""; |
| for (int i=0 ; i<m_override_requests.size(); i++) |
| if (m_override_requests[i].is_style_override()) |
| result = { result, m_override_requests[i].dump_request_details(), "\n"}; |
| return (result); |
| endfunction |
| |
| function string ovm_urm_report_server::m_dump_global_verbosity(); |
| int verbosity_i; |
| verbosity_i = get_global_verbosity(); |
| return m_urm_verbosity_string(verbosity_i); |
| endfunction |
| |
| function string ovm_urm_report_server::m_dump_rules_verbosity(); |
| string result; |
| result = ""; |
| for (int i=0 ; i<m_override_requests.size(); i++) |
| if (m_override_requests[i].is_verbosity_override()) |
| result = { result, m_override_requests[i].dump_request_details(), "\n"}; |
| return (result); |
| endfunction |
| |
| function string ovm_urm_report_server::m_dump_global_destination(); |
| int destination_i; |
| destination_i = get_global_destination(); |
| return m_urm_destination_string(destination_i); |
| endfunction |
| |
| function string ovm_urm_report_server::m_dump_rules_destination(); |
| string result; |
| result = ""; |
| for (int i=0 ; i<m_override_requests.size(); i++) |
| if (m_override_requests[i].is_destination_override()) |
| result = { result, m_override_requests[i].dump_request_details(), "\n"}; |
| return (result); |
| endfunction |
| |
| function string ovm_urm_report_server::m_dump_global_severity(); |
| int severity_i; |
| severity_i = get_global_severity(); |
| return m_urm_severity_string(severity_i); |
| endfunction |
| |
| function string ovm_urm_report_server::m_dump_rules_severity(); |
| string result; |
| result = ""; |
| for (int i=0 ; i<m_override_requests.size(); i++) |
| if (m_override_requests[i].is_severity_override()) |
| result = { result, m_override_requests[i].dump_request_details(), "\n"}; |
| return (result); |
| endfunction |
| |
| function string ovm_urm_report_server::m_dump_global_actions(); |
| ovm_urm_report_server::init_urm_report_server(); |
| return m_urm_actions_string(_global_reporter); |
| endfunction |
| |
| function string ovm_urm_report_server::m_dump_rules_actions(); |
| string result; |
| result = ""; |
| for (int i=0 ; i<m_override_requests.size(); i++) |
| if (m_override_requests[i].is_action_override()) |
| result = { result, m_override_requests[i].dump_request_details(), "\n"}; |
| return (result); |
| endfunction |
| |
| function void ovm_urm_report_server::m_handle_new_request( |
| ovm_urm_override_request new_req, bit remove |
| ); |
| int existing_req_loc; |
| `ifdef OVM_AVOID_SFORMATF |
| if ( new_req.match_text != "*" && ! remove ) begin |
| `urm_warning(("%s%s", |
| "Filtering message overrides by message text is not supported ", |
| "in this version of OVM; this override will be ignored" |
| )) |
| return; |
| end |
| `endif |
| existing_req_loc = m_find_last_matching_request_loc(new_req); |
| if (remove) begin |
| if (existing_req_loc != -1) |
| m_override_requests.delete(existing_req_loc); |
| else |
| `urm_warning(("Cannot find a matching rule to remove. Ignoring.")) |
| end |
| else begin // !remove |
| if ( (m_override_requests.size() == 0) |
| || |
| (existing_req_loc != m_override_requests.size()-1)) |
| m_override_requests.push_back(new_req); |
| else |
| `urm_warning(("Repeating the same command as the last one. Ignoring.")) |
| end |
| endfunction |
| |
| function int ovm_urm_report_server::m_find_last_matching_request_loc( |
| ovm_urm_override_request req |
| ); |
| for (int i=m_override_requests.size()-1; i >= 0 ; i--) |
| if (m_override_requests[i].compare(req)) return(i); |
| return(-1); |
| endfunction |
| |
| function void ovm_urm_report_server::m_apply_override_requests(ovm_urm_message msg); |
| for (int i=0; i < m_override_requests.size(); i++) |
| if (m_override_requests[i].is_applicable_to_message(msg)) |
| m_override_requests[i].apply_override(msg); |
| endfunction |
| |
| |