UVM中的Scoreboard设计:从简单比较到复杂参考模型
摘要
Scoreboard(记分板)是UVM验证环境的核心组件,负责比较DUT的实际输出与参考模型的预期输出。一个设计良好的Scoreboard是验证环境质量的重要体现。本文将从简单的数据比较出发,逐步介绍如何构建复杂的参考模型。
1. Scoreboard的基本架构
Driver -> DUT -> Monitor -> Scoreboard
^
Reference Model ————|
Scoreboard通常通过uvm_analysis_imp接收来自Monitor的数据,并与参考模型的输出进行比对。
2. 简单Scoreboard实现
class simple_scoreboard extends uvm_scoreboard;
`uvm_component_utils(simple_scoreboard)
// 接收DUT输出的分析端口
uvm_analysis_imp #(packet, simple_scoreboard) analysis_export;
// 存储期望值的队列
packet exp_queue[$];
function void write(packet pkt);
packet exp_pkt;
if (exp_queue.size() == 0) begin
`uvm_error("SCB", "Unexpected transaction received!")
return;
end
exp_pkt = exp_queue.pop_front();
if (pkt.data !== exp_pkt.data) begin
`uvm_error("SCB", $sformatf(
"Data mismatch! Got: %0h, Expected: %0h",
pkt.data, exp_pkt.data))
end else begin
`uvm_info("SCB", "Transaction PASSED", UVM_HIGH)
end
endfunction
endclass
3. 带参考模型的Scoreboard
对于复杂设计,需要在Scoreboard内部实现参考模型(Reference Model):
class adder_scoreboard extends uvm_scoreboard;
// 两个输入端口
uvm_analysis_imp_a #(operand_t, adder_scoreboard) imp_a;
uvm_analysis_imp_b #(operand_t, adder_scoreboard) imp_b;
// 一个输出端口
uvm_analysis_imp_out #(result_t, adder_scoreboard) imp_out;
operand_t op_a_queue[$];
operand_t op_b_queue[$];
// 参考模型:计算期望结果
function void write_out(result_t result);
operand_t a, b;
result_t expected;
a = op_a_queue.pop_front();
b = op_b_queue.pop_front();
expected.sum = a.value + b.value; // 参考模型逻辑
if (result.sum !== expected.sum)
`uvm_error("SCB", "Adder result mismatch!")
endfunction
endclass
4. Scoreboard设计最佳实践
| 使用TLM端口 | 通过uvm_analysis_imp解耦Monitor与Scoreboard |
| 错误统计 | 记录pass/fail数量,在report_phase中汇总 |
| 超时检测 | 检查期望队列是否长期非空,防止数据丢失 |
| 参考模型分离 | 将参考模型逻辑封装为独立类,提高可维护性 |
结论
Scoreboard是验证环境的"裁判",其设计质量直接决定验证的有效性。从简单的队列比较到复杂的参考模型,工程师需要根据DUT的复杂度选择合适的Scoreboard架构。
欢迎关注我的个人网站:www.bcbao.club
B站: bc宝懂一点IC





