qinhailiang Posted May 31, 2011 Report Share Posted May 31, 2011 The UVM components use the MACRO directives to register themselves. When is the MACROs executed in every components? Quote Link to comment Share on other sites More sharing options...
uwes Posted May 31, 2011 Report Share Posted May 31, 2011 hi, macros are not executed - macros are expanded. lets take a simple example (created with DVT macro expand) `uvm_component_utils_begin(test) `uvm_field_int(cfg_field_set, UVM_DEFAULT) `uvm_field_int(cfg_field_notset, UVM_DEFAULT) `uvm_component_utils_end get finally expanded into a typedef, some functions, a const type name typedef uvm_component_registry #(test,"test") type_id; static function type_id get_type(); return type_id::get(); endfunction virtual function uvm_object_wrapper get_object_type(); return type_id::get(); endfunction const static string type_name = "test"; virtual function string get_type_name (); return type_name; endfunction function void __m_uvm_field_automation (uvm_object tmp_data__, int what__, string str__); begin test local_data__; /* Used for copy and compare */ typedef test ___local_type____; string string_aa_key; /* Used for associative array lookups */ /* Type is verified by uvm_object::compare() */ super.__m_uvm_field_automation(tmp_data__, what__, str__); if(tmp_data__ != null) /* Allow objects in same hierarchy to be copied/compared */ if(!$cast(local_data__, tmp_data__)) return; begin case (what__) UVM_CHECK_FIELDS: begin __m_uvm_status_container.do_field_check("cfg_field_set", this); end UVM_COPY: begin if(local_data__ == null) return; if(!((UVM_DEFAULT)&UVM_NOCOPY)) cfg_field_set = local_data__.cfg_field_set; end UVM_COMPARE: begin if(local_data__ == null) return; if(!((UVM_DEFAULT)&UVM_NOCOMPARE)) begin if(cfg_field_set !== local_data__.cfg_field_set) begin void'(__m_uvm_status_container.comparer.compare_field("cfg_field_set", cfg_field_set, local_data__.cfg_field_set, $bits(cfg_field_set))); if(__m_uvm_status_container.comparer.result && (__m_uvm_status_container.comparer.show_max <= __m_uvm_status_container.comparer.result)) return; end end end UVM_PACK: if(!((UVM_DEFAULT)&UVM_NOPACK)) begin if($bits(cfg_field_set) <= 64) __m_uvm_status_container.packer.pack_field_int(cfg_field_set, $bits(cfg_field_set)); else __m_uvm_status_container.packer.pack_field(cfg_field_set, $bits(cfg_field_set)); end UVM_UNPACK: if(!((UVM_DEFAULT)&UVM_NOPACK)) begin if($bits(cfg_field_set) <= 64) cfg_field_set = __m_uvm_status_container.packer.unpack_field_int($bits(cfg_field_set)); else cfg_field_set = __m_uvm_status_container.packer.unpack_field($bits(cfg_field_set)); end UVM_RECORD: if(!((UVM_DEFAULT)&UVM_NORECORD)) begin __m_uvm_status_container.recorder.record_field("cfg_field_set", cfg_field_set, $bits(cfg_field_set), uvm_radix_enum'((UVM_DEFAULT)&(UVM_RADIX))); end UVM_PRINT: if(!((UVM_DEFAULT)&UVM_NOPRINT)) begin __m_uvm_status_container.printer.print_int("cfg_field_set", cfg_field_set, $bits(cfg_field_set), uvm_radix_enum'((UVM_DEFAULT)&UVM_RADIX)); end UVM_SETINT: begin bit matched; __m_uvm_status_container.scope.set_arg("cfg_field_set"); matched = uvm_is_match(str__, __m_uvm_status_container.scope.get()); if(matched) begin if((UVM_DEFAULT)&UVM_READONLY) begin uvm_report_warning("RDONLY", $sformatf("Readonly argument match %s is ignored", __m_uvm_status_container.get_full_scope_arg()), UVM_NONE); end else begin if (__m_uvm_status_container.print_matches) uvm_report_info("STRMTC", {"set_int()", ": Matched string ", str__, " to field ", __m_uvm_status_container.get_full_scope_arg()}, UVM_LOW); cfg_field_set = uvm_object::__m_uvm_status_container.bitstream; uvm_object::__m_uvm_status_container.status = 1; end end __m_uvm_status_container.scope.unset_arg("cfg_field_set"); end endcase end begin case (what__) UVM_CHECK_FIELDS: begin __m_uvm_status_container.do_field_check("cfg_field_notset", this); end UVM_COPY: begin if(local_data__ == null) return; if(!((UVM_DEFAULT)&UVM_NOCOPY)) cfg_field_notset = local_data__.cfg_field_notset; end UVM_COMPARE: begin if(local_data__ == null) return; if(!((UVM_DEFAULT)&UVM_NOCOMPARE)) begin if(cfg_field_notset !== local_data__.cfg_field_notset) begin void'(__m_uvm_status_container.comparer.compare_field("cfg_field_notset", cfg_field_notset, local_data__.cfg_field_notset, $bits(cfg_field_notset))); if(__m_uvm_status_container.comparer.result && (__m_uvm_status_container.comparer.show_max <= __m_uvm_status_container.comparer.result)) return; end end end UVM_PACK: if(!((UVM_DEFAULT)&UVM_NOPACK)) begin if($bits(cfg_field_notset) <= 64) __m_uvm_status_container.packer.pack_field_int(cfg_field_notset, $bits(cfg_field_notset)); else __m_uvm_status_container.packer.pack_field(cfg_field_notset, $bits(cfg_field_notset)); end UVM_UNPACK: if(!((UVM_DEFAULT)&UVM_NOPACK)) begin if($bits(cfg_field_notset) <= 64) cfg_field_notset = __m_uvm_status_container.packer.unpack_field_int($bits(cfg_field_notset)); else cfg_field_notset = __m_uvm_status_container.packer.unpack_field($bits(cfg_field_notset)); end UVM_RECORD: if(!((UVM_DEFAULT)&UVM_NORECORD)) begin __m_uvm_status_container.recorder.record_field("cfg_field_notset", cfg_field_notset, $bits(cfg_field_notset), uvm_radix_enum'((UVM_DEFAULT)&(UVM_RADIX))); end UVM_PRINT: if(!((UVM_DEFAULT)&UVM_NOPRINT)) begin __m_uvm_status_container.printer.print_int("cfg_field_notset", cfg_field_notset, $bits(cfg_field_notset), uvm_radix_enum'((UVM_DEFAULT)&UVM_RADIX)); end UVM_SETINT: begin bit matched; __m_uvm_status_container.scope.set_arg("cfg_field_notset"); matched = uvm_is_match(str__, __m_uvm_status_container.scope.get()); if(matched) begin if((UVM_DEFAULT)&UVM_READONLY) begin uvm_report_warning("RDONLY", $sformatf("Readonly argument match %s is ignored", __m_uvm_status_container.get_full_scope_arg()), UVM_NONE); end else begin if (__m_uvm_status_container.print_matches) uvm_report_info("STRMTC", {"set_int()", ": Matched string ", str__, " to field ", __m_uvm_status_container.get_full_scope_arg()}, UVM_LOW); cfg_field_notset = uvm_object::__m_uvm_status_container.bitstream; uvm_object::__m_uvm_status_container.status = 1; end end __m_uvm_status_container.scope.unset_arg("cfg_field_notset"); end endcase end end endfunction Quote Link to comment Share on other sites More sharing options...
qinhailiang Posted May 31, 2011 Author Report Share Posted May 31, 2011 when are the codes exectured as follow in uvm_registry.svh: local static this_type me = get(); // Function: get // // Returns the singleton instance of this type. Type-based factory operation // depends on there being a single proxy instance for each registered type. static function this_type get(); if (me == null) begin uvm_factory f = uvm_factory::get(); me = new; f.register(me); end return me; endfunction whether is it or not in line ' typedef uvm_component_registry #(test,"test") type_id; ' ? Quote Link to comment Share on other sites More sharing options...
dave_59 Posted May 31, 2011 Report Share Posted May 31, 2011 Didn't I just answer this question for you here: http://www.uvmworld.org/forums/showthread.php?239-when-is-the-const-uvm_root-uvm_top-uvm_root-get%28%29-executed&p=859&viewfull=1#post859 Quote Link to comment Share on other sites More sharing options...
qinhailiang Posted June 1, 2011 Author Report Share Posted June 1, 2011 thanks for your answer! but 'local static this_type me = get();'is in a class defined by 'typedef uvm_component_registry #(test,"test") type_id'? when is it assigned space? Quote Link to comment Share on other sites More sharing options...
dave_59 Posted June 1, 2011 Report Share Posted June 1, 2011 The specialization of any parametrized class, whether it is a typedef or the declaration of a class variable, creates the space for all static variables once the type exists. There is no need to construct an object of that class type; all the static variables of all class types are initialized at time 0 before any always or initial blocks execute. See section 8.24 of the 1800-2009 LRM Quote Link to comment Share on other sites More sharing options...
qinhailiang Posted June 1, 2011 Author Report Share Posted June 1, 2011 thanks for your reply!! Quote Link to comment Share on other sites More sharing options...
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.