Jump to content


  • Content Count

  • Joined

  • Last visited

  1. My take: Wrapper object to contain a mutex class ral_mutex_t extends uvm_object; `uvm_object_utils(ral_mutex_t) semaphore FrontDoorMutex = new(1); // constructor ... endclass class uvm_reg_mutex extends uvm_reg; `uvm_object_utils(uvm_reg_mutex) ral_mutex_t ral_mutex; function new(string names=""); super.new(names, 32, UVM_NO_COVERAGE); endfunction : new task write( ... ); // if(!uvm_config_db #(ral_mutex_t)::get(null, "", "ral_mutex", ral_mutex)) `uvm_fatal(get_type_name(), "Error fetching ral_mutex") ral_mutex.FrontDoorMutex.get(1); super.write(...); ral_mutex.FrontDoorMutex.put(1); endtask endclass class my_ral_reg extends uvm_reg_mutex; `uvm_object_utils(my_ral_reg) // define fields function new(string names = "register_info"); super.new(names); endfunction virtual function void build(); // build register endfunction endclass Would have been great to have a UVM semaphore pool just like the event pool... but I can live with wrapper objects and SV semaphores.
  2. Unaware of the existence of this thread I ended up with exactly the same "solution" (start override and semaphore) and side effect :-) Have you reached a usable solution? Can you post it here?
  3. Hi, Is there a way to avoid the "complex type usage" error when needing to feed a uvm_object a handle to an uvm_component? What I need to do is access within a sequence a method of one component in the environment. uvm_component: @build_phase uvm_config_db#(comp_type)::set(this, "*", comp_handle_name", this) uvm_sequence: @body: comp_type comp_inst; uvm_config_db #(comp_type)::get(this, "*", "comp_handle_name", comp_inst) comp_inst.my_method();