UVM中的factory機制實現


首先在Systemverilog中便有對於重載的最基本的支持。

1)定義task/function時,使用virtual關鍵字。那之后在test_case中調用時,便使用句柄指向的對象的類型而不是句柄的類型來調用task/function。

   好處:bird為基類,parrot為擴展類。bird類型的句柄可以指向parrot類型的對象,(進而在這種情況下,這個句柄可以直接賦值給parrot句柄)

            當這樣的一個句柄調用bird和parrot都有的task、function時,帶virtual關鍵字的調用parrot的task/function。不帶virtual關鍵字的調用

            bird的task/function。而此時其他的variable的調用,因為句柄是bird類型,所以調用的應該還是基類的數據。這樣便相當於重定義了基類

            中的某些行為。

2)constraint的重載,這個由Systemverilog直接支持,在擴展類中定義了和基類相同的constraint時,由擴展類的句柄調用,擴展類constraint

            直接覆蓋掉基類的constraint。這樣方便於重定義某些不常用的特定的constraint。一般應用在transaction/sequence的重載中。

 

Systemverilog定義好了最基本的重載機制。但是有一個不方便使用的地方是:每次需要重載時,必須都將基類和擴展類進行new,然后在賦值操作。

           這樣的操作過程在UVM這樣的定向可重用,自動化的平台是不被允許的。所以UVM加入了自己的factory進制來實現這一過程。

 

UVM中使用factory機制的限制:

1)不管是base_class還是extended_class,在注冊時,都必須注冊到factory機制中。

            uvm_component_utils(class_name);

            uvm_object_utils(class_name);

2)被重載的類要使用factory進制的實例化方式。

            name = base_class::type_id::create("name");

3)重載的類必須是被重載的類的擴展類,被重載的類必須是基類。

4)UVM中的component和object之間不能重載,盡管component擴展自object。

 

factory主要是根據字符串來創建屬於該字符串的實例。UVM內部維護一個聯合數組global_tab,在用factory進制進行注冊時,便加入一條目,在用

      factory機制進行創建時,根據類名創建實例,再返回。當使用如下所示的函數定義過之后時,UVM會調用另外一系列接口,create_object_by_name等時,

      UVM依然實現根據類名來創建實例,進而返回的實例會是extended的類型。 

本質上是對Systemverilog的new函數進行重載,實現基類句柄,擴展類對象的產生。

 

UVM中factory重載的函數。一般都在new之前調用。

1)component類中的函數:只能在component系的函數中調用。

   set_type_override_by_type(uvm_object_wrapper original_type, uvm_object_wrapper override_type, bit replace = 1);

               uvm_object_wrapper型的參數類型,由xxx::get_type()得到。

    set_inst_override_by_type(string relative_inst_path, uvm_object_wrapper original_type, uvm_object_wrapper override_type);

               set_inst_override_by_type("env.o_agt.mon", my_monitor::get_type(), new_monitor::get_type() );

    set_type_override(string original_type_name, string override_type_name, bit replace = 1);

     set_inst_override(string relative_inst_path, string original_type_name, string override_type_name);

                set_inst_override("env.o_agt.mon", "my_monitor", "new_monitor");

2)uvm_favtory類中的函數,系統存在一個uvm_factory類型的全局變量factory。可以在top_tb的initial語句中使用。

      函數名類似,前加factory調用。

      factory.set_type_override_by_type(bird::get_type(), parrot::get_type());

3)直接加在命令行中command參數中。

可以進行多個連續的重載,重載的類在進行重載。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM