当前位置 博文首页 > Tommi_Wei的博客:UVM验证平台的运行

    Tommi_Wei的博客:UVM验证平台的运行

    作者:[db:作者] 时间:2021-09-09 13:40

    UVM验证平台的运行

    在这里插入图片描述

    phases机制

    神马是鸡汁,是不是,鸡汁汤包啊,不对不对,机制,就是一种规则。好比我们买东西需要钞票,看手机视频需要流量!UVM验证方法学中定义了phase机制!

    phase机制存在的意义在于:传统的硬件设计模型在仿真开始之前就已经完成了例化和连接,而SV的软件部分对象例化则在仿真开始之后执行。

    就像是一场战争一样,首先你要有战略的部署,各个部队的分工和职能,人员的分配,通信的方式等等。现在你是指挥家,你会怎么做?从局部出发还是从顶层到底层一步步的操作呢?

    同样UVM仿真也是一样的!需要PHASE机制!我们需要告诉UVM验证环境,先做什么,然后做什么?

    在这里插入图片描述
    看到这幅图,首先应该想到什么时候开始,什么时候结束?什么PHASE先执行,什么PHASE后执行!各个PHASE分别实现什么功能?

    所以我就带着大家一起学习一下!记住它们是有顺序的!自上到下!

    1. BUILD 部分
    2. RUN 部分
    3. FINAL部分

    是的,我们只需要几下这几个关键词就可以了!同时,也需要明白它们的含义!

    Build Phase: 创建高层次的组件才会有空间来容纳低层次的组件,所以它的执行顺序是自顶向下的;然后要进行各个组件的连接,所以执行connect_phase,首先要进行底层组件的连接,所以它的执行顺序是自底向上的;

    在所有的phase中,只有run_phase是一个可以消耗时间的任务,这意味该phase可以完成一些等待、激励、采样的任务;其他的的phase都是函数,必须立即返回(0耗时).

    在run_phase中,用户如果要完成测试,通常需要组织下面的激励序列:

    (1)上电和复位

    (2)config

    (3)main_phase

    (4)等待DUT完成测试

    Final phase:结束仿真!

    仿真的开始和结束

    不同于模块的测试,我们只需要点一下编译工具的开始,UVM仿真如何开始和结束呢?
    仿真的开始:

    (1)通过全局函数(由uvm_pkg提供)run_test()来选择性的指定要运行哪个uvm_test,这里的test均派生自uvm_test,指定的test将被例化并指定为顶层的组件;一般来说,run_test()函数可以在合适的module/program中的intial块中调用;
    (2)如果没有任何参数传递给run_test,可以在仿真时通过传递参数+UVM_TESTNAME=<test_name>指定仿真时要调用的uvm_test;当然,即使run_test函数在调用时已经有test参数传递,也可以通过 +UVM_TESTNAME=<test_name>从顶层覆盖指定的test;

    仿真的结束:

    uvm中通过objection机制来控制phase的运行与结束,objection机制一般用于run_phase和sequence的控制,uvm会检查该phase中是否有objection被提起(raise_objection),如果有,那么等待这个objection被撤销(drop_objection)后结束该phase的运行.两个方法的定义如下:

    参考文章:

    原文链接:https://blog.csdn.net/bleauchat/article/details/90673946

    尊重别人的知识产权,就是尊重自己的人格!

    cs