简单 FIFO 比对,复杂场景需要 Reorder
在任何验证环境中,激励产生后,我们都需要回答一个核心问题:DUT 的输出是否符合预期? Scoreboard(记分板)就是用来完成这项比对工作的组件。它接收来自参考模型或预期源的“期望事务”(expected)和来自 DUT 输出 monitor 的“实际事务”(actual),然后进行比对。
最简单的场景是顺序一致的 FIFO 型 DUT:激励进去,输出按同样顺序出来。此时只需两个队列,一个装期望,一个装实际,依次弹出比对即可。但很多 DUT 是乱序的,比如 AXI 总线的多个 outstanding 事务,响应顺序可能与请求顺序不同;或者网络包可能乱序到达。此时简单的 FIFO 比对就会失败,需要支持按某种**键值(key)**进行索引和匹配的算法比对。
这就是为什么 UVM 提供了两种标准的 scoreboard 比较器:uvm_in_order_comparator 和 uvm_algorithm_comparator。同时,验证工程师也经常自定义 scoreboard 来满足更复杂的需求。
从比较器到自定义 Scoreboard
Scoreboard 的职责
Scoreboard 是验证平台的比对中心,它不产生激励,也不驱动 DUT,只负责接收事务并进行比对。其输入通常有两个:
- Expected 事务:来自参考模型、序列生成器或其他预测源。
- Actual 事务:来自 DUT 输出 monitor 的观测结果。
比对通过则代表 DUT 行为符合预期,失败则报错。Scoreboard 通常使用 uvm_analysis_imp 接收来自 analysis port 的事务。
UVM 内置比较器
UVM 库中提供了两个开箱即用的 scoreboard 组件,它们都实现了 analysis port 的接收和比对逻辑。
uvm_in_order_comparator —— 顺序比较器
uvm_in_order_comparator #(type T) 假设事务的到达顺序与发送顺序完全一致。它内部使用两个队列:m_expected 和 m_actual。当收到 expected 事务时,压入期望队列;收到 actual 事务时,将 actual 与期望队列的头部进行比对,如果相等则从队列弹出,否则报错。
原理:
- 有一个 uvm_analysis_imp 用于接收 expected 事务。
- 有一个 uvm_analysis_imp 用于接收 actual 事务。
- 当 actual 到达时,如果期望队列非空,取出队首进行 compare(),若不一致则报 uvm_error。
- 若 actual 到达时期望队列为空,说明收到了意外的 actual,报错。
使用场景: 适合顺序保证的 DUT,如简单的 FIFO、单通道流水线、严格按请求顺序响应的总线。
uvm_algorithm_comparator —— 算法比较器(按 key 匹配)
uvm_algorithm_comparator #(type T, type K) 支持乱序比对。它需要用户提供
