Factory 机制也叫工厂机制,其存在的意义就是为了能够方便的替换 TB 中的实例或者已注册的类型。一般而言,在搭建完 TB 后,我们如果需要对 TB 进行更改配置或者相关的类信息,我们可以通过使用 factory 机制进行覆盖,达到替换的效果,从而大大提高 TB 的可重用性和灵活性。要使用 factory 机制先要进行:将类注册到 factory 表中创建对象,使用对应的语句 (type_id::create)编写相应的类对基类进行覆盖。
Factory 机制也叫工厂机制,其存在的意义就是为了能够方便的替换 TB 中的实例或者已注册的类型。一般而言,在搭建完 TB 后,我们如果需要对 TB 进行更改配置或者相关的类信息,我们可以通过使用 factory 机制进行覆盖,达到替换的效果,从而大大提高 TB 的可重用性和灵活性。要使用 factory 机制先要进行:将类注册到 factory 表中创建对象,使用对应的语句 (type_id::create)编写相应的类对基类进行覆盖。
Callback 机制其作用是提高 TB 的可重用性,其还可进行特殊激励的产生等,与factory 类似,两者可以有机结合使用。与 factory 不同之处在于 callback 的类还是原先的类,只是内部的 callback 函数变了,而 factory 是产生一个新的扩展类进行替换。UVM 组件中内嵌 callback 函数或者任务定义一个常见的 uvm_callbacks class从 UVM callback 空壳类扩展 uvm_callback 类在验证环境中创建并登记 uvm_callbac
无论是重载的类(parrot)还是被重载的类(bird),都要在定义时注册到 factory机制中。
被重载的类(bird)在实例化时,要使用 factory 机制式的实例化方式,而不能使用传统的 new 方式。最重要的是,重载的类(parrot)要与被重载的类(bird)有派生关系。重载的类必须派生自被重载的类,被重载的类必须是重载类的父类
factory 机制的实现被集成在了一个宏中:uvm_component_utils。这个宏最主要的任务是,将字符串登记在 UVM 内部的一张表中,这张表是 factory功能实现的基础。只要在定义一个新的类时使用这个宏,就相当于把这个类注册到了这张表中。这样,factory 机制可以实现:根据一个字符串自动创建一个类的实例,并且调用其中的函数(function)和任务(task),这个类的 main_phase就会被自动调用
Interface 是一组接口,用于对信号进行一个封装,捆扎起来。如果像 verilog 中对各个信号进行连接,每一层我们都需要对接口信号进行定义,若信号过多,很容易出现人为错误,而且后期的可重用性不高。因此使用 interface 接口进行连接,不仅可以简化代码,而且提高可重用性,除此之外,interface 内部提供了其他一些功能,用于测试平台与 DUT 之间的同步和避免竞争。
Clocking block:在 interface 内部我们可以定义 clocking 块,可以使得信号保持同步, 对于接口的采样和驱动有详细的设置操作,从而避免 TB 与 DUT 的接口竞争,减少我们由于信号竞争导致的错误。采样提前,驱动落后,保证信号不会出现竞争。
传递 virtual interface 到环境中;
配置单一变量值,例如 int、string、enum 等;
传递配置对象(config_object)到环境;
传递 virtual interface 到环境中;
a) 虽然 SV 可以通过层次化的 interface 的索引完成传递,但是这种传递方式不利于软件环境的封装和复用。通过使用 uvm_config_db 配置机制来传递接口,可以将接口的传递与获取彻底分离开。
b) 接口传递从硬件世界到 UVM 环境可以通过 uvm_config_db 来实现,在实现过程中应当注意:
c) 接口传递应发生在 run_test()之前。这保证了在进入