【问题标题】:UVM end of testUVM 测试结束
【发布时间】:2020-12-12 08:20:18
【问题描述】:

如果我想从我的显示器结束模拟(我知道这不是推荐的方式),我该怎么做? 假设我在显示器中得到了这段代码:

Virtual task monitor_run();

fork

forever begin
.....
end

forever begin
.....
end

forever begin
.....
end

join

endtask : monitor_run

每个永远循环检查 DUT 的输出是否准时,以防它们不应该停止仿真。 这个特殊的监视器应该在不匹配(错误)的情况下中断模拟并且没有记分板。 我仍然想管理模拟行为的结束。我尝试使用 raise 和 drop objection,但有时会收到 OBJT_ZERO 错误。有谁知道在这种情况下结束模拟的好方法? 谢谢!

【问题讨论】:

  • 是的,但我想通过我的基本测试组件完成测试,以便以有组织的方式打印“测试失败”。我在这台显示器中遇到了一些需要结束测试的情况,所以我不想多次使用 uvm_fatal

标签: system-verilog uvm


【解决方案1】:

UVM 默认设置为使 uvm_report_fatal 立即结束测试,而 uvm_report_error 让模拟继续进行,直到达到您可以设置的错误限制。您可以控制单个组件的每个严重性的操作。请参阅uvm_report_object,它是uvm_component 的基类。

结束测试后,UVM 调用uvm_report_server::report_summarize() 转储所有严重性计数。如果您坚持,您可以在您的测试平台模块中创建一个final 块,该块从报告服务器收集严重性计数并打印最后一条消息。例如:

module top;
  initial run_test();


  uvm_report_server rs = uvm_report_server::get_server();

  final if (rs.get_severity_count(UVM_FATAL) != 0 ||
            rs.get_severity_count(UVM_ERROR) !=0 )
            $display("Test Failed");

endmodule

但这确实是不必要的,并且可能无法捕获其他非 UVM 错误,例如断言失败或时序检查。许多工具都有一个 TESTSTATUS 退出代码,用于报告最严重的消息遭遇、UVM 或工具。

【讨论】:

  • 您好,非常感谢您的回答。您有任何实现示例可以学习吗?
  • 当我没有错误时,模拟永远不会停止。 DUT 运行的方式是在运行阶段开始时通过主机序列进行简单配置,然后 DUT 在没有生成事务的定序器的情况下运行。在这种情况下如何结束模拟?当定序器在 run_phase 开始时结束他的工作时?我试图从我的监视器内部 drop_objection(当我认为监控阶段足够时)但它有时会因 OBJT_ZERO 错误而失败。
  • 实际上,我想知道如何在这种情况下从监视器终止测试,因为 DUT 活动不依赖于 seqr,因此在定序器停止后我的测试不应该停止。
  • 您没有真正展示足够的代码来提供帮助。你只能放弃你提出的反对并且你没有表现出来。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-15
  • 1970-01-01
  • 1970-01-01
  • 2017-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多