What's underneath uvm_config_db

I’m trying to understand the mechanism underneath uvm_config_db and getting a bit confused. I start with set() and get() functions in uvm_config_db. My understanding is that uvm_config_db eventually uses uvm_resource_pool to maintain config information (resources). Uvm_resource_pool contains two associative arrays (rtab and ttab), both maintain queues of resources, one is indexed by name the other is indexed by type. uvm_config_db::set() will update both associative arrays (of queues) and uvm_config_db::get() will lookup rtab (rp.lookup_regex_names->lookup_name) to eventually fetch the resource.

Personally I feel uvm_resource_pool is sufficient to maintain any config info (set/get and other features). But in uvm_config_db, there is another member called m_rsc. It is an associative array of uvm_pool, indexed by uvm_component. m_rsc is updated inside set() but not used anywhere else. It maintains, in my opinion, the same information as rtab and ttab in uvm_resource_pool. Is it absolutely necessary?

Another question is about ttab. Is it necessary for uvm_config_db to function? I can understand it helps if we want to search by type. But I don’t see it is really used in uvm_config_db. It is useful for uvm_resource_db obviously.

My third question is about uvm_resource_db. I heard uvm_config_db is preferred. Should uvm_resource_db be deprecated eventually? Both are doing the same thing. Even though uvm_config_db extended from uvm_resource_db, I don’t feel uvm_resource_db is needed. The only thing uvm_config_db uses from uvm_resource_db is get_by_name, which is simply a wrapper of uvm_resource::get_by_name.

I would appreciate it if anyone can comment on these three questions.