文章目录
- 前言
- [1. `report_phase` 的作用与特点](#1.
report_phase
的作用与特点) - [2. 在验证项目中的应用](#2. 在验证项目中的应用)
-
- [2.1 覆盖率报告](#2.1 覆盖率报告)
- [2.2 错误报告](#2.2 错误报告)
- [2.3 事务摘要报告](#2.3 事务摘要报告)
- [3. 层次化报告与聚合](#3. 层次化报告与聚合)
-
- [示例代码:顶层 Env 的 `report_phase`](#示例代码:顶层 Env 的
report_phase
)
- [示例代码:顶层 Env 的 `report_phase`](#示例代码:顶层 Env 的
- [4. 调试与优化](#4. 调试与优化)
- [5. 关键注意事项](#5. 关键注意事项)
- [6. 完整示例:ALU 验证环境](#6. 完整示例:ALU 验证环境)
-
- [Testbench 顶层](#Testbench 顶层)
- [Test 用例](#Test 用例)
- [Scoreboard 报告](#Scoreboard 报告)
- [Env 集成](#Env 集成)
前言
以下是对 UVM 验证环境中 report_phase
的详细解析,结合具体验证项目场景,提供分步骤实现说明和示例代码:
1. report_phase
的作用与特点
- 功能 :
- 生成仿真报告,汇总验证结果。
- 打印覆盖率、错误统计、事务摘要等信息。
- 执行顺序 :
- 在
check_phase
之后执行,属于 后仿真阶段。 - 执行顺序为 自底向上 (Bottom-Up),子组件的
report_phase
先于父组件执行。
- 在
- 关键任务 :
- 生成覆盖率报告。
- 统计并报告错误数量。
- 汇总仿真结果并打印摘要。
2. 在验证项目中的应用
2.1 覆盖率报告
场景:在功能覆盖率验证中,生成覆盖率报告并检查是否达标。
示例代码:覆盖率报告
c
class coverage_reporter extends uvm_component;
`uvm_component_utils(coverage_reporter)
real coverage_threshold = 95.0; // 目标覆盖率
covergroup alu_cg;
// 定义覆盖率点(如操作码、操作数范围)
endgroup
virtual function void report_phase(uvm_phase phase);
super.report_phase(phase);
real current_coverage = alu_cg.get_coverage();
`uvm_info("COV_REPORT", $sformatf("Coverage: %.2f%%", current_coverage), UVM_MEDIUM)
if (current_coverage < coverage_threshold) begin
`uvm_error("COV_FAIL", $sformatf("Coverage %.2f%% < target %.2f%%",
current_coverage, coverage_threshold))
end else begin
`uvm_info("COV_PASS", "Coverage target achieved", UVM_MEDIUM)
end
endfunction
endclass
2.2 错误报告
场景:在验证环境中,统计并报告仿真过程中发现的错误。
示例代码:错误报告
c
class error_reporter extends uvm_component;
`uvm_component_utils(error_reporter)
int error_count = 0; // 错误计数器
virtual function void report_phase(uvm_phase phase);
super.report_phase(phase);
`uvm_info("ERR_REPORT", $sformatf("Total errors: %0d", error_count), UVM_MEDIUM)
if (error_count > 0) begin
`uvm_error("TEST_FAIL", "Simulation failed due to errors")
end else begin
`uvm_info("TEST_PASS", "Simulation passed with no errors", UVM_MEDIUM)
end
endfunction
endclass
2.3 事务摘要报告
场景:在通信协议验证中,汇总发送和接收的事务数量。
示例代码:事务摘要
c
class transaction_reporter extends uvm_component;
`uvm_component_utils(transaction_reporter)
int tx_sent = 0; // 发送事务计数器
int tx_received = 0; // 接收事务计数器
virtual function void report_phase(uvm_phase phase);
super.report_phase(phase);
`uvm_info("TX_REPORT", $sformatf("Transactions sent: %0d, received: %0d",
tx_sent, tx_received), UVM_MEDIUM)
if (tx_sent != tx_received) begin
`uvm_error("TX_MISMATCH", "Sent and received transaction counts do not match")
end
endfunction
endclass
3. 层次化报告与聚合
场景:在 SoC 验证中,汇总子模块的报告并生成全局报告。
示例代码:顶层 Env 的 report_phase
c
class soc_env extends uvm_env;
`uvm_component_utils(soc_env)
cpu_agent cpu_agent;
mem_agent mem_agent;
soc_scoreboard soc_sb;
virtual function void report_phase(uvm_phase phase);
super.report_phase(phase);
// 汇总子组件的报告
cpu_agent.report();
mem_agent.report();
soc_sb.report();
// 全局报告
`uvm_info("GLOBAL_REPORT", "Simulation completed", UVM_MEDIUM)
if (soc_sb.get_error_count() > 0) begin
`uvm_error("SOC_FAIL", "One or more sub-components failed")
end else begin
`uvm_info("SOC_PASS", "All sub-components passed", UVM_MEDIUM)
end
endfunction
endclass
4. 调试与优化
- 调试技巧 :
- 使用
uvm_info
打印详细报告:
- 使用
c
`uvm_info("DETAIL_REPORT", $sformatf("Detailed info: %s", data), UVM_HIGH)
- 使用
+UVM_VERBOSITY=UVM_HIGH
提高日志细节。
- 性能优化 :
- 将报告任务分散到多个子组件中并行执行。
- 避免在
report_phase
中执行复杂计算(应提前在extract_phase
或check_phase
处理数据)。
5. 关键注意事项
- 报告格式 :
- 使用统一的格式生成报告,便于解析和分析。
- 错误处理 :
- 在报告中明确标记致命错误和非致命警告。
- 未完成项 :
- 检查所有待报告项是否完成:
c
if (pending_reports.size() != 0) begin
`uvm_error("PENDING_REPORT", "Some reports were not generated")
end
6. 完整示例:ALU 验证环境
Testbench 顶层
c
module top;
alu_if vif();
alu_dut dut(.a(vif.a), .b(vif.b), .op(vif.op), .result(vif.result));
initial begin
uvm_config_db#(virtual alu_if)::set(null, "uvm_test_top.env*", "vif", vif);
run_test("alu_test");
end
endmodule
Test 用例
c
class alu_test extends uvm_test;
`uvm_component_utils(alu_test)
alu_env env;
virtual function void build_phase(uvm_phase phase);
super.build_phase(phase);
env = alu_env::type_id::create("env", this);
endfunction
virtual task run_phase(uvm_phase phase);
phase.raise_objection(this);
alu_sequence seq = alu_sequence::type_id::create("seq");
seq.start(env.agent.sequencer);
#100; // 等待事务完成
phase.drop_objection(this);
endtask
endclass
Scoreboard 报告
c
class alu_scoreboard extends uvm_scoreboard;
`uvm_component_utils(alu_scoreboard)
int error_count = 0;
virtual function void report_phase(uvm_phase phase);
super.report_phase(phase);
`uvm_info("SB_REPORT", $sformatf("Errors detected: %0d", error_count), UVM_MEDIUM)
endfunction
endclass
Env 集成
c
class alu_env extends uvm_env;
alu_agent agent;
alu_scoreboard scoreboard;
virtual function void report_phase(uvm_phase phase);
super.report_phase(phase);
if (scoreboard.error_count > 0) begin
`uvm_error("TEST_FAIL", "ALU test failed due to mismatches")
end else begin
`uvm_info("TEST_PASS", "All ALU operations matched expected results", UVM_MEDIUM)
end
endfunction
endclass
通过合理设计 report_phase
,可以系统化生成仿真报告,为验证结果分析和问题定位提供关键支持,同时确保验证环境的可维护性和可扩展性。