ujjalbose Posted November 28, 2014 Report Posted November 28, 2014 Hi, just wondering if there is a way to delay the quitting of simulation when max_quit_count number of errors occur. For e.g. : >uvm_report_server svr; >virtual function void build_phase(uvm_phase phase); > super.build_phase(phase); > svr = _global_reporter.get_report_server(); > svr.set_max_quit_count(1); >endfunction:build_phase In this example I want to exit after first error occurs, but want to insert some additional delay before actual $finish is called. This helps in debug. But I see that die() inside uvm_report_object.svh (which gets called when max_quit_count errors occur) is a function which calls $finish immediately : >virtual function void die(); > // make the pre_abort callbacks > uvm_root top = uvm_root::get(); > top.m_do_pre_abort(); > report_summarize(); > $finish; >endfunctionSo I am wondering if it is possible to insert some hash delay before quitting in any other way but still using the max_quit_count feature ? -Ujjal Quote
David Black Posted November 28, 2014 Report Posted November 28, 2014 I think you might do better to use a report catcher for this situation. In the report catcher you can simply fork a delayed fatal: class my_report_catcher extends uvm_report_catcher; int unsigned count = 1; // limit time fatal_timeout = 20ns; // amount to delay before exiting function new (string name = ""); super.new(name); endfunction function action_e catch; uvm_severity severity = get_severity(); string id = get_id(); uvm_action action = get_action(); string message = get_message(); int verbosity = get_verbosity(); if (count) --count; if (count == 0 && severity == UVM_ERROR) //< conditions to set fatal timeout begin fork begin // allow extra time #fatal_timeout; `uvm_report_fatal("","Exiting due to count") end join_none throw; end endfunction endclass Caveat emptor: untested. Also need to create/add the catcher at the appropriate location. Quote
ujjalbose Posted December 1, 2014 Author Report Posted December 1, 2014 Thanks David for the suggestion, this worked with some minor modifications ! The modified code along with some small enhancements is as : class my_report_catcher extends uvm_report_catcher; int unsigned count = 1; // limit time fatal_timeout = 200; // amount to delay before exiting function new (string name = ""); super.new(name); endfunction function action_e catch; uvm_severity severity = get_severity(); string id = get_id(); uvm_action action = get_action(); string message = get_message(); int verbosity = get_verbosity(); if (count && severity == UVM_ERROR) begin --count; end if (count == 0 && severity == UVM_ERROR) //< conditions to set fatal timeout begin fork begin // allow extra time #fatal_timeout; //`uvm_report_fatal("","Exiting due to count") uvm_top.report_summarize(); //call end of test report_summarize() $finish; end join_none end return THROW; endfunction endclass Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.