1. factory機制重載的前提
(1) 無論是重載的類(extended class)還是被重載的類(base class),都要在定義時注冊到factory機制中.
(2) 被重載的類(base class)在執行個體化時,需要使用factory機制式的執行個體化方式,而不是傳統的new方式.
(3) 重載的類與被重載的類有派生關系. 重載的類必須派生自被重載的類,被重載的類必須是重載類的父類.
(4) component與object之間互相不能重載(二者new函數的參數也不同).
2. factory機制重載的方式
2.1. 代碼中重載
系統中存在uvm_factory類型的全局變量factory,可以在initial語句中使用如下方式調用:
2.1.1 使用uvm_component内的重載函數
(1) set_type_override_by_type
set_type_override_by_type(uvm_object_wrapper orignial_type, uvm_object_wrapper override_type, bit replace=1)
(2) set_type_override
set_type_override (string original_type_name, string override_type_name, bit replace=1)
(3) set_inst_override_by_type
set_inst_override_by_type(string relative_inst_path, uvm_object_wrapper original_type, uvm_object_wrapper override_type)
(4) set_inst_override
set_inst_override(string relative_inst_path, string original_type_name, string override_type_name)
2.1.2 使用uvm_factory類的重載函數
(1) set_type_override_by_type(uvm_object_wrapper orignial_type, uvm_object_wrapper override_type, bit replace=1)
(2) set_type_override_by_name (string original_type_name, string override_type_name, bit replace=1)
(3) set_inst_override_by_type(uvm_object_wrapper original_type, uvm_object_wrapper override_type, string full_inst_path)
(4) set_inst_override_by_name(string original_type_name, string override_type_name, string full_inst_path)
注:系統中存在uvm_factory類型的全局變量factory,可以在initial語句中使用如下方式調用:
2.2. 指令行中重載
3.factory機制之複雜重載
3.1 連續重載
3.2 替換重載
在有多個重載時,最終重載的類要與最初被重載的類有派生關系. 最終重載的類必須派生自最初被重載的類, 最初被重載的類必須是最終重載類的父類.
4.factory機制之常用重載
4.1. 重載transaction
4.2. 重載sequence
4.3. 重載component
scoreboard與參考模型等都可以重載;尤其對于參考模型而言,處理異常的激勵源是比較耗時的事情; 可能對于一個DUT來說,其80%的代碼都是用于處理異常情況,作為模拟DUT的參考模型來說,更是如此;