uvm的factory機制,通過實例一個static類型default factory,並且通過宏將所有例化extend出來的object,component
register到該factory的內部變量中;所以有了可以override的條件;
register通過注冊一個proxy,該proxy是一個參數化的class,實現對被代理class的create;

uvm_component_registry,是對uvm_component的proxy基類,目標component通過定義一個參數化的extend class,來將所有的component各自代理;
type_id表示新的自己的proxy class的類型;被包含在目標component中;
參數化的uvm_component_registry中,實現了幾個static function:
1)get function,拿到某個registry的static實例;
2)create function,調用factory的create方法,比class自己內部實現強大一些,可以實現override功能;
3)create_component function,實現component new的具體函數;被factory調用;
uvm_object_registry與uvm_component_registry類似;但是create_component變為了create_object;
其中都定義了兩個override的static function,任何component或者object都可以通過type_id來進行調用;
1)set_type_override;
2)set_inst_override;
uvm_factory,主要是對內部的幾個queue進行變量的搜索以及更新,調用registry的create_xx進行object的new;

變量var:m_types,m_type_names,分別是對registry后的對象的name和object的保存queue;
m_type_override,保存通過方法set_type_override_by_type/name添加的信息;
m_inst_override_queues,保存通過方法set_inst_override_by_type添加的信息,
和部分inst_override_by_name添加的信息;
m_wildcard_override_queues,保存通過方法inst_override_by_name添加的name中有通配符"*","?"的name;
當然name也是沒有進行registry的;original name有通配符;
m_inst_override_name_queues,保存通過方法inst_override_by_name添加的不進行register的name的信息;
也不包含通配符;用處沒看到
m_override_info,保存當前迭代override時的,各個override信息,防止死鎖。
function:set_xx_override,多次override時,是否要進行replace,需要最后一個參數bit為0,進行指定。
create_object_by_xx,這是object調用的;自動進行override的搜索;
create_component_by_xx,這是component調用的,自動進行override的搜索;
find_override_by_xx,一般是內部調用,也可以外部使用;
find函數,先查找inst類型的override,在查找具體的type_override;
這些function,都不是static類型的,因為factory本身是static,任何class都可以拿到,繼而調用這些function;
所以也不需要設計為static類型;
factory還有一個最重要的function;register,該funtion在registry調用create函數的時候,自動調用;
register函數,會對內部的m_wildcard_inst_override和m_inst_override_name_queue進行檢查,
如果新注冊的object的name在這兩個queue中,會刪除相應的queue,而添加到m_inst_override queue中;
macros:object和component的宏是不一樣的,因為所調用的proxy是不同的,一個component_registry,另一個object_registry;
object部分的macros:1)uvm_object_utils;調用begin,,,,end塊的宏;
2)uvm_object_param_utils;調用begin,,,,end塊的宏;
3)uvm_object_utils_begin;1)進行type_id的聲明;
2)實現function,get_type()和get_object_type;
3)實現create函數,調用new函數,object必須聲明此函數;
4)實現get_type_name函數,
5)調用field_automation的宏;
4)uvm_object_param_utils_begin;相比較與uvm_object_utils_begin,只是缺少get_type_name的宏;
因為參數化的class,name是不確定的;
5)uvm_object_utils_end;
component部分的macros:1)uvm_component_utils;1)進行type_id的聲明;
2)實現function,get_type()和get_object_type;
3)實現get_type_name函數;
2)uvm_component_param_utils;只是實現register,不實現get_type_name;
3)uvm_component_utils_begin;調用component_utils和field_automation宏;
4)uvm_component_param_utils_begin:調用param_utils和field_automation宏;
5)uvm_component_utils_end;
使用中object調用override有兩種方式,一般在top上進行override;
1)在component或者object內部通過type_id調用;
2)通過factory來進行調用;

component,可以直接在函數中調用;component內部也有該函數的定義,間接調用的factory;一般在top上進行override;

使用factory 產生object,可以使用type_id或者factory本身的create_object/component命令;
