本文介绍如何使用 Questa Verification IP 中实现的回调,在采用 PCIe 协议的设计中进行断言验证。

QVIP 中的回调

在 Questa Verification IP 中,首先定义回调方法和策略,使其在所有协议之间通用。随后针对每种具体协议,从这些基类扩展回调方法。

其中一个基类被称为 cb_policy,它从 uvm_object 扩展而来。该基类定义了 register、get 和 return 回调等方法。这些方法被声明为纯虚拟任务或函数,以便派生的类能够覆盖基类定义。

第二个基类从 uvm_component 扩展而来,它被称为 cb_manager。这个类的 run_phase() 是一个无限循环,在其间,我们首先从 BFM 获取序列项,然后将更改后的序列项返回给 BFM。在 cb_manager 类中定义的单独外部任务中,可添加和删除回调队列中的回调序列项,并根据队列大小激活 register 回调方法。

对于每个协议特定的回调实现,该协议独有的各个序列项均从前述基类扩展而来。这些名称的分配方式如下:_ cb_manager 对应从 cb_manager 扩展的类,_cb_policy 对应从 cb_policy 扩展的类。

在类 _cb_policy 中,将基于每个协议的性质填充 register、get 和 return 回调方法。要启用特定序列项的回调,首先启用测试(从 uvm_test 扩展的类)的 build_phase 中的代理设置,这将实例化 _cb_manager。在该测试的 run_phase 中,通过调用添加回调任务(在 cb_manager 中定义)来激活 register 回调方法。

Register 回调方法的主要目的是在用于设置状态变量的 BFM 内启动回调相关的任务。在设置 BFM 内的状态变量后,将会立即调用 get 回调方法,此方法用于通过 DPI 调用从 BFM 获取序列项。用于操作序列项字段的整个逻辑被放置在 _cb_manager 内部定义的 do_callback 任务中。更改后的序列项随后通过 DPI 调用返回到 BFM,并最终驱动到总线上。

分享

相关资源