IC验证——UVM学习

姓名:杨晶晶 学号:21011210420 学院:通信工程学院

转载自:https://blog.csdn.net/qq_39815222/article/details/106619641

【嵌牛导读】验证是服务于设计的,目前来说,主流的设计语言有两种:Verilog和VHDL。伴随着IC的发展,涌现出了多种验证语言,如Vera、e、SystemC、SystemVerilog等。其中,SystemVerilog刚一推出就受到了热烈欢迎,SystemVerilog是一个Verilog的扩展集,它既完全兼容Verilog,又具有所有面向对象语言的特性:封装、继承和多态,同时,还为验证提供了一些独有的特性,如产生带约束(constraint)的随机激励。UVM是一种基于Systemverilog的验证方法学,其特征是提供用于基本验证结构和可调用的基础类库,可让验证工程师快速搭建可靠的验证框架。UVM自定义的框架构建类和测试类能够帮助验证师减轻环境构建的负担,将更多的精力集中于制定验证计划和创建测试场景。

【嵌牛鼻子】UVM验证平台组件;类;机制;语法。

【嵌牛提问】UVM是什么?UVM如何进行验证以及相关的语法问题。

【嵌牛正文】

UVM是一种基于Systemverilog的验证方法学,其特征是提供用于基本验证结构和可调用的基础类库,可让验证工程师快速搭建可靠的验证框架。UVM自定义的框架构建类和测试类能够帮助验证师减轻环境构建的负担,将更多的精力集中于制定验证计划和创建测试场景。

0. UVM验证平台中的组件

根据数字IC验证的基础知识,完整的验证平台包括激励发生器,DUT,参考模型,监视器和检查器等,在代码中表现为sequencer,DUT,reference model,monitor,scoreboard,同时为了为了使UVM验证平台更加模块化、通用化,增添了driver,sequence等组件。

详细参考:IC验证——UVM学习——验证平台中的组件_KGback的博客-CSDN博客

组件间的通信均由端口实现。

1. 类库地图

核心基类:提供最底层的支持,包括复制、创建、比较和打印等

工厂类(factory):提供注册环境组件、创建组件和覆盖组件类型的方法

事务(transaction)和序列(sequence)类:规定TLM传输管道中的数据类型和数据生成方式

环境组件(environment component)类:构成验证结构的主要部分,组件之间的嵌套关系通过层层例化和连接形成结构层次关系

事务接口(transaction interface)类和通信管道(channel)类:共同实现组件之间的通信和存储

线程同步(thread synchronization)类:同步更方便,同步时可传递的信息更多。

信息报告(message report)类:使得从UVM环境报告的信息一致规范化,便于整体的控制和过滤。

寄存器模型(register model)类:用来完成对寄存器和存储的建模,访问和验证。

2. 工厂类(factory机制)

UVM工厂和核心要素是注册,创建和覆盖。它存在的意义是为了更方便的替换验证环境中的实例或已注册的类型,同时工厂的注册机制带来配置的灵活性。这种实例或类型替代在UVM中称为覆盖。

factory机制创建对象

利用factory机制创建类的对象是UVM中特殊的用法,除了包括new函数的作用外,还具有其他功能。

m_driv = my_driver::type_id::create("m_driv", this);              //参数和new一样,第一个为该对象的名字,第二个为父对象(一般指代agent)

`uvm_component_utils

factory机制的实现被集成在uvm_component_utils这个宏中,这个宏的功能很多,包括将类定义在UVM内部的一张表中,而这张表是factory实现的基础。只要在定义一个新的类时使用这个宏,就相当于把这个类注册到这张表中,也只有经过注册的类,才能使用run_test()等功能。

注意:所有派生自uvm_component及其派生类的类都应该使用uvm_component_utils宏注册。

`uvm_object_utils

UVM中具有uvm_object所表现出来的特征的类均要使用该宏。

该宏与uvm_component_utils的区别是:uvm_component_utils用于testbench中各个平台组件的注册,其他类的注册均使用该宏。

