factory:实用的UVM机制

路科验证官网:路科验证专注于数字芯片验证的系统思想和前沿工程领域

EETOP路科首页: EETOP – 路科验证 – IC验证培训

CSDN路科首页:CSDN – 路科验证 – IC验证培训

UVM鼓励工程师创建模块化、可复用的测试平台。UVM通过TLM接口,把一个组件及其他与之相连的组件隔离开来,以此实现模块化。只要transaction类型相同,模块化的功能允许sequence 连接到任何适配的driver上。也允许多种覆盖率收集器通过分析接口连接到monitor上。这种模块化的功能,使得搭建环境的工程师可以把库中的各种组件进行混合匹配,最终组合放到DUT的配置环境中。这对于验证工程师当然是非常有用的。

很多时候验证工程师需要很多环境,这些环境大体上很相似,只在一些小的方面稍有不同。每个环境有其特定的用途,同时他们的大多数组件都是完全相同的。那么,我们如何做到共享其通用的部分、定制其独特的部分呢?当然,这是OOP(面向对象编程)的基本特点,OOP语言实现这种功能并不难。但是,我们要说的是UVM,因为UVM又将这种实现方法进一步简化了。

一个经验浅的OOP程序员可能会直接在环境中实例化组件,如下:

Env的实例化也类似:

对于验证工程师,当testbench能正确运行transaction时,我们可能想要改变一些东西,比如看看当在transaction流里插入错误会发生什么。为了做到这一点,可以创建一个新的driver,派生my_driver类得到my_err_driver,并在环境中将其实例化。OOP能让我们实现这一点,派生my_env类,并如下图一样重载build_phase()方法。

这样的话,两个环境的不同之处仅仅是driver的类型。因为my_err_driver是从my_driver派生得到,所以他们有相同的接口,而且driver和squencer之间的连接也是相同的。所以我们就不用重复其他代码了。类似的,我们可以派生my_test,以使用新的env:

所以这样的话,当我们真正需要的是新的driver的时候,我们就需要从一个test、env、driver得到了两个test、env、driver(以及新的build_phase()方法)。但是,如果有一种方法,可以直接在env中实例化my_err_driver,而不用创建一个新的env,对比起来,不是比之前的方法简便多了吗?而这些,在UVM中我们就可以使用factory机制实现。

Factory是UVM中一种特殊的类,用于创建验证工程师特定的任意uvm_object或uvm_component类型。但是注意要用factory机制注册组件,这样的话factory机制才能知道怎样创建一个实例,具体是通过宏定义来实现的。

通过uvm_component_utils宏设置factory机制,这样才可以创建一个特殊类型的实例。要注意的是,所有你创建的派生自uvm_component基类的派生类(即使是间接派生也是)都需要用这个宏进行注册。类似的,你也要用uvm_object_utils宏注册你所有的uvm_object派生类(比如uvm_sequence、uvm_sequence_item等)

现在,取代之前直接实例化my_driver的方法,我们用factory机制的creat()方法来实现实例化。

“::type_id::create()” 语句调用factory机制的静态creat()方法。你不需要知道具体是怎么实现的,你只用知道它会返回一个my_driver类型的实例,并在env中将其赋给drv句柄。鉴于这种机制的灵活性,现在test top会通过factory机制的重载信息来告诉env具体要create哪个driver,而不用在每次env的子组件有变化时都派生新的env类。

不同于之前我们派生my_test来实例化不同env的方法,这里我们要加入重载记录信息,使用set_type_override函数,以此告诉env要实例化的my_driver对象的具体类型,

使用这种模式,我们可以建立一个base test,用默认的组件实例化基本环境,然后再派生base test 就得到包含了factory重载或者其他功能的新的test。例如,除了重载driver类型,test可能会执行一些新的激励sequence,或者换一种新的覆盖率收集器。

总的来说,因为TLM接口的使用下,组件间的连接关系总是不变的,factory给我们提供了一个钩子,在创建实例的时候根据是否有重载记录,进而决定要实例化的是原始的类,还是派生后的重载类。这样可以让我们在不用改变env代码的情况下方便地实现一些改变。在实际验证中,在已存在的testbench中,不用添加代码就能实现新的行为功能,这是很实用的功能。所以Factory机制,又是一个体现UVM强大功能的好东西。

发表评论

邮箱地址不会被公开。 必填项已用*标注

陕ICP备18003383号-1