uvm raise_objection 和 drop_objection
uvm raise_objection and drop_objection
我正在学习 UVM 并且想知道异议是如何工作的。我认为以下代码(在我的派生代理中)执行 seq.start(sequencer); sequencer完成后,执行drop_objection完成仿真。如果它是真的,即使我删除 raise_objection 和 drop_objection,它也应该执行定序器被编程要做的事情(向 DUT 发送 8 个序列项)。但是,当我注释掉 raise_objection 和 drop_objection 时,即使本应执行 seq.start,模拟也会在 sequencer 不执行任何操作的情况下完成。请帮助我理解在这种情况下反对在 UVM 中是如何工作的。完整的测试台环境可以在这里找到:
https://www.edaplayground.com/x/3_bM
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
您所看到的正是您所期望发生的,因为这正是反对的目的 - 控制何时停止模拟。 (严格来说"controlling when to end the phase",但通常只有一个阶段消耗时间——运行阶段。)
基本上没有人反对,模拟就停止了。因此,当您注释掉提出和放弃异议的代码时,不会提出任何异议,因此模拟会立即停止(什么都不做)。
你必须在任何UVM模拟中始终提出异议,否则
它会立即停止;
您必须始终在某个时候放弃所有异议,否则您的
模拟永远不会停止。
用外行的语言来说,这就像您告诉模拟器在当前阶段停止之前完成 activity 然后是反对。
我正在学习 UVM 并且想知道异议是如何工作的。我认为以下代码(在我的派生代理中)执行 seq.start(sequencer); sequencer完成后,执行drop_objection完成仿真。如果它是真的,即使我删除 raise_objection 和 drop_objection,它也应该执行定序器被编程要做的事情(向 DUT 发送 8 个序列项)。但是,当我注释掉 raise_objection 和 drop_objection 时,即使本应执行 seq.start,模拟也会在 sequencer 不执行任何操作的情况下完成。请帮助我理解在这种情况下反对在 UVM 中是如何工作的。完整的测试台环境可以在这里找到: https://www.edaplayground.com/x/3_bM
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
您所看到的正是您所期望发生的,因为这正是反对的目的 - 控制何时停止模拟。 (严格来说"controlling when to end the phase",但通常只有一个阶段消耗时间——运行阶段。)
基本上没有人反对,模拟就停止了。因此,当您注释掉提出和放弃异议的代码时,不会提出任何异议,因此模拟会立即停止(什么都不做)。
你必须在任何UVM模拟中始终提出异议,否则 它会立即停止;
您必须始终在某个时候放弃所有异议,否则您的 模拟永远不会停止。
用外行的语言来说,这就像您告诉模拟器在当前阶段停止之前完成 activity 然后是反对。