跳转至

输入查询内容

    本页内容

    报告路由、verbosity 与文件配置

    环境:VCS W-2024.09-SP2-8。1.2 使用 uvm-1.2,2.0 使用 uvm-ieee-2020-2.0

    实验检查观察值是否符合预期;成功复现问题不代表问题已修复。

    结果对比

    观察内容 UVM 1.2 UVM 2.0
    调用报告接口前的 handler 状态 handler_before_api 1 0
    调用报告接口后的 handler 状态 handler_after_api 1 1
    report_summarize(0) 的屏幕输出记录 summary_zero_display 1 0
    report_summarize(0) 的文件输出记录 summary_zero_log 0 1
    总结后修改的文件路由仍保留(1=是) summary_file_persists 0 1
    显式恢复原文件路由成功(1=是) summary_file_restored 1 1
    verbosity=UVM_NONE 时输出总结的记录 summary_at_none 0 1
    设置工厂覆盖时的报错数 factory_set_errors 1 0
    工厂解析覆盖目标时的报错数 factory_resolve_errors 0 1

    运行命令

    目录与环境准备;从解包根目录执行:

    uv run tools/run_uvm_review.py --case report_probe --variants 12,20
    

    最小源码

    report_probe.sv

    report_probe.sv
    `timescale 1ns/1ps
    `include "uvm_macros.svh"
    import uvm_pkg::*;
    
    class report_payload extends uvm_object;
      `uvm_object_utils(report_payload)
      function new(string name="report_payload"); super.new(name); endfunction
    endclass
    
    class report_probe_catcher extends uvm_report_catcher;
      int summary_seen, summary_action, type_errors;
      function new(); super.new("catcher"); endfunction
      function action_e catch();
        if (get_id() == "UVM/REPORT/SERVER") begin
          summary_seen++;
          summary_action=get_action();
          return CAUGHT;
        end
        if (get_id() == "TYPNTF") begin type_errors++; return CAUGHT; end
        return THROW;
      endfunction
    endclass
    
    class lazy_reporter extends uvm_report_object;
      function new(); super.new("lazy"); endfunction
      function bit has_handler(); return m_rh != null; endfunction
    endclass
    
    module report_probe;
      initial begin
        report_probe_catcher catcher = new();
        lazy_reporter reporter = new();
        uvm_report_server server = uvm_report_server::get_server();
        uvm_root top = uvm_root::get();
        uvm_factory factory = uvm_factory::get();
        uvm_object_wrapper wrapper;
        int count, file_a, file_b;
        uvm_report_handler handler;
        #1;
        $display("REVIEW|handler_before_api|%0d", reporter.has_handler());
        handler = reporter.get_report_handler();
        $display("REVIEW|handler_after_api|%0d", handler != null);
        uvm_report_cb::add(null, catcher);
        top.set_report_verbosity_level(UVM_LOW);
        server.report_summarize(0);
        $display("REVIEW|summary_zero_display|%0d", (catcher.summary_action & UVM_DISPLAY) != 0);
        $display("REVIEW|summary_zero_log|%0d", (catcher.summary_action & UVM_LOG) != 0);
        file_a = $fopen("original-summary.log", "w");
        file_b = $fopen("requested-summary.log", "w");
        top.set_report_id_file("UVM/REPORT/SERVER", file_a);
        server.report_summarize(file_b);
        $display("REVIEW|summary_file_persists|%0d", top.get_report_file_handle(UVM_INFO, "UVM/REPORT/SERVER") == file_b);
        top.set_report_id_file("UVM/REPORT/SERVER", file_a);
        $display("REVIEW|summary_file_restored|%0d", top.get_report_file_handle(UVM_INFO, "UVM/REPORT/SERVER") == file_a);
        top.set_report_verbosity_level(UVM_NONE);
        count = catcher.summary_seen;
        server.report_summarize();
        $display("REVIEW|summary_at_none|%0d", catcher.summary_seen-count);
        factory.set_type_override_by_name("report_payload", "unregistered_override");
        $display("REVIEW|factory_set_errors|%0d", catcher.type_errors);
        count = catcher.type_errors;
        wrapper = factory.find_override_by_name("report_payload", "");
        $display("REVIEW|factory_resolve_errors|%0d", catcher.type_errors-count);
        $fclose(file_a);
        $fclose(file_b);
        $display("REVIEW|done|1");
        $finish;
      end
    endmodule
    

    全部用例 · 证据摘要

    版本适用范围