数字IC验证系列之objection mechanism

UVM中,component的task phase是消耗仿真时间的,各个components的task phase之间需要完成同步。只有在所有components的相同task phase结束之后,才能进入下一个task phase。

UVM中通过objection mechanism中的raise/drop objection来控制phase的开始和停止。

当仿真器进入某个消耗时间的task phase时,首先会收集所有component**提起(raise)的objection,然后按顺序执行所有component各自的task phase,直到所有component提起的objection都被撤销(drop)**该phase的执行才算结束。

//driver中提起objection

task driver::main_phase(uvm_phase phase);
phase.raise_objection(this);     
.....
phase.drop_objection(this);
endtask

//monitor中提起objection

task monitor::main_phase(uvm_phase phase);    
phase.raise_objection(this);     
.....
phase.drop_objection(this);
endtask

例如在上述代码中,仿真器收集driver和monitor各自提起的objection,按顺序执行省略代码,直到driver和monitor都撤销objection才算main_phase执行结束

如果某个component的相应task phase没有被提起,则永远也不会执行消耗仿真时间的语句。同样,如果才task phase被提起后不被撤销,则该phase永远也不会结束。

在前面的代码中,main phase具有一个uvm_phase参数,这就是为具体实现raise/drop objection而设置的,这样每个component才能通过phase.raise_objection来提起相应的objection

在这里插入图片描述
UVM中的run_phase和其他task phase是并行关系,如果其他task phase中的objection被提起,run_phase也会执行,直到所有objection被撤销,run_phase才会结束。

下面通过几个例子展示objection的用法:

示例1:不加raise objection

class my_driver extends uvm_driver;

	`uvm_component_utils(my_driver)  
	function new(string name = "my_driver", uvm_component parent =null);     
			super.new(name, parent);     
			`uvm_info("my_driver", "new is called", UVM_LOW);  
	endfunction  

	extern virtual task main_phase(uvm_phase phase);
endclass

task my_driver::main_phase(uvm_phase phase);  
	`uvm_info("my_driver", "main_phase is called",UVM_LOW);     
	@(posedge top_tb.clk);     
	`uvm_info("my_driver", "data is drived", UVM_LOW);
endtask

输出:

UVM_INFO my_driver.sv(8) @ 0: uvm_test_top[my_driver] new is called
UVM_INFO my_driver.sv(15) @ 0: uvm_test_top[my_driver] main_phase is called

没有输出"data is drived"

示例2:raise objection没有加在仿真时间0时刻

class my_driver extends uvm_driver;

  `uvm_component_utils(my_driver)  
	function new(string name = "my_driver", uvm_component parent =null);
     super.new(name, parent);
     `uvm_info("my_driver", "new is called", UVM_LOW);
  endfunction
  extern virtual task main_phase(uvm_phase phase);
endclass

task my_driver::main_phase(uvm_phasephase);
  @(posedge top_tb.clk);
  phase.raise_objection(this);
	`uvm_info("my_driver", "main_phase is called",UVM_LOW);
	   @(posedge top_tb.clk);
	`uvm_info("my_driver", "data is drived", UVM_LOW);
  phase.drop_objection(this);
endtask

输出:

UVM_INFO my_driver.sv(6) @ 0: uvm_test_top[my_driver] new is called

没有输出 "main_phase is called"和"data is drived"

示例3:不加drop objection

class my_driver extends uvm_driver;
  `uvm_component_utils(my_driver)
  function new(string name = "my_driver", uvm_component parent =null);
     super.new(name, parent);
     `uvm_info("my_driver", "new is called", UVM_LOW);
  endfunction
  extern virtual task main_phase(uvm_phase phase);
endclass

task my_driver::main_phase(uvm_phasephase);
  phase.raise_objection(this);
  `uvm_info("my_driver", "main_phase is called",UVM_LOW);
  while(1) begin
     @(posedge top_tb.clk);
	`uvm_info("my_driver", "data is drived", UVM_LOW);
  //phase.drop_objection(this);
  end
endtask

输出:

UVM_INFO my_driver.sv(8) @ 0: uvm_test_top[my_driver] new is called
UVM_INFO my_driver.sv(15) @ 0: uvm_test_top[my_driver] main_phase is called
UVM_INFO my_driver.sv(16) @ 125840500000:uvm_test_top [my_driver] data is drived
UVM_INFO my_driver.sv(16) @ 125840700000:uvm_test_top [my_driver] data is drived
UVM_INFO my_driver.sv(16) @ 125840900000:uvm_test_top [my_driver] data is drived
…
UVM_INFO my_driver.sv(16) @ 125841100000:uvm_test_top [my_driver] data is drived
UVM_INFO my_driver.sv(16) @ 125841300000:uvm_test_top [my_driver] data is drived
UVM_INFO my_driver.sv(16) @ 125841500000:uvm_test_top [my_driver] data is drived
UVM_INFO my_driver.sv(16) @ 125841700000:uvm_test_top [my_driver] data is drived

陷入死循环

示例4:增加drop objection

class my_driver extends uvm_driver;
  `uvm_component_utils(my_driver)
  function new(string name = "my_driver", uvm_component parent =null);
     super.new(name, parent);
     `uvm_info("my_driver", "new is called", UVM_LOW);
  endfunction
  extern virtual task main_phase(uvm_phase phase);
endclass

task my_driver::main_phase(uvm_phasephase);
  phase.raise_objection(this);
  `uvm_info("my_driver", "main_phase is called",UVM_LOW);
  while(1) begin
     @(posedge top_tb.clk);
  `uvm_info("my_driver", "data is drived", UVM_LOW);
  phase.drop_objection(this);
  end
endtask

输出:

UVM_INFO my_driver.sv(6) @ 0: uvm_test_top[my_driver] new is called
UVM_INFO my_driver.sv(13) @ 0: uvm_test_top[my_driver] main_phase is called
UVM_INFO my_driver.sv(16) @ 100000:uvm_test_top [my_driver] data is drived

正常输出

从上面几个示例可以看出,要想正确地实现对设计的仿真,必须合理地控制objection的提起和撤销,并且raise objection要发生在消耗时间的仿真语句之前

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
"Objection, wallbreaker"这个词组的意思可能是指在辩论或讨论中,对破除对方观点或阻碍的反对意见或观点。如果我要用300字回答这个问题,我会这样表达: 在辩论或讨论中, "objection, wallbreaker"是指提出反对意见或观点,意图破除或击破对方观点或阻碍。这个词组的出现通常是为了追求真实和公正的辩论,希望通过不同观点的碰撞促进智慧和认识的增长。 每个人都有自己的观点和立场,而辩论是一个相互交流、较量、甚至对抗观点的过程。当有人提出"objection, wallbreaker"时,他们可能持有不同的观点,希望通过辩论来找到真相或者找到更好的解决办法。 然而,在提出"objection, wallbreaker"时,我们也需要注意呈现我们的观点要公正和明晰。我们应该以理性的态度和充分的证据来支持我们的反对意见,而不是简单地提出不成熟的批评或个人攻击。 辩论中的"objection, wallbreaker"是一种促进思考和发展的机会。通过挑战和争论,我们可以更清晰地理解对方观点的有趣之处和缺点。这种挑战有助于增强我们的辩论能力、提升思维的灵活性,并可能在辩论过程中改变我们自己的立场。 总之,"objection, wallbreaker"是辩论中常见的现象之一,它代表了追求真相和理解的努力。在辩论中提出反对观点时,我们必须以开放和尊重的态度对待对方,并用理性的方式来支持我们的观点。通过这样的辩论,我们可以共同进步,获得深入的认识和智慧。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值