UVM学习方法—基础入门篇(二)

之前在文章中已经介绍过UVM的优势以及学习方法,UVM已经成了学习数字验证的入门课程,想必大家都知道它的重要性。对于想要往验证发展的同学,一定要了解UVM。下面IC修真院继续带大家来了解一下UVM的一些知识点。

UVM基础

UVM的全程为,Universal Verification Methodology,意为通用验证方法学,前身是OVM,貌似是mentor弄的一套东西,本质上,验证方法学只是对systemverilog进行一些常用类的封装,按照一套统一的流程,进行验证活动,经过多次对比之后,发现方法学只是各个验证公司间博弈的产物,eetop上有人说过真正牛逼的验证应该是自己有一套合适的验证方法,鉴于他的名字已经叫“通用”了,所以应该对各个验证结构来说是比较通用的。

在这里插入图片描述

一、factory机制
在uvm平台中,一个利用`uvm_component_utils注册的类,只要被实例化了,就会自动调用它的main_phase。run_test(“class name”)会根据类名创建一个实例,如果这个类利用工厂机制注册了,则它的main_phase会被自动调用。

拓展知识点:
+UVM_TESTNAME=test_base这个测试用例是如何传入验证平台进去的? UVM中的executionmanager组件(uvm_root)会去根据UVM_TESTNAME关键词读入test_base,读入的方法是test.sv里面的run_test(),而且会同时利用UVMfactory的机制去创建一个uvm_test_top的顶层。
哪一句代码会引起+UVM_TESTNAME=test_base传入进来?
run_test();run_test( ) 还会去创建uvm_test_top的树形结构,做为做顶层的树根存在,是整个UVM环境的中的最高级别的class。
uvm_root::get()如何使用+UVM_TESTNAME中传入进来的test_base?
uvm_root是个单独的,最顶层的class。会将整个UVM的架构从test顶层再往下去拓展。

二、objection机制

  1. 在每个phase中,uvm会检查是否有objection被提起,如果有,则等待这个objection被撤销之后停止仿真;如果没有则马上结束当前phase。
  2. raise_objection语句必须在main_phase中第一个消耗仿真时间的语句之前,否则没有作用。
  3. 注意仿真时间和运行时间。

在进入到某一phase时,UVM会收集此phase提出的所有objection,并且实时监测所有objection是否已经被撤销了,当发现所有都已经撤销后, 那么就会关闭此phase,开始进入下一个phase。当所有的phase都执行完毕后,就会调用$finish来将整个的验证平台关掉。如果UVM发现此phase没有提起任何objection,那么将会直接跳转到下一个phase中。

由于run_phase与动态运行的phase是并行运行的,如果12个动态运行的phase有objection被提起,那么run_phase根本不需要raise_objection就可以自动执行。对于run_phase来说,有两个选择可以使其中的代码运行:第一是其他动态运行的phase中有objection被提起。在这种情况下, 运行时间受其他动态运行phase中objection控制,run_phase只能被动地接受。第二是在run_phase中raise_objection。这种情况下运行时间完全受run_phase控制。

phase的引入是为了解决何时结束仿真的问题,它更多面向main_phase等taskphase, 而不是面向functionphase。在sequence中提起sequencer的objection,当sequence完成后,再撤销此objection。这种方式是UVM提倡的方式。

UVM的设计哲学就是全部由sequence来控制激励的生成,因此一般情况下只在sequence中控制objection。

三、interface

  1. 应该尽量杜绝在验证平台中使用绝对路径,避免使用绝对路径的第一个方法是使用宏,第二是使用interface。
  2. 在类中不可以声明interface,只可以声明virtual interface。
  3. 如何把top_tb中的interface和cdriver中vif连接起来,使用config_db机制,分为set和get。
  4. Set的第二个参数是寄信的目的地在uvm树形结构中的路径。
  5. 通常是driver以及i_mon以及o_mon需要接口,而且driver和i_mon共用一个接口。
    在SystemVerilog中使用interface来连接验证平台与DUT的端口,把接口的interface单独做成组件,在需要用到interface的组件调用。

四、build_phase

  1. 在uvm启动之后,build_phase会自动执行,在build中主要是通过config_db机制来传递一些数据,以及实例化一些成员变量等。
  2. build_phase是function,main_phase是taskphase。
  3. uvm_fatal 宏在调用之后,会调用$finish来自动结束仿真。
  4. `uvm_fatal之后两个参数,uvm_info有三个参数,冗余度对于fatal来说没有意义。
  5. 无论传递给run_test的参数是什么,它创建的实例名字都是uvm_test_top。
  6. Config_db使用双冒号作用域是因为这两个函数是静态函数。

五、transaction
1.通过transaction实现由信号级到事务级的转换。
2.uvm_component_utils注册的变量具有静态生命周期,比如driver。而由uvm_object_utils注册的变量具有动态生命周期,比如transaction。
在调用transaction的randomize被调用之后,post_randomize会被自动调用。

六、uvm树形结构

  1. uvm具有树形结构,树的根节点就是由run_test创建的uvm_test_top。
  2. Build_phase自上而下的运行,即从树根到树叶,直到把所有的build_phase都执行完毕,才开始执行后面的其他phase。

其实,想要往验证方向发展,学UVM仅仅是入门,想要拿到更高的薪资,有更好的发展前景,还要掌握更多知识。比如SoC芯片的设计验证相关知识。想要了解更多知识,可以关注IC修真院哦!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值