UVM_启动流程

        UVM中通过objection机制来控制验证平台的关闭。在每个phase中,UVM会检查是否有objection被提起(raise_objection),如果有,那么等待这个objection被撤销(drop_objection)后停止仿真;如果没有,则马上结束当前phase。raise_objection语句必须在第一个消耗仿真时间的语句之前,如$display语句是不消耗仿真时间的,这些语句可以放在raise_objection之前,但是类似@(posedge top.clk)等语句是要消耗仿真时间的。当所有的phase都执行完毕后,就会调用$finish来将整个验证平台关掉。

        采用run_test来启动UVM验证平台:

加参数run_test启动uvm验证平台

 

        run_test语句会创建一个my_case0的实例,并会自动调用my_ case0的main_phase。仔细观察run_test语句,会发现传递给它的是一个字符串。UVM会根据这个字符串创建了其所代表类的一个实例(前提是这个类进行宏注册过了)。在UVM验证平台中,只要一个类使用uvm_component_utils注册且此类被实例化了,那么这个类的main_phase就会被自动调用,所以在driver中,最重要的就是实现main_phase。

        UVM也提供对不加参数的run_test的支持:

不加参数run_test启动uvm验证平台

        在这种情况下,UVM会利用UVM_TESTNAME从命令行中寻找测试用例的名字,创建它的实例并运行,如下所示的代码也可以启动my_case0:

        整个UVM验证平台启动及执行的流程如图所示:

测试用例启动及执行流程

        启动后,整棵UVM树的结构如图所示。

完整的UVM树

        uvm_top是一个全局变量,它是uvm_root的一个实例(而且也是唯一的一个实例),而uvm_root派生自uvm_component,所以uvm_top本质上是一个uvm_component,它是树的根。uvm_test_top的parent是uvm_top,而uvm_top的parent则是null。uvm_root的存在可以保证整个验证平台中只有一棵树,所有结点都是uvm_top的子节点。

 

 

总结:1)在导入uvm_pkg文件时,会自动创建UVM_root所例化的对象UVM_top,UVM顶层的类会提供run_test()方法充当UVM世界的核心角色,通过UVM_top调用run_test()方法。 2)在环境中输入run_test来启动UVM验证平台,run_test语句会创建一个my_case0的实例,得到正确的test_name 2)依次执行uvm_test容器中的各个component组件中的phase机制,按照顺序, 1.build-phase(子顶向下构建UVM 树) 2.connet_phase(子低向上连接各个组件) 3.end_of_elaboration_phase 4.start_of_simulation_phase 5.run_phase() objection机制仿真挂起,通过start启动sequence(每个sequence都有一个body任务。当一个sequence启动后,会自动执行sequence的body任务),等到sequence发送完毕则关闭objection,结束run_phase()(UVM_objection提供component和sequence共享的计数器,当所有参与到objection机制中的组件都落下objection时,计数器counter才会清零,才满足run_phase()退出的条件(UVM入门P45)) 5.执行后面的phase

在这里插入图片描述

  • 14
    点赞
  • 103
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值