UVM是一种基于Systemverilog的验证方法学,其特征是提供用于基本验证结构和可调用的基础类库,可让验证工程师快速搭建可靠的验证框架。UVM自定义的框架构建类和测试类能够帮助验证师减轻环境构建的负担,将更多的精力集中于制定验证计划和创建测试场景。
systemverilog语法参考:IC验证——SystemVerilog学习_KGback的博客-CSDN博客_systemverilog验证
根据数字IC验证的基础知识,完整的验证平台包括激励发生器,DUT,参考模型,监视器和检查器等,在代码中表现为sequencer,DUT,reference model,monitor,scoreboard,同时为了为了使UVM验证平台更加模块化、通用化,增添了driver,sequence等组件。
详细参考:IC验证——UVM学习——验证平台中的组件_KGback的博客-CSDN博客
组件间的通信均由端口实现。
testbench中所有的基类都继承于uvm_component,都具有该类的特征。每个派生于uvm_component或其派生下的类在其new函数中要指明两个参数:name和parent
每个派生于该类或其派生下的类出来的类均是有生命周期的,例如uvm_sequence_item即是uvm_object派生出来的。
phase存在于每一个UVM的组件中,它们由一定执行顺序的任务或者函数组成。UVM也由phase来管理验证平台的运行,这些phase均以xxx_phase来命名,且都有一个类型为uvm_phase、名字为phase的参数。
一个验证平台可能会存在多个xxx_phase,需要根据具体情况对它们进行重载。执行顺序则根据UVM构建的树形结构从树根到树叶依次执行,例如先执行env中的phase,后执行driver中的。具体执行顺序可参照下图:
UVM通过objection机制来控制验证平台的关闭。
在每个phase中,UVM会检查是否有objection被提起(raise_objection),如果有,就等待这个objection被撤销(drop_objection)后停止仿真;如果没有,则马上结束当前phase。raise_objection和drop_objection是成对存在的,调用drop_objection前必须先调用raise_objection。而且raise_objection必须在main_phase中第一个小号仿真时间之前。
用来实现全局变量间的数据共享。
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)是一个参数化的类,内部参数是要寄信的类型。
当不同类中的不同函数具有某种共性的时候,可以使用field_automation机制自动实现这几个函数,那么在不同类中均可以实现这些函数。
该宏与verilog中的display类似,但它有三个参数,第一个参数是字符串,用于把打印信息归类;第二个参数也是字符串,是具体需要打印的信息;第三个参数是冗余级别,代表验证平台中的关键信息设置为UVM_LOW,非关键信息设置成UVM_HIGH,介于二者间的是UVM_MEDIUM。
该宏代表验证平台出现了重大问题而无法继续下去,它有两个参数,代表含义与·uvm_info前两个参数意义相同,但它打印第二个参数所示信息后,会直接调用verilog里的$finish函数结束仿真。
可以替代类的实例化及其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或者其他派生类继承而来。
factory机制带来的独特的实例化类的方式,功能类似于调用类中的new函数。通过该方式看可以使用factory机制中强大的重载功能。
参考链接:uvm_cmdline_processor - IC新手 - 博客园