首页 > 其他分享 >uvm 用例选择机制(run_test)

uvm 用例选择机制(run_test)

时间:2023-09-25 10:48:27浏览次数:30  
标签:run driver 用例 uvm env test my

UVM的用例选择机制run_test()

1、编写基于UVM的最简单代码

harness.v

module harness(clk, rst);
input clk;
input rst;

endmodule
test_uvm.sv

```sv
`include "uvm_pkg.sv"
import uvm_pkg::*;

class my_driver extends uvm_driver;
    `uvm_component_utils(my_driver);// 注册my_driver,让my_driver类型存在一张表中,这样run_test("my_driver")或者my_driver::type_id::create("my_driver",this)才能找到my_driver类型,然后通过factory例化my_driver。
    function new(string name="my_driver", uvm_component parent=null); // 必须定义new函数,因为如果不定义,那么默认的new函数是无参函数,但是在create的时候需要一个有两个参数的函数。
        super.new(name.parent);
    endfunction

endclass

class my_env extends uvm_env;
    `uvm_component_utils(my_env);
    my_driver m_driver;

    function new(string name="my_env", uvm_component parent=null);
        super.new(name, parent);
    endfunction

    function void build_phase(uvm_phase phase);
        m_driver = my_driver::type_id::create("my_driver", this);  // 在my_env下例化了,my_driver,那么my_driver就是my_env的子节点。
    endfunction

    task main_phase(uvm_phase phase);
      phase.raise_objection(this);// 为了harness中有时间
         uvm_top.print_topology();   // 打印环境的拓扑结构
      #100;               // 为了harness中有时间
      phase.drop_objection(this);
    endtask
endclass

program automatic test;
  
    initial begin
        $display("hello");
     force harness.clk = 1'b1;  // force rtl中的信号
     force harness.rst = 1'b0;
        run_test();               // run_test()根据+UVM_TESTNAME=xxx参数,选择例化的component,xxx必须是注册了的component类型。这个语句一般在harness的initial语句中。
    end
endprogram

2、编写编译和执行的Makefile脚本(基于VCS)

Makefile

export file := test

run: cmp # 第一个目标就是默认目标,只敲make就是执行这个目标,目标依赖cmp,所以会先去执行cmp目标
    @echo run simv ....
    ./simv +UVM_TESTNAME=my_env # VCS默认生成的可执行文件就是simv,+UVM_TESTNAME为参数,用于$value$plusargs()接收。

cmp:
    vcs -full64 -sverilog $(file).sv -ntb_opts uvm-1.1 # -ntb_opt uvm-1.1是VCS编译的参数,目的是要VCS去吃UVM的库文件,这样`include "uvm_pkg.sv"的时候才能找到。
    # 本来想用+incdir+/software/synopsys/vcs/2018.09.sp2/etc/uvm-1.1方式来加UVM的库文件,但这种方式加库文件不彻底,编译没问题,执行的时候报错。

写好Makefile后,直接敲make file=test_uvm即可完成编译和执行

3、执行结果

img

可以看到,uvm_test_top为my_env,my_env下面包含了my_driver,由于uvm_driver中例化了uvm_analysis_port和uvm_seq_item_pull_port所以my_driver下面还有子节点。

4、原理分析

