uvm提出反对和放弃反对

uvm提出反对和放弃反对,uvm,Uvm,我正在学习UVM,想知道反对意见是如何运作的。我认为下面的代码(在我的派生代理中)执行seq.start(sequencer);在sequencer完成后,执行drop_异议以完成模拟。如果是真的,即使我删除了raise_异议和drop_异议,它也应该执行sequencer编程的操作(将8个序列项发送到DUT)。但是当我注释掉raise_objective和drop_objective时,模拟在sequencer不做任何事情的情况下完成,即使seq.start应该已经执行了。请帮助我了解在这种情

我正在学习UVM,想知道反对意见是如何运作的。我认为下面的代码(在我的派生代理中)执行seq.start(sequencer);在sequencer完成后,执行drop_异议以完成模拟。如果是真的,即使我删除了raise_异议和drop_异议,它也应该执行sequencer编程的操作(将8个序列项发送到DUT)。但是当我注释掉raise_objective和drop_objective时,模拟在sequencer不做任何事情的情况下完成,即使seq.start应该已经执行了。请帮助我了解在这种情况下,异议在UVM中是如何起作用的。完整的测试台环境可在以下位置找到:


你所看到的正是你期望发生的,因为这正是反对的理由——控制何时停止模拟。(严格地说,“控制何时结束阶段”,但通常只有一个阶段会消耗时间——运行阶段。)

基本上,如果没有提出异议,模拟将停止。因此,当您注释掉引发和删除反对意见的代码时,不会引发任何反对意见,因此模拟会立即停止(不做任何事情)

  • 必须始终在任何UVM模拟中提出异议,否则 它将立即停止

  • 你必须在某个时候放弃所有的反对意见,否则你的 模拟永远不会停止


用外行的话来说,就像你在告诉模拟器在当前阶段停止之前完成活动,然后提出异议一样。

你是对的——模拟终止是因为没有未决异议。实际上,在打印“hello world”的其他组件(即uvm_测试)中有一个提出了异议,然后在10ns内放弃了异议。因此,在10ns后,并没有异议,模拟终止,即使uvm_驱动程序准备在永久循环中处理序列_项。为了验证这一理论,我将uvm_测试中提出异议的时间窗口从10纳秒增加到100纳秒,这为驾驶员提供了足够的工作时间,即使我在我的uvm_代理中没有提出异议。
task run_phase(uvm_phase phase);
      // We raise objection to keep the test from completing
      phase.raise_objection(this);
      begin
        my_sequence seq;
        seq = my_sequence::type_id::create("seq");
        seq.start(sequencer);      
      end
      // We drop objection to allow the test to complete
      phase.drop_objection(this);
    endtask