00001 // $Id: urm__message_8sv-source.html,v 1.1 2008/10/07 21:54:49 alex.marin Exp $ 00002 //---------------------------------------------------------------------- 00003 // Copyright 2007-2008 Mentor Graphics Corporation 00004 // Copyright 2007-2008 Cadence Design Systems, Inc. 00005 // All Rights Reserved Worldwide 00006 // 00007 // Licensed under the Apache License, Version 2.0 (the 00008 // "License"); you may not use this file except in 00009 // compliance with the License. You may obtain a copy of 00010 // the License at 00011 // 00012 // http://www.apache.org/licenses/LICENSE-2.0 00013 // 00014 // Unless required by applicable law or agreed to in 00015 // writing, software distributed under the License is 00016 // distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR 00017 // CONDITIONS OF ANY KIND, either express or implied. See 00018 // the License for the specific language governing 00019 // permissions and limitations under the License. 00020 //---------------------------------------------------------------------- 00021 00022 00023 `include "compatibility/urm_message.svh" 00024 00025 00026 // Utility Functions 00027 00028 00029 function string m_urm_mask_worker(int multi_i, string multi_s, int mask, string text); 00030 if ( multi_i & mask ) begin 00031 if ( multi_s == "" ) begin m_urm_mask_worker = text; end 00032 else begin m_urm_mask_worker = { multi_s, "|", text }; end 00033 end 00034 else begin m_urm_mask_worker = multi_s; end 00035 endfunction 00036 00037 function string m_urm_msg_style_string(int style_i); 00038 string style_s; 00039 case (style_i) 00040 OVM_URM_STYLE_NONE: begin style_s = "NO_STYLE"; end 00041 OVM_URM_LONG: begin style_s = "LONG"; end 00042 OVM_URM_RAW: begin style_s = "RAW"; end 00043 OVM_URM_SHORT: begin style_s = "SHORT"; end 00044 default: begin 00045 style_s = ""; 00046 style_s = m_urm_mask_worker(style_i,style_s,OVM_URM_STYLE_FILE,"FILE"); 00047 style_s = m_urm_mask_worker(style_i,style_s,OVM_URM_STYLE_HIERARCHY,"HIERARCHY"); 00048 style_s = m_urm_mask_worker(style_i,style_s,OVM_URM_STYLE_LINE,"LINE"); 00049 style_s = m_urm_mask_worker(style_i,style_s,OVM_URM_STYLE_MESSAGE_TEXT,"MESSAGE_TEXT"); 00050 style_s = m_urm_mask_worker(style_i,style_s,OVM_URM_STYLE_SCOPE,"SCOPE"); 00051 style_s = m_urm_mask_worker(style_i,style_s,OVM_URM_STYLE_SEVERITY,"SEVERITY"); 00052 style_s = m_urm_mask_worker(style_i,style_s,OVM_URM_STYLE_TAG,"TAG"); 00053 style_s = m_urm_mask_worker(style_i,style_s,OVM_URM_STYLE_TIME,"TIME"); 00054 style_s = m_urm_mask_worker(style_i,style_s,OVM_URM_STYLE_UNIT,"UNIT"); 00055 style_s = m_urm_mask_worker(style_i,style_s,OVM_URM_STYLE_VERBOSITY,"VERBOSITY"); 00056 end 00057 endcase 00058 return style_s; 00059 endfunction 00060 00061 function string m_urm_destination_string(int destination_i); 00062 string destination_s; 00063 $swrite(destination_s,"%0h",destination_i); 00064 return destination_s; 00065 endfunction 00066 00067 function string m_urm_severity_string(int severity_i); 00068 string severity_s; 00069 case (severity_i) 00070 OVM_INFO: begin severity_s = ovm_urm_message_format::info_text; end 00071 OVM_WARNING: begin severity_s = ovm_urm_message_format::warning_text; end 00072 OVM_ERROR: begin severity_s = ovm_urm_message_format::error_text; end 00073 OVM_FATAL: begin severity_s = ovm_urm_message_format::fatal_text; end 00074 default: begin 00075 $swrite(severity_s,"%s%0d",ovm_urm_message_format::info_text,severity_i); 00076 end 00077 endcase 00078 return severity_s; 00079 endfunction 00080 00081 // I, W, E, F -- used by URM formatter 00082 function string m_urm_severity_S(int severity_i); 00083 case (severity_i) 00084 OVM_WARNING: begin m_urm_severity_S = "W"; end 00085 OVM_ERROR: begin m_urm_severity_S = "E"; end 00086 OVM_FATAL: begin m_urm_severity_S = "F"; end 00087 default: begin m_urm_severity_S = "I"; end 00088 endcase 00089 endfunction 00090 00091 // Info, Warning, Error, Fatal, used for DUT messages 00092 function string m_urm_severity_Severity(int severity_i); 00093 string severity_s; 00094 case (severity_i) 00095 OVM_WARNING: begin severity_s = "Warning"; end 00096 OVM_ERROR: begin severity_s = "Error"; end 00097 OVM_FATAL: begin severity_s = "Fatal"; end 00098 default: begin severity_s = "Info"; end 00099 endcase 00100 return severity_s; 00101 endfunction 00102 00103 // info, warning, error, fatal, used for DUT messages 00104 function string m_urm_severity_severity(int severity_i); 00105 string severity_s; 00106 case (severity_i) 00107 OVM_WARNING: begin severity_s = "warning"; end 00108 OVM_ERROR: begin severity_s = "error"; end 00109 OVM_FATAL: begin severity_s = "fatal"; end 00110 default: begin severity_s = "info"; end 00111 endcase 00112 return severity_s; 00113 endfunction 00114 00115 // use when accessing verbosity via get_*verbosity 00116 function string m_urm_verbosity_string(int verbosity_i); 00117 string verbosity_s; 00118 case (verbosity_i) 00119 OVM_NONE: begin verbosity_s = ovm_urm_message_format::none_text; end 00120 OVM_LOW: begin verbosity_s = ovm_urm_message_format::low_text; end 00121 OVM_MEDIUM: begin verbosity_s = ovm_urm_message_format::medium_text; end 00122 OVM_HIGH: begin verbosity_s = ovm_urm_message_format::high_text; end 00123 OVM_FULL: begin verbosity_s = ovm_urm_message_format::full_text; end 00124 default: begin 00125 $swrite(verbosity_s,"%s%0d",ovm_urm_message_format::info_text,verbosity_i); 00126 end 00127 endcase 00128 return verbosity_s; 00129 endfunction 00130 00131 function string m_urm_action_string(int action_i); 00132 string action_s; 00133 action_s = ""; 00134 // special handling for OVM_NO_ACTION 00135 if (action_i == OVM_NO_ACTION) action_s = "NO_ACTION"; 00136 else begin 00137 action_s = m_urm_mask_worker(action_i,action_s,OVM_CALL_HOOK,"CALL_HOOK"); 00138 action_s = m_urm_mask_worker(action_i,action_s,OVM_COUNT,"COUNT"); 00139 action_s = m_urm_mask_worker(action_i,action_s,OVM_DISPLAY,"DISPLAY"); 00140 action_s = m_urm_mask_worker(action_i,action_s,OVM_EXIT,"EXIT"); 00141 action_s = m_urm_mask_worker(action_i,action_s,OVM_LOG,"LOG"); 00142 action_s = m_urm_mask_worker(action_i,action_s,OVM_STOP,"STOP"); 00143 end 00144 return action_s; 00145 endfunction 00146 00147 function string m_urm_actions_string_worker(ovm_report_object h, ovm_severity severity_val); 00148 ovm_report_handler m_rh; m_rh = h.get_report_handler(); 00149 return { 00150 " actions[", m_urm_severity_string(severity_val), "]: ", 00151 m_urm_action_string(m_rh.severity_actions[severity_val]) 00152 }; 00153 endfunction 00154 00155 function string m_urm_actions_string(ovm_report_object h); 00156 string image; 00157 image = { m_urm_actions_string_worker(h,OVM_INFO), "\n" }; 00158 image = { image, m_urm_actions_string_worker(h,OVM_WARNING), "\n" }; 00159 image = { image, m_urm_actions_string_worker(h,OVM_ERROR), "\n" }; 00160 image = { image, m_urm_actions_string_worker(h,OVM_FATAL) }; 00161 return image; 00162 endfunction 00163 00164 00165 //---------------------------------------------------------------------------- 00166 // 00167 // CLASS: ovm_urm_message 00168 // 00169 //---------------------------------------------------------------------------- 00170 00171 00172 function ovm_urm_message::new( 00173 string id, string text, int typ, ovm_severity sev, int verbosity, string hier, 00174 ovm_report_object client, string file, int line, string scope 00175 ); 00176 00177 ovm_component ch; 00178 ovm_report_handler m_rh; 00179 00180 ovm_urm_report_server::init_urm_report_server(); 00181 00182 if ( client == null ) client = _global_reporter; 00183 m_rh = client.get_report_handler(); 00184 00185 if ( typ == OVM_URM_MSG_DUT ) begin 00186 sev = ovm_global_urm_report_server.m_global_severity; 00187 end 00188 00189 if ( typ == OVM_URM_MSG_DEBUG && sev != OVM_INFO ) begin 00190 typ = OVM_URM_MSG_DUT; 00191 end 00192 00193 if ( typ == OVM_URM_MSG_DUT ) begin 00194 verbosity = OVM_NONE; 00195 end 00196 00197 if ( file == "" && line == 0 ) file = "<unknown>"; 00198 00199 if ( scope == "" ) begin 00200 if ( client == _global_reporter ) scope = "__global__"; 00201 else scope = client.get_full_name(); 00202 end 00203 00204 if ( hier == "" ) begin 00205 if ( client == _global_reporter ) hier = scope; 00206 else hier = client.get_full_name(); 00207 end 00208 00209 m_id = id; 00210 m_text = text; 00211 m_type = typ; 00212 m_severity = sev; 00213 m_verbosity = verbosity; 00214 m_max_verbosity = m_rh.m_max_verbosity_level; 00215 m_style = ovm_urm_report_server::get_global_debug_style(); 00216 m_client = client; 00217 m_file = file; 00218 m_line = line; 00219 m_action = m_rh.get_action(sev,id); 00220 m_destination = m_rh.get_file_handle(sev,id); 00221 m_scope = scope; 00222 m_hierarchy = hier; 00223 m_name = client.get_full_name(); 00224 00225 endfunction 00226 00227 00228 //---------------------------------------------------------------------------- 00229 // 00230 // CLASS: ovm_urm_override_request 00231 // 00232 //---------------------------------------------------------------------------- 00233 00234 00235 function ovm_urm_override_request::new(string hierarchy="", 00236 string scope="", 00237 string name="", 00238 string file="", 00239 int line=-1, 00240 string text="", 00241 string tag="", 00242 ovm_urm_override_operator op=null); 00243 match_hierarchy = hierarchy; 00244 match_scope = scope; 00245 match_name = name; 00246 match_file = file; 00247 match_line = line; 00248 match_text = text; 00249 match_tag = tag; 00250 operator = op; 00251 endfunction 00252 00253 00254 function bit ovm_urm_override_request::is_applicable_to_message(ovm_urm_message msg); 00255 // breaking into multiple if-statements instead of one large || 00256 // to stop matching as soon as the first one fails... 00257 if ( !ovm_is_match(match_hierarchy, msg.m_hierarchy) ) 00258 return(0); 00259 else if ( !ovm_is_match(match_scope, msg.m_scope) ) 00260 return(0); 00261 else if ( !ovm_is_match(match_name, msg.m_name) ) 00262 return(0); 00263 else if ( !ovm_is_match(match_text, msg.m_text) ) 00264 return(0); 00265 else if ( !ovm_is_match(match_tag, msg.m_id) ) 00266 return(0); 00267 else if ( !ovm_is_match(match_file, msg.m_file) ) 00268 return(0); 00269 else if ( (match_line != -1) && (match_line != msg.m_line) ) 00270 return(0); 00271 else 00272 return(1); 00273 endfunction 00274 00275 00276 function void ovm_urm_override_request::apply_override(ovm_urm_message msg); 00277 if (operator != null) operator.apply_overrides(msg); 00278 endfunction 00279 00280 00281 function string ovm_urm_override_request::dump_request_details(); 00282 string result; 00283 00284 if (operator == null) return("Invalid request - null operator"); 00285 result = "ovm_message "; 00286 if (match_hierarchy != "*") 00287 result = { result, "-hierarchy \"", match_hierarchy, "\" "}; 00288 00289 if (match_scope != "*") 00290 result = { result, "-scope \"", match_scope, "\" " }; 00291 00292 if (match_name != "*") 00293 result = { result, "-name \"", match_name, "\" " }; 00294 00295 if (match_file != "*") 00296 result = { result, "-file \"", match_file, "\" " }; 00297 00298 if (match_line != -1) 00299 result = { result, "-line ", $psprintf("%0d ", match_line) }; 00300 00301 if (match_text != "*") 00302 result = { result, "-text \"", match_text, "\" "}; 00303 00304 if (match_tag != "*") 00305 result = { result, "-tag \"", match_tag, "\" "}; 00306 00307 result = { result, operator.dump_override_details()}; 00308 return(result); 00309 endfunction 00310 00311 00312 //---------------------------------------------------------------------------- 00313 // 00314 // CLASS: ovm_urm_override_operator 00315 // 00316 //---------------------------------------------------------------------------- 00317 00318 00319 function void ovm_urm_override_operator::apply_overrides(ovm_urm_message msg); 00320 if (m_enable_style) msg.m_style = m_style; 00321 if (m_enable_verbosity) msg.m_max_verbosity = m_verbosity; 00322 if (m_enable_destination) msg.m_destination = m_destination; 00323 00324 if (m_enable_severity) begin 00325 ovm_report_handler m_rh; 00326 ovm_severity adjusted_severity; 00327 m_rh = msg.m_client.get_report_handler(); 00328 msg.m_severity = m_severity; 00329 if ((m_severity >= OVM_INFO) && (m_severity <= OVM_FATAL)) 00330 adjusted_severity = m_severity; 00331 else 00332 adjusted_severity = OVM_INFO; 00333 msg.m_action = m_rh.get_action(adjusted_severity,msg.m_id); 00334 end 00335 00336 if (m_enable_action && (msg.m_severity == m_severity_for_action)) 00337 msg.m_action = m_action; 00338 endfunction 00339 00340 00341 function string ovm_urm_override_operator::dump_override_details(); 00342 string result; 00343 result = ""; 00344 00345 if (m_enable_style) 00346 result = { result, "-set_style ", m_urm_msg_style_string(m_style), " "}; 00347 00348 if (m_enable_verbosity) 00349 result = { result, "-set_verbosity ", m_urm_verbosity_string(m_verbosity), " "}; 00350 00351 if (m_enable_destination) 00352 result = { result, "-set_destination ", $psprintf("%0d", m_destination), " "}; 00353 00354 if (m_enable_severity) 00355 result = { result, "-set_severity ", m_urm_severity_string(m_severity), " "}; 00356 00357 if (m_enable_action) 00358 result = { result, "-severity ", m_urm_severity_string(m_severity_for_action), 00359 " -set_actions ", m_urm_action_string(m_action) }; 00360 00361 return(result); 00362 00363 endfunction 00364 00365 00366 //---------------------------------------------------------------------------- 00367 // 00368 // CLASS: ovm_urm_report_server 00369 // 00370 //---------------------------------------------------------------------------- 00371 00372 00373 function ovm_urm_report_server::new(); 00374 super.new(); 00375 if ( m_initialized != 1 ) begin 00376 m_initialized = 1; 00377 m_global_debug_style = OVM_URM_SHORT; 00378 m_global_hier = ""; 00379 m_global_scope = ""; 00380 m_global_severity = OVM_ERROR; 00381 m_global_default_type = OVM_URM_MSG_DEBUG; 00382 m_global_type = OVM_URM_MSG_DEBUG; 00383 end 00384 endfunction 00385 00386 function void ovm_urm_report_server::report( 00387 ovm_severity s, 00388 string name, 00389 string id, 00390 string mess, 00391 int verbosity_level, 00392 string filename, 00393 int line, 00394 ovm_report_object client 00395 ); 00396 ovm_urm_message message; 00397 00398 message = new( 00399 id, mess, m_global_type, s, verbosity_level, m_global_hier, 00400 client, filename, line, m_global_scope 00401 ); 00402 00403 m_apply_override_requests(message); 00404 00405 // consolidate destination information 00406 if ( ! ( message.m_action & OVM_LOG ) ) message.m_destination = 0; 00407 if ( message.m_action & OVM_DISPLAY ) message.m_destination |= 1; 00408 00409 // if ( ! message.handler.filter(message) ) return; 00410 if ( message.m_verbosity > message.m_max_verbosity ) return; 00411 00412 // update counts 00413 ovm_global_urm_report_server.incr_severity_count(message.m_severity); 00414 ovm_global_urm_report_server.incr_id_count(message.m_id); 00415 00416 if ( message.m_destination != 0 ) begin 00417 00418 case (message.m_type) 00419 00420 OVM_URM_MSG_DEBUG : begin 00421 bit first; 00422 first = 1; 00423 if ( message.m_style & OVM_URM_STYLE_TIME ) begin 00424 first = 0; 00425 $fwrite(message.m_destination,"[%0t]",$time); 00426 end 00427 if ( message.m_style & OVM_URM_STYLE_VERBOSITY ) begin 00428 if ( first ) first = 0; else $write(" "); 00429 $fwrite(message.m_destination,"(%0s)",m_urm_verbosity_string(message.m_verbosity)); 00430 end 00431 if ( message.m_style & OVM_URM_STYLE_SEVERITY ) begin 00432 if ( first ) first = 0; else $write(" "); 00433 $fwrite(message.m_destination,"severity=%0s",m_urm_severity_string(message.m_severity)); 00434 end 00435 if ( message.m_style & OVM_URM_STYLE_TAG ) begin 00436 if ( first ) first = 0; else $write(" "); 00437 $fwrite(message.m_destination,"tag=%0s",message.m_id); 00438 end 00439 if ( message.m_style & OVM_URM_STYLE_SCOPE ) begin 00440 if ( first ) first = 0; else $write(" "); 00441 $fwrite(message.m_destination,"scope=%0s",message.m_scope); 00442 end 00443 if ( message.m_style & OVM_URM_STYLE_HIERARCHY ) begin 00444 if ( first ) first = 0; else $write(" "); 00445 $fwrite(message.m_destination,"hier=%0s",message.m_hierarchy); 00446 end 00447 if ( message.m_style & OVM_URM_STYLE_MESSAGE_TEXT ) begin 00448 if ( ! first ) $fwrite(message.m_destination,": "); 00449 $fdisplay(message.m_destination,"%s",message.m_text); 00450 end 00451 else begin 00452 if ( ! first ) $fdisplay(message.m_destination); 00453 end 00454 first = 1; 00455 if ( ( message.m_style & OVM_URM_STYLE_FILE ) && ( message.m_style & OVM_URM_STYLE_LINE ) ) begin 00456 first = 0; 00457 $fwrite(message.m_destination,"%0s, %0d",message.m_file,message.m_line); 00458 end 00459 else if ( message.m_style & OVM_URM_STYLE_FILE ) begin 00460 first = 0; 00461 $fwrite(message.m_destination,"%0s",message.m_file); 00462 end 00463 else if ( message.m_style & OVM_URM_STYLE_LINE ) begin 00464 first = 0; 00465 $fwrite(message.m_destination,"%0d",message.m_line); 00466 end 00467 if ( ( message.m_style & OVM_URM_STYLE_UNIT ) ) begin 00468 ovm_component ch; 00469 if ( $cast(ch,message.m_client) ) begin 00470 if ( first ) first = 0; else $fwrite(message.m_destination," "); 00471 $fwrite(message.m_destination,"%0s",ch.get_full_name()); 00472 end 00473 end 00474 if ( ! first ) $fdisplay(message.m_destination); 00475 end 00476 00477 OVM_URM_MSG_DUT : begin 00478 $fdisplay( 00479 message.m_destination, 00480 "*** OVM: DUT %s at time %0t\nChecked at line %0d in %s\nIn %s", 00481 m_urm_severity_severity(message.m_severity), 00482 $time, message.m_line, message.m_file, 00483 message.m_hierarchy 00484 ); 00485 $fdisplay(message.m_destination,"%s",message.m_text); 00486 if ( message.m_action & (OVM_EXIT|OVM_STOP) ) begin 00487 ovm_report_handler m_rh; 00488 m_rh = message.m_client.get_report_handler(); 00489 $fdisplay( 00490 message.m_destination, 00491 "Will stop execution immediately (check effect is %0s)", 00492 m_rh.format_action(message.m_action) 00493 ); 00494 end 00495 $fdisplay( 00496 message.m_destination, 00497 "*** %0s: A DUT %0s has occurred\n", 00498 m_urm_severity_Severity(message.m_severity), 00499 m_urm_severity_severity(message.m_severity) 00500 ); 00501 end 00502 00503 OVM_URM_MSG_TOOL : begin 00504 $fwrite( 00505 message.m_destination, 00506 "ovm: *%s,%s (%s,%0d): ", 00507 m_urm_severity_S(message.m_severity), message.m_id, 00508 message.m_file, message.m_line 00509 ); 00510 $fdisplay(message.m_destination,"%s",message.m_text); 00511 end 00512 00513 OVM_URM_MSG_OVM : begin 00514 string image; 00515 image = ovm_global_urm_report_server.compose_message( 00516 message.m_severity, message.m_name, message.m_id, 00517 message.m_text, message.m_file, message.m_line 00518 ); 00519 $fdisplay(message.m_destination,"%s",image); 00520 end 00521 00522 endcase 00523 00524 end 00525 00526 if ( message.m_action & OVM_COUNT ) begin 00527 if ( ovm_global_urm_report_server.get_max_quit_count() != 0 ) begin 00528 ovm_global_urm_report_server.incr_quit_count(); 00529 if ( ovm_global_urm_report_server.is_quit_count_reached() ) begin 00530 $display("** ERROR LIMIT REACHED **"); 00531 message.m_action |= OVM_EXIT; 00532 end 00533 end 00534 end 00535 00536 if ( message.m_action & OVM_EXIT ) message.m_client.die(); 00537 00538 if ( message.m_action & OVM_STOP ) $stop; 00539 00540 endfunction 00541 00542 function int ovm_urm_report_server::get_global_max_quit_count(); 00543 ovm_urm_report_server::init_urm_report_server(); 00544 return ovm_global_urm_report_server.get_max_quit_count(); 00545 endfunction 00546 00547 function void ovm_urm_report_server::set_global_max_quit_count(int value); 00548 ovm_urm_report_server::init_urm_report_server(); 00549 ovm_global_urm_report_server.set_max_quit_count(value); 00550 endfunction 00551 00552 function int ovm_urm_report_server::get_global_debug_style(); 00553 ovm_urm_report_server::init_urm_report_server(); 00554 return ovm_global_urm_report_server.m_global_debug_style; 00555 endfunction 00556 00557 function void ovm_urm_report_server::set_global_debug_style(int value); 00558 ovm_urm_report_server::init_urm_report_server(); 00559 ovm_global_urm_report_server.m_global_debug_style = value; 00560 endfunction 00561 00562 function void ovm_urm_report_server::set_message_debug_style( 00563 string hierarchy, // wildcard for message hierarchy, default "*" 00564 string scope, // wildcard for message scope, default "*" 00565 string name, // wildcard for message name, default "*" 00566 string file, // wildcard for file name, default "*" 00567 int line, // wildcard for line number, default -1 (matches all) 00568 string text, // wildcard for message text, default "*" 00569 string tag, // wildcard for message tag, default "*" 00570 bit remove, // FALSE --> add rule, TRUE --> remove it 00571 int value 00572 ); 00573 ovm_urm_override_operator op; 00574 ovm_urm_override_request new_req; 00575 op = new; 00576 if (! op.set_style(value)) return; 00577 new_req = new(hierarchy, scope, name, file, line, text, tag, op); 00578 m_handle_new_request(new_req, remove); 00579 endfunction 00580 00581 function int ovm_urm_report_server::get_global_verbosity(); 00582 ovm_report_handler m_rh; 00583 ovm_urm_report_server::init_urm_report_server(); 00584 m_rh = _global_reporter.get_report_handler(); 00585 return m_rh.m_max_verbosity_level; 00586 endfunction 00587 00588 function void ovm_urm_report_server::set_global_verbosity(int value); 00589 ovm_report_handler m_rh; 00590 ovm_urm_report_server::init_urm_report_server(); 00591 m_rh = _global_reporter.get_report_handler(); 00592 m_rh.m_max_verbosity_level = value; 00593 endfunction 00594 00595 function void ovm_urm_report_server::set_message_verbosity( 00596 string hierarchy, // wildcard for message hierarchy, default "*" 00597 string scope, // wildcard for message scope, default "*" 00598 string name, // wildcard for message name, default "*" 00599 string file, // wildcard for file name, default "*" 00600 int line, // wildcard for line number, default -1 (matches all) 00601 string text, // wildcard for message text, default "*" 00602 string tag, // wildcard for message tag, default "*" 00603 bit remove, // FALSE --> add rule, TRUE --> remove it 00604 int value 00605 ); 00606 ovm_urm_override_operator op; 00607 ovm_urm_override_request new_req; 00608 op = new; 00609 if (! op.set_verbosity(value)) return; 00610 // verbosity is applied by default to messages with a "DEBUG" tag 00611 if (tag == "*") tag = "DEBUG"; 00612 new_req = new(hierarchy, scope, name, file, line, text, tag, op); 00613 m_handle_new_request(new_req, remove); 00614 endfunction 00615 00616 function int ovm_urm_report_server::get_global_destination(); 00617 ovm_report_handler m_rh; 00618 ovm_urm_report_server::init_urm_report_server(); 00619 m_rh = _global_reporter.get_report_handler(); 00620 return m_rh.default_file_handle; 00621 endfunction 00622 00623 function void ovm_urm_report_server::set_global_destination(int value); 00624 ovm_report_handler m_rh; 00625 ovm_urm_report_server::init_urm_report_server(); 00626 m_rh = _global_reporter.get_report_handler(); 00627 `ifdef OVM_AVOID_SFORMATF 00628 `urm_static_warning(("Changing destination on messages is not supported in this version of URM")) 00629 `else 00630 m_rh.default_file_handle = value; 00631 `endif 00632 endfunction 00633 00634 function void ovm_urm_report_server::set_message_destination( 00635 string hierarchy, // wildcard for message hierarchy, default "*" 00636 string scope, // wildcard for message scope, default "*" 00637 string name, // wildcard for message name, default "*" 00638 string file, // wildcard for file name, default "*" 00639 int line, // wildcard for line number, default -1 (matches all) 00640 string text, // wildcard for message text, default "*" 00641 string tag, // wildcard for message tag, default "*" 00642 bit remove, // FALSE --> add rule, TRUE --> remove it 00643 int value 00644 ); 00645 ovm_urm_override_operator op; 00646 ovm_urm_override_request new_req; 00647 `ifdef OVM_AVOID_SFORMATF 00648 if ( remove ) 00649 `urm_warning(("Cannot find a matching rule to remove. Ignoring.")) 00650 else 00651 `urm_warning(("Changing destination on messages is not supported in this version of URM")) 00652 `else 00653 op = new; 00654 if (! op.set_destination(value)) return; 00655 new_req = new(hierarchy, scope, name, file, line, text, tag, op); 00656 m_handle_new_request(new_req, remove); 00657 `endif 00658 endfunction 00659 00660 function ovm_severity ovm_urm_report_server::get_global_severity(); 00661 ovm_urm_report_server::init_urm_report_server(); 00662 return ovm_global_urm_report_server.m_global_severity; 00663 endfunction 00664 00665 function void ovm_urm_report_server::set_global_severity(ovm_severity value); 00666 ovm_urm_report_server::init_urm_report_server(); 00667 ovm_global_urm_report_server.m_global_severity = value; 00668 endfunction 00669 00670 function void ovm_urm_report_server::set_message_severity( 00671 string hierarchy, // wildcard for message hierarchy, default "*" 00672 string scope, // wildcard for message scope, default "*" 00673 string name, // wildcard for message name, default "*" 00674 string file, // wildcard for file name, default "*" 00675 int line, // wildcard for line number, default -1 (matches all) 00676 string text, // wildcard for message text, default "*" 00677 string tag, // wildcard for message tag, default "*" 00678 bit remove, // FALSE --> add rule, TRUE --> remove it 00679 ovm_severity value 00680 ); 00681 ovm_urm_override_operator op; 00682 ovm_urm_override_request new_req; 00683 op = new; 00684 if (! op.set_severity(value)) return; 00685 // severity is applied by default to messages with a "DUT" tag 00686 if (tag == "*") tag = "DUT"; 00687 new_req = new(hierarchy, scope, name, file, line, text, tag, op); 00688 m_handle_new_request(new_req, remove); 00689 endfunction 00690 00691 function int ovm_urm_report_server::get_global_actions(ovm_severity sev); 00692 ovm_report_handler m_rh; 00693 ovm_urm_report_server::init_urm_report_server(); 00694 m_rh = _global_reporter.get_report_handler(); 00695 return m_rh.severity_actions[sev]; 00696 endfunction 00697 00698 function void ovm_urm_report_server::set_global_actions(ovm_severity sev, int value); 00699 ovm_report_handler m_rh; 00700 ovm_urm_report_server::init_urm_report_server(); 00701 m_rh = _global_reporter.get_report_handler(); 00702 m_rh.severity_actions[sev] = value; 00703 endfunction 00704 00705 function void ovm_urm_report_server::set_message_actions( 00706 string hierarchy, // wildcard for message hierarchy, default "*" 00707 string scope, // wildcard for message scope, default "*" 00708 string name, // wildcard for message name, default "*" 00709 string file, // wildcard for file name, default "*" 00710 int line, // wildcard for line number, default -1 (matches all) 00711 string text, // wildcard for message text, default "*" 00712 string tag, // wildcard for message tag, default "*" 00713 bit remove, // FALSE --> add rule, TRUE --> remove it 00714 ovm_severity severity_val, 00715 int value 00716 ); 00717 ovm_urm_override_operator op; 00718 ovm_urm_override_request new_req; 00719 op = new; 00720 if (! op.set_action(severity_val, value)) return; 00721 new_req = new(hierarchy, scope, name, file, line, text, tag, op); 00722 m_handle_new_request(new_req, remove); 00723 endfunction 00724 00725 function void ovm_urm_report_server::init_urm_report_server(); 00726 if ( ovm_global_urm_report_server == null ) begin 00727 ovm_report_handler m_rh; 00728 ovm_report_global_server glob; 00729 ovm_global_urm_report_server = new; 00730 glob = new; 00731 glob.set_server(ovm_global_urm_report_server); 00732 m_rh = _global_reporter.get_report_handler(); 00733 m_rh.m_max_verbosity_level = OVM_LOW; 00734 m_rh.set_severity_action(OVM_INFO,OVM_DISPLAY); 00735 m_rh.set_severity_action(OVM_WARNING,OVM_DISPLAY); 00736 m_rh.set_severity_action(OVM_ERROR,OVM_COUNT|OVM_DISPLAY|OVM_EXIT); 00737 m_rh.set_severity_action(OVM_FATAL,OVM_COUNT|OVM_DISPLAY|OVM_EXIT); 00738 end 00739 endfunction 00740 00741 function void ovm_urm_report_server::set_default_report_type(int value); 00742 ovm_urm_report_server::init_urm_report_server(); 00743 ovm_global_urm_report_server.m_global_default_type = value; 00744 ovm_global_urm_report_server.m_global_type = value; 00745 endfunction 00746 00747 function bit ovm_urm_report_server::m_message_header(ovm_urm_message message); 00748 m_apply_override_requests(message); 00749 // consolidate destination information 00750 if ( ! ( message.m_action & OVM_LOG ) ) message.m_destination = 0; 00751 if ( message.m_action & OVM_DISPLAY ) message.m_destination |= 1; 00752 // return message.handler.filter(message); 00753 return message.m_verbosity <= message.m_max_verbosity; 00754 endfunction 00755 00756 function bit ovm_urm_report_server::m_message_subheader(ovm_urm_message message); 00757 00758 // update counts 00759 ovm_global_urm_report_server.incr_severity_count(message.m_severity); 00760 ovm_global_urm_report_server.incr_id_count(message.m_id); 00761 00762 if ( message.m_destination == 0 ) return 0; 00763 00764 case (message.m_type) 00765 00766 OVM_URM_MSG_DEBUG : begin 00767 bit first; 00768 first = 1; 00769 if ( message.m_style & OVM_URM_STYLE_TIME ) begin 00770 first = 0; 00771 $write("[%0t]",$time); 00772 end 00773 if ( message.m_style & OVM_URM_STYLE_VERBOSITY ) begin 00774 if ( first ) first = 0; else $write(" "); 00775 $write("(%0s)",m_urm_verbosity_string(message.m_verbosity)); 00776 end 00777 if ( message.m_style & OVM_URM_STYLE_SEVERITY ) begin 00778 if ( first ) first = 0; else $write(" "); 00779 $write("severity=%0s",m_urm_severity_string(message.m_severity)); 00780 end 00781 if ( message.m_style & OVM_URM_STYLE_TAG ) begin 00782 if ( first ) first = 0; else $write(" "); 00783 $write("tag=%0s",message.m_id); 00784 end 00785 if ( message.m_style & OVM_URM_STYLE_SCOPE ) begin 00786 if ( first ) first = 0; else $write(" "); 00787 $write("scope=%0s",message.m_scope); 00788 end 00789 if ( message.m_style & OVM_URM_STYLE_HIERARCHY ) begin 00790 if ( first ) first = 0; else $write(" "); 00791 $write("hier=%0s",message.m_hierarchy); 00792 end 00793 if ( message.m_style & OVM_URM_STYLE_MESSAGE_TEXT ) begin 00794 if ( ! first ) $write(": "); 00795 return 1; 00796 end 00797 else begin 00798 if ( ! first ) $display; 00799 return 0; 00800 end 00801 end 00802 00803 OVM_URM_MSG_DUT : begin 00804 $display( 00805 "\n*** OVM: DUT %s at time %0t\n Checked at line %0d in %s\n In %s\n", 00806 m_urm_severity_severity(message.m_severity), 00807 $time, message.m_line, message.m_file, 00808 message.m_hierarchy 00809 ); 00810 end 00811 00812 OVM_URM_MSG_TOOL : begin 00813 $write( 00814 "ovm: *%s,%s (%s,%0d): ", 00815 m_urm_severity_S(message.m_severity), message.m_id, 00816 message.m_file, message.m_line 00817 ); 00818 end 00819 00820 OVM_URM_MSG_OVM : begin 00821 string image; 00822 image = ovm_global_urm_report_server.compose_message( 00823 message.m_severity, message.m_name, message.m_id, 00824 "", message.m_file, message.m_line 00825 ); 00826 $write("%s",image); 00827 end 00828 00829 endcase 00830 00831 return 1; 00832 00833 endfunction 00834 00835 function void ovm_urm_report_server::m_message_footer(ovm_urm_message message); 00836 00837 if ( message.m_destination != 0 ) begin 00838 00839 case (message.m_type) 00840 00841 OVM_URM_MSG_DEBUG : begin 00842 bit first; 00843 first = 1; 00844 if ( ( message.m_style & OVM_URM_STYLE_FILE ) && ( message.m_style & OVM_URM_STYLE_LINE ) ) begin 00845 first = 0; 00846 $write("%0s, %0d",message.m_file,message.m_line); 00847 end 00848 else if ( message.m_style & OVM_URM_STYLE_FILE ) begin 00849 first = 0; 00850 $write("%0s",message.m_file); 00851 end 00852 else if ( message.m_style & OVM_URM_STYLE_LINE ) begin 00853 first = 0; 00854 $write("%0d",message.m_line); 00855 end 00856 if ( ( message.m_style & OVM_URM_STYLE_UNIT ) ) begin 00857 ovm_component ch; 00858 if ( $cast(ch,message.m_client) ) begin 00859 if ( first ) first = 0; else $write(" "); 00860 $write("%0s",ch.get_full_name()); 00861 end 00862 end 00863 if ( ! first ) $display; 00864 end 00865 00866 OVM_URM_MSG_DUT : begin 00867 if ( message.m_action & (OVM_EXIT|OVM_STOP) ) begin 00868 ovm_report_handler m_rh; 00869 m_rh = message.m_client.get_report_handler(); 00870 $display( 00871 "Will stop execution immediately (check effect is %0s)", 00872 m_rh.format_action(message.m_action) 00873 ); 00874 end 00875 $display( 00876 "*** %0s: A DUT %0s has occurred\n", 00877 m_urm_severity_Severity(message.m_severity), 00878 m_urm_severity_severity(message.m_severity) 00879 ); 00880 end 00881 00882 endcase 00883 00884 end 00885 00886 if ( message.m_action & OVM_COUNT ) begin 00887 if ( ovm_global_urm_report_server.get_max_quit_count() != 0 ) begin 00888 ovm_global_urm_report_server.incr_quit_count(); 00889 if ( ovm_global_urm_report_server.is_quit_count_reached() ) begin 00890 $display("** ERROR LIMIT REACHED **"); 00891 message.m_action |= OVM_EXIT; 00892 end 00893 end 00894 end 00895 00896 if ( message.m_action & OVM_EXIT ) message.m_client.die(); 00897 00898 if ( message.m_action & OVM_STOP ) $stop; 00899 00900 endfunction 00901 00902 function void ovm_urm_report_server::m_set_report_hier(string hier); 00903 ovm_urm_report_server::init_urm_report_server(); 00904 ovm_global_urm_report_server.m_global_hier = hier; 00905 endfunction 00906 00907 function void ovm_urm_report_server::m_set_report_scope(string scope); 00908 ovm_urm_report_server::init_urm_report_server(); 00909 ovm_global_urm_report_server.m_global_scope = scope; 00910 endfunction 00911 00912 function void ovm_urm_report_server::m_set_report_type(int typ); 00913 ovm_urm_report_server::init_urm_report_server(); 00914 ovm_global_urm_report_server.m_global_type = typ; 00915 endfunction 00916 00917 function void ovm_urm_report_server::m_reset_report_flags(); 00918 ovm_urm_report_server::init_urm_report_server(); 00919 ovm_global_urm_report_server.m_global_hier = ""; 00920 ovm_global_urm_report_server.m_global_scope = ""; 00921 ovm_global_urm_report_server.m_global_type = ovm_global_urm_report_server.m_global_default_type; 00922 endfunction 00923 00924 function string ovm_urm_report_server::m_dump_global_debug_style(); 00925 int style_e; 00926 style_e = get_global_debug_style(); 00927 return m_urm_msg_style_string(style_e); 00928 endfunction 00929 00930 function string ovm_urm_report_server::m_dump_rules_debug_style(); 00931 string result; 00932 result = ""; 00933 for (int i=0 ; i<m_override_requests.size(); i++) 00934 if (m_override_requests[i].is_style_override()) 00935 result = { result, m_override_requests[i].dump_request_details(), "\n"}; 00936 return (result); 00937 endfunction 00938 00939 function string ovm_urm_report_server::m_dump_global_verbosity(); 00940 int verbosity_i; 00941 verbosity_i = get_global_verbosity(); 00942 return m_urm_verbosity_string(verbosity_i); 00943 endfunction 00944 00945 function string ovm_urm_report_server::m_dump_rules_verbosity(); 00946 string result; 00947 result = ""; 00948 for (int i=0 ; i<m_override_requests.size(); i++) 00949 if (m_override_requests[i].is_verbosity_override()) 00950 result = { result, m_override_requests[i].dump_request_details(), "\n"}; 00951 return (result); 00952 endfunction 00953 00954 function string ovm_urm_report_server::m_dump_global_destination(); 00955 int destination_i; 00956 destination_i = get_global_destination(); 00957 return m_urm_destination_string(destination_i); 00958 endfunction 00959 00960 function string ovm_urm_report_server::m_dump_rules_destination(); 00961 string result; 00962 result = ""; 00963 for (int i=0 ; i<m_override_requests.size(); i++) 00964 if (m_override_requests[i].is_destination_override()) 00965 result = { result, m_override_requests[i].dump_request_details(), "\n"}; 00966 return (result); 00967 endfunction 00968 00969 function string ovm_urm_report_server::m_dump_global_severity(); 00970 int severity_i; 00971 severity_i = get_global_severity(); 00972 return m_urm_severity_string(severity_i); 00973 endfunction 00974 00975 function string ovm_urm_report_server::m_dump_rules_severity(); 00976 string result; 00977 result = ""; 00978 for (int i=0 ; i<m_override_requests.size(); i++) 00979 if (m_override_requests[i].is_severity_override()) 00980 result = { result, m_override_requests[i].dump_request_details(), "\n"}; 00981 return (result); 00982 endfunction 00983 00984 function string ovm_urm_report_server::m_dump_global_actions(); 00985 ovm_urm_report_server::init_urm_report_server(); 00986 return m_urm_actions_string(_global_reporter); 00987 endfunction 00988 00989 function string ovm_urm_report_server::m_dump_rules_actions(); 00990 string result; 00991 result = ""; 00992 for (int i=0 ; i<m_override_requests.size(); i++) 00993 if (m_override_requests[i].is_action_override()) 00994 result = { result, m_override_requests[i].dump_request_details(), "\n"}; 00995 return (result); 00996 endfunction 00997 00998 function void ovm_urm_report_server::m_handle_new_request( 00999 ovm_urm_override_request new_req, bit remove 01000 ); 01001 int existing_req_loc; 01002 `ifdef OVM_AVOID_SFORMATF 01003 if ( new_req.match_text != "*" && ! remove ) begin 01004 `urm_warning(("%s%s", 01005 "Filtering message overrides by message text is not supported ", 01006 "in this version of OVM; this override will be ignored" 01007 )) 01008 return; 01009 end 01010 `endif 01011 existing_req_loc = m_find_last_matching_request_loc(new_req); 01012 if (remove) begin 01013 if (existing_req_loc != -1) 01014 m_override_requests.delete(existing_req_loc); 01015 else 01016 `urm_warning(("Cannot find a matching rule to remove. Ignoring.")) 01017 end 01018 else begin // !remove 01019 if ( (m_override_requests.size() == 0) 01020 || 01021 (existing_req_loc != m_override_requests.size()-1)) 01022 m_override_requests.push_back(new_req); 01023 else 01024 `urm_warning(("Repeating the same command as the last one. Ignoring.")) 01025 end 01026 endfunction 01027 01028 function int ovm_urm_report_server::m_find_last_matching_request_loc( 01029 ovm_urm_override_request req 01030 ); 01031 for (int i=m_override_requests.size()-1; i >= 0 ; i--) 01032 if (m_override_requests[i].compare(req)) return(i); 01033 return(-1); 01034 endfunction 01035 01036 function void ovm_urm_report_server::m_apply_override_requests(ovm_urm_message msg); 01037 for (int i=0; i < m_override_requests.size(); i++) 01038 if (m_override_requests[i].is_applicable_to_message(msg)) 01039 m_override_requests[i].apply_override(msg); 01040 endfunction 01041 01042
![]() Intelligent Design Verification Project: OVM, Revision: 1.1.0 |
Copyright (c) 2008 Intelligent Design Verification. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included here: http://www.intelligentdv.com/licenses/fdl.txt |
![]() Doxygen Version: 1.4.6 Mon Sep 29 14:20:13 2008 |