IC验证——UVM学习

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

systemverilog语法参考:IC验证——SystemVerilog学习_KGback的博客-CSDN博客_systemverilog验证

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)类:用来完成对寄存器和存储的建模,访问和验证。

1.1 transaction和sequence

1.2 工厂类(factory机制)

1.3 核心基类

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

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

  • uvm_test
    所有的testcase都继承于该类
  • uvm_component
  • uvm_object
  • 域的自动化
    使得用户在注册UVM类的同时也可以声明今后会参与到对象的复制、克隆、打印等操作的成员变量,省去了一大笔编码的时间

2. phase机制

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

  • 执行顺序

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

3. objection机制

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

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

4. config_db机制

用来实现全局变量间的数据共享。

  1. 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)是一个参数化的类,内部参数是要寄信的类型。

5. field_automation机制

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

  • uvm_field

6. 特殊宏

  • `uvm_info

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

  • `uvm_fatal

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

7. 特殊语句

  • 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

参考链接:uvm_cmdline_processor - IC新手 - 博客园

你可能感兴趣的:(数字IC验证,UVM,UVM)