理解UVM build_phase的执行顺序很重要
虽然明白build_phase的执行顺序是由上往下,由根节点到叶子节点,但具体细节还是不清楚,如是在同级的所有节点都先创建完成,在开始下一级节点的创建?还是某个节点一下所有节点都创建完,在创建兄弟节点及其子节点呢?
我做了个试验,在每个component的new函数结尾会打印tag是 [new_call]的信息, 在每个build_phase函数开头和结尾分别打印tag为[build_start]和[build_end]的信息。
所要建立的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.