在my_env中使用了`uvm_component_utils(my_driver)宏对my_env进行了注册,这样my_env这个类就添加到了uvm_factory中的表中,运行simv后,执行到run_test()函数时会根据+UVM_TESTNAME选择注册的component类进行例化。

img

调用的run_test任务在uvm_globals.svh中,接着直接调用了uvm_root的run_test任务。

img

在uvm_root的run_test中先用$value$plusargs任务获取UVM_TESTNAME参数赋给test_name,我们传的参数是my_env;然后用factory根据名字test_name调用create_component_by_name函数查表例化component对象,并把对象实例名设为uvm_test_top。这个节点节点的父节点为null所以说这是根节点(其实还有uvm_top节点)

img

后续开始执行各个phase,环境自动跑起来。

标签:run,driver,用例,uvm,env,test,my
From: https://www.cnblogs.com/yuandonghua/p/17727370.html

相关文章

  • uvm 工厂机制3问
    UVM工厂机制3问1、注册在干啥注册时添加的uvm_object_utils(class_name)或者uvm_component_utils(class_name)展开后有一条m_uvm_object_registry_internal的宏,这个宏定义了一个uvm_object_registry#(T,Tname)的类型type_id。定义了这个类型,那么在代码编译的时候就要编译uvm_......
  • 一文弄懂Java线程池 + Runnable多线程 + 调用WebService接口
    大家好,我是哪吒。一、需求很简单根据接口文档,调用第三方webservice接口,拼接入参,处理回参。RPC调用Webservice接口是一种远程调用的方式,通过指定Webservice接口的调用地址、命名空间、调用的方法名调用远程接口获取结果。二、解决方案通过ExecutorService新建线程池;定义thread类,请......
  • iperf3:网络测试工具及测试用例+参数详解
    1,iperf3简介iPerf3是用于主动测试IP网络上最大可用带宽的工具。它支持时序、缓冲区、协议(TCP,UDP,SCTP与IPv4和IPv6)有关的各种参数。对于每次测试,它都会详细的带宽报告,延迟抖动和数据包丢失。它与原始iPerf不共享任何代码,也不向后兼容。它是一个C/S架构的测试工具,需要在同时运......
  • RunnerGo使用流程
    性能测试—计划管理新建计划:在左侧导航栏中,选择“性能测试”,点击“计划管理”进入计划管理界面,点击右上角新建计划来新建测试计划。任务类型选择后不可再更改。定时模式下,该计划内最多只能创建一个场景。普通任务:支持当即执行计划;定时任务:可预设计划开始运行的时间和频次,频......
  • 企业微信机器人Javascript调用例子
    constkey=""constoWX_URL='https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key='+key;constsent_msg={'msgtype':'text','text':{......
  • 已解决RuntimeWarning: invalid value encountered in double_scalars
    已解决RuntimeWarning:invalidvalueencounteredindouble_scalars文章目录报错问题解决方法声明报错问题之前在工作中遇到过这个坑,记录一下问题以及解决方法,不一定针对所有情况都能用,但是可以供大家参考。问题描述如下:RuntimeWarning:invalidvalueencounteredindouble_......
  • 用例图
    共性:都是从现有的用例中抽取出公共的那部分信息,作为一个单独的用例,然后通后过不同的方法来重用这个公共的用例,以减少模型维护的工作量。1、包含(include)    包含关系:使用包含(Inclusion)用例来封装一组跨越多个用例的相似动作(行为片断),以便多个基(Base)用例复用。基......
  • 全栈性能测试工具:RunnerGo
    随着自动化测试技术的不断进步,自动化测试已成为企业级应用的重要组成部分。然而,传统的性能测试工具往往复杂、繁琐,让企业陷入了两难的境地。软件测试正逐渐从手动测试向自动化测试转变,各种自动化测试工具和框架层出不穷,极大地提高了测试效率和质量。近年来出现的敏捷开发方法使得......
  • 全栈性能测试工具:RunnerGo
    随着自动化测试技术的不断进步,自动化测试已成为企业级应用的重要组成部分。然而,传统的性能测试工具往往复杂、繁琐,让企业陷入了两难的境地。软件测试正逐渐从手动测试向自动化测试转变,各种自动化测试工具和框架层出不穷,极大地提高了测试效率和质量。近年来出现的敏捷开发方法使得软......
  • kubernetes初始化时报错:CRI v1 runtime API is not implemented for endpoint \"unix
    近日,进行Kubernetes初始化时报错如下:[root@k8s-master~]#kubeadminit--kubernetes-version=v1.28.2--pod-network-cidr=10.244.0.0/16--service-cidr=10.96.0.0/12--apiserver-advertise-address=10.10.10.185[init]UsingKubernetesversion:v1.28.2[preflight]Runn......