激励之外,我们还需要“眼睛”
在 UVM 验证平台中,激励的产生、驱动和响应只是故事的一半。验证的本质是检查行为是否符合预期,这就要求平台能够观察 DUT 的输入输出、内部状态,并将观察结果传递给检查组件。
于是,monitor 应运而生。它像一名安静的观察者,从不主动改变 DUT 的任何信号,只是被动地采样接口上的事务,然后通过 analysis port 将观察到的事务“广播”给所有感兴趣的组件(如 scoreboard、coverage collector、register predictor)。
重点:monitor 的核心使命是“采样 + 广播”,绝不参与激励生成或接口驱动,也不应阻塞仿真流程。
Monitor 与 Analysis Port
Monitor —— 被动的采样者
uvm_monitor 是一个 UVM 组件,通常与某个 interface 关联,在 run_phase 中不断监听接口信号的变化。当它识别到一个完整的事务(例如一次总线读写、一个数据包)发生时,它会创建一个 transaction 对象,将接口上的信号采样进去,然后通过 analysis port 发送出去。
Monitor 的原则:
- 只采样,不驱动:不得对接口信号赋值(使用阻塞/非阻塞赋值),避免影响 DUT。
- 不阻塞:采样后立即广播,不能等待 subscriber 处理完成。
- 不管理 objection:monitor 不应 raise/drop objection,因为它不能决定仿真何时结束。
Analysis Port —— 一对多的广播通道
uvm_analysis_port #(T) 是 UVM TLM 中用于非阻塞广播的端口。它是一个参数化的类,T 通常是事务类型(如 my_trx)。通过调用 ap.write(trx),所有连接到该端口上的 subscriber(如 uvm_analysis_imp)都会收到这个事务,完成一对多的分发。
特点:
- 广播:一个 producer 可以同时通知多个 consumer,互不影响。
- 非阻塞:write() 调用立即返回,不会等待 subscriber 处理,适合被动监控。
- 无握手:不提供背压机制,producer 不关心 consumer 是否准备好。
