UVM學習筆記--build_phase的執行順序

理解UVM build_phase的執行順序很重要

雖然明白build_phase的執行順序是由上往下,由根節點到葉子節點,但具體細節還是不清楚,如是在同級的所有節點都先創建完成,在開始下一級節點的創建?還是某個節點一下所有節點都創建完,在創建兄弟節點及其子節點呢?

我做了個試驗,在每個component的new函數結尾會打印tag是 [new_call]的信息, 在每個build_phase函數開頭和結尾分別打印tag爲[build_start]和[build_end]的信息。

所要建立的UVM樹結構如下:

建立的UVM樹結構

用VCS運行結果如下:

UVM_INFO @ 0: reporter [RNTST] Running test base_test…
UVM_INFO …/src/test_2_23/my_env.sv(14) @ 0: uvm_test_top.env [new_call] env new is called
UVM_INFO …/src/test_2_23/my_env.sv(19) @ 0: uvm_test_top.env [build_start] env build starting
UVM_INFO …/src/test_2_23/my_model.sv(17) @ 0: uvm_test_top.env.mdl [new_call] model new is called
UVM_INFO …/src/test_2_23/my_agent.sv(11) @ 0: uvm_test_top.env.i_agt [new_call] agent new is called
UVM_INFO …/src/test_2_23/my_agent.sv(11) @ 0: uvm_test_top.env.o_agt [new_call] agent new is called
UVM_INFO …/src/test_2_23/my_scoreboard.sv(15) @ 0: uvm_test_top.env.scb [new_call] scoreboard new is called
UVM_INFO …/src/test_2_23/my_env.sv(32) @ 0: uvm_test_top.env [build_end] env build finished
UVM_INFO …/src/test_2_23/my_agent.sv(21) @ 0: uvm_test_top.env.i_agt [build_start] agent build_phase starting
UVM_INFO …/src/test_2_23/my_driver.sv(9) @ 0: uvm_test_top.env.i_agt.drv [new_call] drive new is called
UVM_INFO …/src/test_2_23/my_monitor.sv(10) @ 0: uvm_test_top.env.i_agt.mon [new_call] monitor new is called
UVM_INFO …/src/test_2_23/my_agent.sv(29) @ 0: uvm_test_top.env.i_agt [build_end] agent build_phase finished
UVM_INFO …/src/test_2_23/my_driver.sv(16) @ 0: uvm_test_top.env.i_agt.drv [build_start] driver build_phase starting
UVM_INFO …/src/test_2_23/my_driver.sv(20) @ 0: uvm_test_top.env.i_agt.drv [build_end] driver build_phase finished
UVM_INFO …/src/test_2_23/my_monitor.sv(14) @ 0: uvm_test_top.env.i_agt.mon [build_start] monitor build_phase starting
UVM_INFO …/src/test_2_23/instA.sv(6) @ 0: uvm_test_top.env.i_agt.mon.isA [new_call] instA new is called
UVM_INFO …/src/test_2_23/my_monitor.sv(21) @ 0: uvm_test_top.env.i_agt.mon [build_end] monitor build finished
UVM_INFO …/src/test_2_23/instA.sv(11) @ 0: uvm_test_top.env.i_agt.mon.isA [build_start] instA build_phase starting
UVM_INFO …/src/test_2_23/instA.sv(13) @ 0: uvm_test_top.env.i_agt.mon.isA [build_check] instA build_phase finished
UVM_INFO …/src/test_2_23/my_model.sv(22) @ 0: uvm_test_top.env.mdl [build_start] model build_phase starting
UVM_INFO …/src/test_2_23/my_model.sv(26) @ 0: uvm_test_top.env.mdl [build_end] model build_phase finished
UVM_INFO …/src/test_2_23/my_agent.sv(21) @ 0: uvm_test_top.env.o_agt [build_start] agent build_phase starting
UVM_INFO …/src/test_2_23/my_monitor.sv(10) @ 0: uvm_test_top.env.o_agt.mon [new_call] monitor new is called
UVM_INFO …/src/test_2_23/my_agent.sv(29) @ 0: uvm_test_top.env.o_agt [build_end] agent build_phase finished
UVM_INFO …/src/test_2_23/my_monitor.sv(14) @ 0: uvm_test_top.env.o_agt.mon [build_start] monitor build_phase starting
UVM_INFO …/src/test_2_23/instA.sv(6) @ 0: uvm_test_top.env.o_agt.mon.isA [new_call] instA new is called
UVM_INFO …/src/test_2_23/my_monitor.sv(21) @ 0: uvm_test_top.env.o_agt.mon [build_end] monitor build finished
UVM_INFO …/src/test_2_23/instA.sv(11) @ 0: uvm_test_top.env.o_agt.mon.isA [build_start] instA build_phase starting
UVM_INFO …/src/test_2_23/instA.sv(13) @ 0: uvm_test_top.env.o_agt.mon.isA [build_check] instA build_phase finished
UVM_INFO …/src/test_2_23/my_scoreboard.sv(19) @ 0: uvm_test_top.env.scb [build_start] scoreboard build starting
UVM_INFO …/src/test_2_23/my_scoreboard.sv(24) @ 0: uvm_test_top.env.scb [build_end] scoreboard build finished

從log中看到的component的建立順序

建立順序

總結

  • build_phase是按自上而下的原則執行的,但只有直接上下級關係的節點能保證先後順序。
  • 對於在UVM樹中具有叔侄關係的節點的創建順序,並不能保證誰先誰後。
  • build_phase是按照深度優先的原則遍歷的。
  • create操作是在父節點的build_phase裏執行,同級節點的create操作是按照代碼書寫順序執行的.
  • 當該父節點的build_phase執行完,開始執行其子節點的build_phase時,則按照字母表順序執行各子節點的build_phase.
  • 要分清build_phase執行和真正component的create的區別。
    對一個節點來說:
    1.其create操作是在父節點的build_phase中完成的。
    2.該節點的build_phase, 是在其父節點的build_phase完成後,將該父節點的所有兒子節點按字母表排序,順序執行的。
    3.在其build_phase中,按書寫順序create其下級子節點。
  • 一個節點,只有其下的所有子孫節點的build_phase完成後,纔開始執行其兄弟節點的build_phase.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章