UVM phase机制(三)objection机制

本文深入探讨了UVM框架中的objection机制,解释了为何在run_phase中需要raise_objection和drop_objection来控制执行流程。通过分析UVM phase结构,展示了raise_objection如何增加objection计数,以及drop_objection如何触发进程结束。同时,文章讨论了多个组件使用objection机制时的协同工作方式,并指出即使在没有在run_phase中raise_objection,main_phase仍然可以并行执行。

在上一篇博客UVM phase机制(二)中,我们有介绍到run_phase以及12个run_time_phase是如何运转起来的,但是留了一个小问题就是objection,想要run必须raise_objection,要想结束run必须drop_objection。下面我们详细分析一下为什么会这样
在运行到run_node的时候,是这样一个执行结构,

fork
   fork
            env.run_phase(uvm_phase phase);
   join_none
   fork
            uvm_test_top.run_phase(uvm_phase phase);
   join_none
   fork
            top.run_phase(uvm_phase phase);
   join_none

join_none

但是,最终完整的执行结构是

fork
   fork
            env.run_phase(uvm_phase phase);
   join_none
   fork
            uvm_test_top.run_phase(uvm_phase phase);
   join_none
   fork
            top.run_phase(uvm_phase phase);
   join_none

join_none
#0;
fork
    begin
	      fork
		         process(0);//junp
				 process(1);//objection
				 process(2);//timeout
		  join_any
		  disable fork
	end

join

所有的进程都是并行的,因此如果没有objection的话,那么进程process(1)直接结束,会直接disable fork。直接退出整个执行进程。下面介绍objecti

UVM采用phase机制来自动化运行testbench各个仿真过程,支持显示或隐式的同步方案,以及运行过程中的线程控制和跳转。用户只需把代码填入对应的phase,代码就会自动在正确的时间执行[^2]。 phase机制的意义在于使UVM的运行层次化,保证各种例化先后次序正确。传统硬件设计模型在仿真开始前完成例化和连接,SV软件部分对象例化在仿真开始后通过new()实现,但简单的new无法解决验证环境层次化时例化先后关系、组件例化后连接的问题,也无法在底层组件例化前完成对底层的配置。而UVM引入phase机制可清晰将UVM仿真阶段层次化,这里的层次化不仅指各个phase先后执行顺序,同一phase中层次化组件间的phase也有先后关系[^1][^3]。 UVMphase主要有9个,外加12个小phase,这12个小的phase称为run - time phase。其中除了run phase和12个小的phase是task之外,其余的都是function。比较常用的phase有build_phase、connect_phase、reset_phase、main_phase、run_phase、report_phase、final_phase等[^1]。 ### 代码示例 以下为一个简单示例,展示如何在UVM中使用`build_phase`和`main_phase`: ```systemverilog class my_env extends uvm_env; `uvm_component_utils(my_env) function new(string name, uvm_component parent); super.new(name, parent); endfunction virtual function void build_phase(uvm_phase phase); super.build_phase(phase); // 在此处添加构建环境的代码 `uvm_info("BUILD_PHASE", "Building the environment", UVM_LOW) endfunction virtual task main_phase(uvm_phase phase); phase.raise_objection(this); // 在此处添加主要的测试代码 `uvm_info("MAIN_PHASE", "Running the main test", UVM_LOW) #100ns; // 模拟一些操作 phase.drop_objection(this); endtask endclass ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值