`uvm_object_utils_begin/end

该宏可以实现有生命周期的类的factory注册。

3. 核心基类

testbench中所有的基类都继承于uvm_component,都具有该类的特征。每个派生于uvm_component或其派生下的类在其new函数中要指明两个参数:name和parent

每个派生于该类或其派生下的类出来的类均是有生命周期的,例如uvm_sequence_item即是uvm_object派生出来的。

uvm_test

所有的testcase都继承于该类

uvm_component

uvm_object

域的自动化

使得用户在注册UVM类的同时也可以声明今后会参与到对象的复制、克隆、打印等操作的成员变量,省去了一大笔编码的时间

4. phase机制

phase存在于每一个UVM的组件中,它们由一定执行顺序的任务或者函数组成。UVM也由phase来管理验证平台的运行,这些phase均以xxx_phase来命名,且都有一个类型为uvm_phase、名字为phase的参数。

执行顺序

一个验证平台可能会存在多个xxx_phase,需要根据具体情况对它们进行重载。执行顺序则根据UVM构建的树形结构从树根到树叶依次执行,例如先执行env中的phase,后执行driver中的。具体执行顺序可参照下图:

执行顺序

5. objection机制

UVM通过objection机制来控制验证平台的关闭。

在每个phase中,UVM会检查是否有objection被提起(raise_objection),如果有,就等待这个objection被撤销(drop_objection)后停止仿真;如果没有,则马上结束当前phase。raise_objection和drop_objection是成对存在的,调用drop_objection前必须先调用raise_objection。而且raise_objection必须在main_phase中第一个小号仿真时间之前。

6. config_db机制

uvm_config_db#(...)

含有两个函数:set()和get()。set操作可以理解成”寄信“,get操作可以理解成”收信“。

set和get函数都有四个参数,两函数的前三个参数必须完全一致。在下面例子中,set的第四个参数表示要将interface通过config_db传递给my_driver,get函数的第四个参数表示把得到的interface传递给哪个my_driver的成员变量。

第二个参数表示路径索引。例如“uvm_test_top”

uvm_config_db#(virtual my_if)::set(null, "uvm_test_top", "vif", input_if);        //指定一个interface

uvm_config_db#(uvm_object_wrapper)::set(this, "*.m_seqr.run_phase","default_sequence",my_sequence::get_type());

//使用该机制配置sequencer的default_sequence,第一个参数是调用set的位置,第二个为被配置对象的相对路径,第三个为目标变量的标识符,第四个为启动的sequence类型

该语句中使用双冒号是因为set和get都是静态函数。uvm_config_db#(virtual my_if)是一个参数化的类,内部参数是要寄信的类型。

7. field_automation机制

当不同类中的不同函数具有某种共性的时候,可以使用field_automation机制自动实现这几个函数,那么在不同类中均可以实现这些函数。

uvm_field

8. 特殊宏

`uvm_info

该宏与verilog中的display类似,但它有三个参数,第一个参数是字符串,用于把打印信息归类;第二个参数也是字符串,是具体需要打印的信息;第三个参数是冗余级别,代表验证平台中的关键信息设置为UVM_LOW,非关键信息设置成UVM_HIGH,介于二者间的是UVM_MEDIUM。

`uvm_fatal

该宏代表验证平台出现了重大问题而无法继续下去,它有两个参数,代表含义与·uvm_info前两个参数意义相同,但它打印第二个参数所示信息后,会直接调用verilog里的$finish函数结束仿真。

9. 特殊语句

run_test()

可以替代类的实例化及其xxx_phase成员函数的显式调用。实际上观察run_test()语句,会发现传递给它的是一个字符串。UVM根据这个字符串创建了其所代表类的一个实例。只有在类定义中使用uvm_component_utils宏才能使用

UVM会通过该函数自动创建一个顶层模块uvm_test_top。在由UVM通过parent实例化类从而构建起来的树形结构中,run_test()创建的容器类实例就是树根,而树根的名字就是uvm_test_top,而树根后派生出来的driver,transaction等均是树叶,而长出树叶的过程需要通过容器类中的xxx_phase实现。无论是树根还是树叶,都必须由uvm_component或者其他派生类继承而来。

<对象名> = <类名>::type_id::create("<对象名>" , this指针)

factory机制带来的独特的实例化类的方式,功能类似于调用类中的new函数。通过该方式看可以使用factory机制中强大的重载功能。

uvm_cmdline_processor

你可能感兴趣的:(IC验证——UVM学习)