UVM使用雙頂層的用法

在UVM中,我們一般都是使用單頂層的模式。也就是隻有一個uvm_test_top頂層,然後下面有env,env下面有agent等。如下圖所示:

通過uvm_top.print_topology()函數,可以打印uvm的拓撲結構。比如如下我的一個uvm環境,打印的拓撲結構如下:

如果我有另外一個uvm環境,那麼怎麼可以簡單的,將兩個uvm環境給集成到一起,進行整體驗證了?

此時,就要用到uvm的雙頂層結構。

一、uvm雙頂層實現

其實uvm,並沒有限定uvm_top下,只能有一個葉子節點,也就是uvm_test,也可以有多個葉子節點,也就是多個uvm_test。只不過,兩個字節點的名字,都不能叫做uvm_test_top。

如果兩個字節點的名字,是一樣的,比如都叫uvm_test_top,那麼仿真的時候會報錯:

使用2個uvm_test頂層,結構如下:

如上圖,有2個uvm_test頂層,一個uvm_test頂層名字叫做uvm_test_top,另外一個uvm_test頂層名字叫做uvm_test_top1。

這樣的話,每個uvm_test下面,可以有自己的uvm環境。使用這種方式,就可以很容易的將兩個,或者多個uvm環境,給集成到一起。

下面說一下,如何進行集成:

比如有另外一個uvm環境,叫做your uvm,那麼首先要將這個uvm環境,封裝成一個module的頂層wrapper,這樣其他uvm環境使用這個uvm環境的時候,只需要例化這個頂層wrapper到他的環境即可。

如下圖所示,將your uvm環境需要的RTL信號,定義在module的端口信號列表中,內部在連接到your uvm環境的interface中。

module test_bfm_top(clk,rstn,opcode);
    input clk;
    input rstn;
    input [8:0] opcode;
     
    test_bfm_if test_bfm_intf();
    assign test_bfm_intf.clk = clk;
    assign test_bfm_intf.rstn = rstn;
    assign test_bfm_intf.opcode = opcode;

下面就是關鍵的代碼了:

initial begin
    uvm_config_db#(virtual test_bfm_if)::set(uvm_root::get(),"*","test_bfm_vif",test_bfm_intf);
    `ifndef USER_RUN
        run_test("test_bfm_base_test");
    `else
        begin
            string testname = "test_bfm_base_test";
            `ifdef UVM_1_1
                uvm_factory fact = uvm_factory::get();
            `else
                uvm_coreservice_t coreservice = uvm_coreservice_t::get();
                uvm_factory fact = coreservice.get_factory();
            `endif
            if($value$plusargs("+UVM_YOUR_TESTNAME",testname))
                $display("found your testname: %s" testname);
            else
                $display("use default testname:test_bfm_base_teset");
            fact.create_component_by_name(testname,"","bfm_test_top",uvm_top);                                                                            
            $display("init_test_bfm_teset:Root has %d children",uvm_top.get_num_children());
        end
    `endif
end

首先使用uvm_config_db機制,將interface,傳遞給your uvm環境中,需要使用的interface的component中去。

增加了USER_RUN這個宏,用來判斷,your uvm環境,是單獨運行,還是要放到其他的uvm環境中運行。

如果是單獨運行,那麼直接調用run_test函數,即可啓動your uvm環境。

如果是放到其他的uvm環境中運行,那麼就不能調用run_test,因爲在uvm環境中,run_test不能調用2次。此時,需要自己將your uvm環境中的uvm_test,手動創建一個實例,然後給掛到uvm_top下。

關鍵的代碼就在fact.create_component_by_name這行代碼。使用factory的創建component實例機制,根據傳入的testname,創建一個命名爲bfm_test_top的實例,,並指定父節點爲uvm_top。這樣創建後,在uvm_top下,就會多一個bfm_test_top這個子節點,這樣整個uvm環境,就多了一個uvm_test頂層。

爲了讓bfm_test_top這個uvm_test頂層,能夠通過仿真參數,動態的修改需要跑的testcase,增加了+UVM_YOUR_TESTNAME這個仿真參數,來指定。

在頂層,直接將your uvm環境封裝的頂層wrapper例化,然後將模塊的端口信號連接一下即可。這樣就完成了2個UVM環境的集成。

module tb_top();
    reg clk;
    reg rstn;
    hw_wrapper u_hw_wrapper(
        .clk(clk),
        .rstn(rstn)
    );
    initial begin
        clk = 1'b0;
        forever #10 clk = ~clk;
    end
    initial begin
        rstn = 1'n0;
        repeat(100) @(posedge clk);
        rstn = 1'b1;
    end
    // my uvm test
    initial begin
        uvm_config_db#(virtual sync_if)::set(uvm_root::get(),
                                             "*",
                                             "sync_intf",
            tb_top.u_hw_wrapper.sync_intf);
    end
    // your uvm test
    wire [8:0] opcode = u_hw_wrapper.opcode;
    test_bfm_top u_test_bfm_top(clk,rstn,opcode);
endmodule

當然,在編譯的時候,要加入+define+USER_RUN這個宏。

通過uvm_top.print_topology()函數,可以打印此時uvm的拓撲結構:

從打印可以看出,此時UVM環境,有2個uvm test頂層,每個頂層下面有自己的uvm環境。

通過以上的方式,就將2個uvm環境,給集成到了一個uvm環境中,並且可以通過仿真參數,+UVM_TESTNAME和+UVM_YOUR_TESTNAME,分別指定2個UVM環境,仿真需要跑的testcase。

二、雙頂層的好處

以上只是一個簡單的例子,來說明,在怎麼將2個uvm環境給集成到一起,那麼雙頂層有什麼好處了?

我認爲,好處是可以增強uvm環境的複用性。在模塊級別,搭建uvm環境驗證,當模塊層次上升,到ip級,那麼這個uvm環境依然還是可以用。從ip級到top級,這個uvm環境依然可以使用。

下面舉個例子來說明下。比如對於一個IP,分成2個模塊A和B。數據流程從A到B。

模塊A交由驗證甲負責,模塊B交由驗證乙來負責。

在驗證開始,驗證甲搭建uvm環境,驗證模塊A。驗證乙搭建uvm驗證,驗證模塊B。

當驗證甲和驗證乙,分別驗證完畢後,此時要進行IP級別的驗證,那麼此時IP集成的驗證,就可以使用上面的雙頂層方式,將模塊A的uvm驗證環境和模塊B的uvm驗證環境給集成到一起,進行IP級的驗證,這樣就實現了UVM環境的複用。

當然在這種情況下,需要將模塊B驗證環境中的uvm_driver給去掉,因爲輸入是來源於模塊A,但是monitor以及scoreboar等都是可以複用的。

當IP驗證完畢後,需要集成到top進行驗證,那top也可以複用這個IP的uvm驗證環境。

所以說,雙頂層或者多頂層,能夠提高uvm環境的複用性。讓頂層驗證,變得容易。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章