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.
  • 8
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值