精华内容
下载资源
问答
  • 1)基础用法:我们在工程中主要是对virtual的interface用到了config_db,大概流程如下: 首先我们在顶层中例化了interface,然后就用config_db::set把interface这样一个virtual interface放入resource_pool中,...

     

    初版内容:

        1)基础用法:我们在工程中主要是对virtual的interface用到了config_db,大概流程如下:

        首先我们在顶层中例化了interface,然后就用config_db::set把interface这样一个virtual interface放入resource_pool中,resource_pool也就是两张表,之后在所需要的时候调用config_db::get获取即可,config_db::set有4个参数,前两个组成一个范围,这个范围内的单位才可以通过get获取我放入资源池的数据,第三个参数是标签参数,在get时放入对应标签才能找到对应数据,第四个参数是我们需要放入资源池的数据。

        2)项目用法升级:

        上面是基础用法,实际中我们在virtual sequencer中放入,在子agent中get后,再次set到子agent的各个子component中,完成数据在各个agent之间的随机调用。

        3)底层原理分析:

        Virtual_interface解释:

        interface 和 module是一样的, 都是静态的变量, 也就是在程序开始时, 内存中就有了其实例.但是在class里使用virtual interface时之前有两部必须提前完成:

        定义:将接口作为一个类进行定义。

        实例化:在RTL级的顶层中对接口进行实例化。

        总结:定义一个interface,且实例化多个后,如果没有定义virtual,则在任何一个实例中修改了某个信号值,在其他实例中都会受到影响。如果定义了virtual,则每个实例独立。如果该interface只有一个实例,可用可不用virtual,有多个实例,需要virtual。更好的办法是,都加上virtual。virtual interface只是申明一个handle, 就好像一个指针一样, 可以再程序进行中进行construct, 所以class里必须是virtual interface

        Config解释:

           

        首先在官网的介绍中,uvm_config_db提供的是对uvm_resource_base和uvm_resource#(T)这两个类里(由uvm_object分出来)的内容的一些整体操作,如下图:

           

        图中的type和name就是刚才所说的放入数据的类型和标签。

           

           

        最下一层就是uvm_resource_pool了,它里面就是两个放资源的联合数组。一个按名字排的,一个按类型排的。

           

        最后梳理一下整个配置流程:

        首先在顶层调用config_db::set,该源码中主要是对rsrc_t(uvm_config_db类)的初始化,然后调用uvm_resource里面的write和set函数。write的作用主要是把传递进来的数据赋值给uvm_resource类的val,这个值是给下其它一些功能使用的(这个我们不关心)。然后是set函数,这就是真正把数据放入资源池的操作了。

        相应的config_db::get就是相应的逆向操作。获取配置的类型和标签,去资源池搜索目标数据,最后通过uvm_resource#(T)中的read函数读出数据。

    二次更新内容:

        我的工程中主要是对virtual interface用到了config_db,流程是这样的:

        1.在TB(testbench)中例化了interface,然后通过config_db::set来把interface这个样的一个virtual interface放进resource_pool里面,resource_pool也就是两张表。放起来的目的是为了让需要使用virtual interface的component可以获取这个virtual interface。

    module tb;
      reg clk;
      
      always #10 clk =~ clk;
      DUT_if 	_if (clk);
    
    float64_add_DUT_RTL float64_add_DUT_RTL_1(
    	.clk(clk),
    	.rstN(_if.rstN),
    	.start(_if.start),
    	.fin(_if.fin),
    	.a(_if.a),
    	.b(_if.b),
    	.return_value(_if.return_value));
    
      test t0;
      
      initial begin
        clk <= 0;
        uvm_config_db#(virtual DUT_if)::set(null, "uvm_test_top", "DUT_vif", _if);//注册interface
        run_test("test");
      end
      
      initial begin
        $dumpfile ("dump.vcd");
        $dumpvars;
      end
    endmodule

        config_db::set一共有4个参数。

        a. 头两个参数的作用是合起来形成一个范围,只有在这个范围内的单位才可以通过config_db::get来获得我们set的东西。

        b. 第三个参数是我们自己瞎起的一个名字,就是个string型的标签,到时候系统在执行config_db::get的时候,就依据我们起的这个名字以及我们规定的类型(在这里类型就是virtual DUT_if)来在资源池里找我们要的东西。

        c. 第四个参数就是我们正儿八经要放进资源池的东西,我想应该就是放了个地址进type表和name表里面。

        2.那么谁要用到virtual interface呢,是agent中的monitor,driver。于是我们这么做,在test中通过config_db::get拿到已经写入资源池的virtual interface,然后通过config_db::set来重新设置一个virtual interface,并且设置它的范围是例化出来的ageent a0下面的所有单元都有权利调用它。

    class test extends uvm_test;
      `uvm_component_utils(test)
      function new(string name = "test", uvm_component parent=null);
        super.new(name, parent);
      endfunction
      
      env e0;
      virtual DUT_if vif;
      
      virtual function void build_phase(uvm_phase phase);
        super.build_phase(phase);
        e0 = env::type_id::create("e0", this);
        if (!uvm_config_db#(virtual DUT_if)::get(this, "", "DUT_vif", vif))
          `uvm_fatal("TEST", "Did not get vif")
          
          uvm_config_db#(virtual DUT_if)::set(this, "e0.a0.*", "DUT_vif", vif);//
      endfunction

        这里我们注意,get函数的头两个参数就很简单了,因为跟set一样,头两个参数的作用只是指定范围,正常情况下都是在哪用在哪get,应该不会有故意要在A类里给B类get一个资源的这种操作,所以无脑this和""就可以了。

        后两个参数就是怎么set的怎么get。

        这样config_db做资源的传递就完成了。

        3.最后是具体到真正的使用者怎么用这个virtual interface。

        monitor的run_phase里面:

    class monitor extends uvm_monitor;//monitor属于agent(a0),所以它是有权限来取vif的
      `uvm_component_utils(monitor)
      function new(string name="monitor", uvm_component parent=null);
        super.new(name, parent);
      endfunction
      
      uvm_analysis_port  #(transaction_item) mon_analysis_port;
      virtual DUT_if vif;
      uvm_event ev;
      
      virtual function void build_phase(uvm_phase phase);
        super.build_phase(phase);
        if (!uvm_config_db#(virtual DUT_if)::get(this, "", "DUT_vif", vif))
          `uvm_fatal("MON", "Could not get vif")
        mon_analysis_port = new ("mon_analysis_port", this);
      endfunction

        driver的run_phase里面:

    class driver extends uvm_driver #(transaction_item);              
      `uvm_component_utils(driver)
      function new(string name = "driver", uvm_component parent=null);
        super.new(name, parent);
      endfunction
      //声明interface
      virtual DUT_if vif;
      uvm_event ev;
      
      virtual function void build_phase(uvm_phase phase);
        super.build_phase(phase);
        if (!uvm_config_db#(virtual DUT_if)::get(this, "", "DUT_vif", vif))
          `uvm_fatal("DRV", "Could not get vif")
        ev = uvm_event_pool::get_global("ev_ab");
      endfunction

        以上都是初级使用,在项目中不可能只有一个agent,下面升级下难度:(实用干货,高能注意)

        当我们使用virtual_sequencer将多个agent包括起来时,你考虑过如何让config_db正确下发到对应的agent的组件没有?

        这里我们可以采用分层法,如下所示:        

        可以将结构拆成三层,顶层下发到各个agent,agent收到后再次下发,最后使driver等拿到数据。

                              virtual_sequencer中的db进行set ---> 各个agent中的db先get再set ---> 各个组件的db进行get

        暂时写到这,之后有空再补充。

         

    展开全文
  • 文章目录一、工厂机制factory二、组件配置机制uvm_config_db2.1.配置组件的DUT接口方式 一、工厂机制factory 二、组件配置机制uvm_config_db 2.1.配置组件的DUT接口方式 ...

    一、组件配置机制uvm_config_db

       在验证环境的创建过程build_phase中,除了组件的实例化配置也是必不可少的。为了验证环境的复用性,通过外部的参数配置,使得环境在创建时可以根据不同的参数来选择创建的组件类型、组件实例数目、组件之间的连接以及组件之间的运行模式等。UVM提供了uvm_config_db配置类以及几种方便的变量设置方法来实现仿真时的环境控制,常见的uvm_config_db类的使用方式包括:

    • 传递virtual interface到环境中
    • 配置单一变量值,例如int、string、enum等;
    • 传递配置对象(config_object)到环境

    1.1.virtual interface的传递(重要)

       虽然SV可以通过层次化的interface的索引完成传递,但是这种传递方式不利于软件环境的封装和复用。通过使用uvm_config_db配置机制来传递接口,可以将接口的传递与获取彻底分离开。
       接口传递从硬件世界到UVM环境可以通过uvm_config_db来实现,在实现过程中应当注意:

    • 接口传递应发生在run_test()之前。这保证了在进入build_phase之前,virtual interface已经被传递到uvm_config_db中。
    • 用户应当把interface与virtual interface区分开来,在传递过程中的类型应当为virtual interface,即实际接口的句柄
    interface   intf1;       //接口定义
        logic   enable = 0;
    endinterface
    
    class  comp1  extends  uvm_component;      //组件配置接口
        `uvm_component_utils(comp1)
        virtual   intf1  vif;          //接口声明
        ...
        function void build_phase(uvm_phase phase);
           if(!uvm_config_db #(virtual intf1)::get(this,"","vif",vif)) begin     //**3. 获取配置接口vif = intf**
              `uvm_error("GETVIF","no virtual interface is assigned")
           end
           `uvm_info("SETVAL",$sformatf("vif.enable is %b before set",vif.enable),UVM_LOW)
           vif.enable = 1;
           `uvm_info("SETVAL",$sformatf("vif.enable is %b after set",vif.enable),UVM_LOW)       
        endfunction
    endclass
    
    class  test1  extends  uvm_test;       //测试用例层,可在此进行接口配置,也可在顶层配置
        `uvm_component_utils(test1)
        comp1    c1;
        ...
    endclass
    
    intf1    intf();                 //**1. 接口配置前,例化借口**
    initial  begin
        uvm_config_db #(virtual intf1)::set(uvm_root::get(),"uvm_test_top.c1","vif",intf)     //**2. 启动接口配置**
        run_test("test1");      //在run_test()之前完成接口配置
    end
    

    输出结果:

    UVM_INFO @ 0: reporter [RNTST] Running test test1...
    UVM_INFO @ 0: uvm_test_top.c1 [SETVAL] vif.enable is 0 before set
    UVM_INFO @ 0: uvm_test_top.c1 [SETVAL] vif.enable is 1 before set
    

    1.2.配置单一变量

      在各个test中,可以在build_phase阶段对底层组件的各个变量加以配置,进而在环境例化之前完成配置,使得环境可以按照预期运行。

    class  comp1  extends  uvm_component;      //组件
        `uvm_component_utils(comp1)
        int   val1 = 1;
        string   str1 = "null";
        ...
        function void build_phase(uvm_phase phase);   //在build_phase阶段进行配置
           `uvm_info("SETVAL",$sformatf("val1 is %d before get",val1),UVM_LOW)       
           `uvm_info("SETVAL",$sformatf("str1 is %d before get",str1),UVM_LOW)  
           uvm_config_db #(int)::get(this,"","val1",val1);        //使用get()方法获取配置
           uvm_config_db #(string)::get(this,"","str1",str1); 
           `uvm_info("SETVAL",$sformatf("val1 is %d after get",val1),UVM_LOW)       
           `uvm_info("SETVAL",$sformatf("str1 is %d after get",str1),UVM_LOW)  
        endfunction
    endclass
    
    class  test1  extends  uvm_test;       //测试用例层, 启动配置
        `uvm_component_utils(test1)
        comp1    c1;
        ...
        function void build_phase(uvm_phase phase);
           uvm_config_db #(int)::set(this,"c1","val1",100);        //使用set()方法获取配置
           uvm_config_db #(string)::set(this,"c1","str1","comp1"); 
           c1 = comp1::type_id::create("c1");   
        endfunction
    endclass
    

    输出结果

    UVM_INFO @ 0: uvm_test_top.c1 [SETVAL] val1 is 1 before get
    UVM_INFO @ 0: uvm_test_top.c1 [SETVAL] str1 is null before get
    UVM_INFO @ 0: uvm_test_top.c1 [SETVAL] val1 is 100 after get
    UVM_INFO @ 0: uvm_test_top.c1 [SETVAL] str1 is comp1 after get
    

    1.3.config object对象传递(重要)

      在test配置中,需要配置的参数不只是数量多,可能还分属于不同的组件。对这么多层次的变量做出类似上边的单一变量传递,需要更多的代码,容易出错且不易复用。如果整合各个组件中的变量,将其放置在一个uvm_object中,再对中心化的配置对象进行传递,将有利于整体环境的修改维护,体改代码的复用性。

    class  config1  extends  uvm_object;         //**1. 创建一个配置类,将需要配置的变量放于其中**
       `uvm_object_utils(config1)
       int   val1 = 1;
       int   str1 = "null";
       ...
    endclass
    
    class  comp1  extends  uvm_component;      //组件
        `uvm_component_utils(comp1)
        config1      cfg ;                 //声明配置类句柄
        ...
        function void build_phase(uvm_phase phase);
           uvm_object    tmp;         //声明类句柄
           uvm_config_db #(uvm_object)::get(this,"","cfg",tmp);     //**3. 获取变量配置**
           void`($cast(cfg,tmp));         //类型转韩,将传到tmp中的值赋给cfg
           `uvm_info("SETVAL",$sformatf("cfg.val1 is %d after get",cfg.val1),UVM_LOW)       
           `uvm_info("SETVAL",$sformatf("cfg.str1 is %d after get",cfg.str1),UVM_LOW)  
        endfunction
    endclass
    
    class  test1  extends  uvm_test;       //测试用例层, 启动配置
        `uvm_component_utils(test1)
        comp1    c1, c2;
        config1  cfg1, cfg2;
        ...
        function void build_phase(uvm_phase phase);
           cfg1 = config1::type_id::create("cfg1");
           cfg2 = config1::type_id::create("cfg2");
           c1 = comp1::type_id::create("c1");      
           c2 = comp1::type_id::create("c2");       //创建对象
           cfg1.val1 = 30;
           cfg1.str1 = "c1";
           cfg2.val1 = 50;
           cfg2.str1 = "c2";
           uvm_config_db #(uvm_object)::set(this,"c1","cfg",cfg1);     //**2. 启动变量配置**       
           uvm_config_db #(uvm_object)::set(this,"c2","cfg",cfg2);     //启动变量配置 
        endfunction 
    endclass
    

    输出结果

    UVM_INFO @ 0: uvm_test_top.c1 [SETVAL] cfg.val1 is 30 after get
    UVM_INFO @ 0: uvm_test_top.c1 [SETVAL] cfg.str1 is c1 after get
    UVM_INFO @ 0: uvm_test_top.c2 [SETVAL] cfg.val1 is 50 after get
    UVM_INFO @ 0: uvm_test_top.c2 [SETVAL] cfg.str1 is c2 after get
    

    2.4.配置说明

      通过UVM配置机制,设置对象的变量;

    uvm_config_db #(type)::get(                         //type类型可以是int、string等类型,也可以是接口interface、对象object等类型
                    uvm_component      context,         //组件中的目标,常设置为this(针对类),或者null(非类,如module模块)
                    string             instance_name,   //路径索引,相对于第一个参数的相对路径
                    string             field_name,      
                    inout  T           variable         //2. **底层获取变量值,即variable = field_name,**如果不设置,变量保持原始值       
    );
    
    uvm_config_db #(type)::set(                         //set()与get()中的类型type应该保持一致
                    uvm_component      context,          //组件中的目标,常设置为this(针对类),或者null(非类,如module模块)
                    string             instance_name,    //路径索引(set操作的目标组件实例名)
                    string             field_name,
                    T                  value            //1. **顶层设置变量值,即field_name = value**
    );
    
    
    1. 在使用set()/get()方法时,传递的参数类型应当保持一致。对于uvm_object等实例的传递,如果get类型和set类型不一致,应当首先通过$cast()完成类型转换,再对类型转换后的对象进行操作。
    2. 在参数传递时,“”表示默认当前层次,也可以使用通配符 * 来表示任意层次。需要注意“*.comp”与“*comp”的区别,前者表示在当前层次下所有名称为“comp”的组件,而后者表示包括当前层次以及当前层次以下所有名为“comp”的组件。
    3. 在module环境中使用uvm_config_db::set(),则传递的第一个参数一般用来表示当前的层次(用this表示),此时第二个参数为相对路径;如果当前层次为最高层,用户可以设置为null(module模块,非类不可以用this),此时第二个参数为绝对路径(uvm_test_top.xxx);也可以设置为uvm_root::get()来表示uvm_root的全局顶层实例。
    4. 在使用uvm_config_db::get()方法时,添加便于调式的语句。例如通过UVM报告信息得知get()方法中配置的变量是否从uvm_config_db获取到,如果没有获取到,是否采取其他必要措施。
    5. 在set()方法第一个参数使用当前层次的前提下,对于同一组件的同一变量,如果有多个高层组件对该变量进行配置,那么较高层组件的配置会覆盖较低层的配置;但是如果是同一层次组件对该变量进行配置时,应当遵循后面的配置覆盖前面的配置

    二、配置机制的调试

      由于配置类型信息types在set()/get()方法使用中如果不匹配,EDA工具在get()时并不会报错,因此需要手动添加调试信息。常见方法如下:

    1. 检查read_by_name/_type()或者get()函数的返回值,如果获取不到,打印错误信息
    if(!uvm_config_db #(int unsigned)::get(this,"","item_count",item_count))
        `uvm_info("SETVAL",$sformatf("item_count isnot available for %s",this.get_full_name),UVM_LOW)  
        
    
    1. 使用仿真命令选项,跟踪set()和get()信息;
    • +UVM_CONFIG_DB_TRACE
    • +UVM_RESOURCE_DB_TRACE

    三、关于uvm_resource_db的使用说明

      对变量的配置除了采用uvm_config_db之外,还可以采用uvm_resource_db进行配置。二者之间是继承关系,uvm_resource_db是父类,uvm_config_db是子类。
      uvm_resource_db虽然也是一种用来共享数据的类,但是与uvm_config_db相比,有 一个缺点就是层次的缺失和因此带来的自顶向下的配置覆盖关系的缺失

      因此应该养成使用uvm_config_db的习惯,原因如下:

    • uvm_resource_db采用的是“last write wins”即对同一配置,最后写入的有效;而uvm_config_db采取的是“parent wins”,它会按照层次采取最顶层配置优先
    • uvm_resource_db给人带来的困惑是,如果高层次和低层次都对同一配置变量进行写入,那么在build阶段,由于采取的是top_down的执行顺序,低层次的配置写入发生在最后,反而会作为有效值写入。因此uvm_resource_db无法实现层次化的覆盖,这不利于集成和复用。

    因此实际使用中,应该尽可能的只是用uvm_config_db::set()/get()方法,依赖它们就可以完成配置,并且有利于环境的集成和复用。

    展开全文
  • 但是在使用uvm_set_congfig_int时,不能使用uvm_config_db#(int)::get()来获得参数,必须使用get_config_int()函数或uvm_config_int::get()来获得参数。 <sim command> +uvm_set_config_int = <comp>,...

    验证时,在sim command中使用+uvm_set_config_int命令配置环境参数是一种很常用的方法。但是在使用uvm_set_congfig_int时,不能使用uvm_config_db#(int)::get()来获得参数,必须使用get_config_int()函数或uvm_config_int::get()来获得参数。

    <sim command> +uvm_set_config_int = <comp>,<field>,<value>
    //这里举例配置图像的帧数、行数和每一行的像素点素
    
    <sim command> +uvm_set_config_int ="uvm_test_top.env.scb,frame_num,24"
    <sim command> +uvm_set_config_int ="uvm_test_top.env.scb,height_num,25"
    <sim command> +uvm_set_config_int ="uvm_test_top.env.scb,row_num,72"
    
    //在scoreboard中接收
    class test_scb extends uvm_scoreboard;
        int        frame_num;
        int        height_num;
        int        row_num;
    
        function void connect_phase(uvm_phase phase);
            super.connect_phase(phase);
            //get_config_int可以获得参数的set值
            get_config_int("frame_num",frame_num);
            get_config_int("height_num",height_num);
            get_config_int("row_num",row_num);
            //uvm_config_int::get也能获取参数的set值
            uvm_config_int::get(this,"*","frame_num",frame_num);
            uvm_config_int::get(this,"*","height_num",height_num);
            uvm_config_int::get(this,"*","row_num",row_num);
            //uvm_config_db#(int)::get()不能获取参数的set值
            //uvm_config_db#(int)::get(this,"*","frame_num",frame_num);
            //uvm_config_db#(int)::get(this,"*","height_num",height_num);
            //uvm_config_db#(int)::get(this,"*","row_num",row_num);
        endfucntion : connect_phase
    endclass : test_scb

    set/get_config_string和set/get_config_object与set/get_config_int同理,是不可以与uvm_config_db混用的。

    展开全文
  • [UVM]uvm_config_db使用方法总结

    千次阅读 2021-01-30 16:27:25
    uvm_config_db使用方法总结

                           uvm_config_db使用方法总结

     

      The configuration database provides access to a centralized database, where type specific information can be stored and received. config_db can contain scalar objects, class handles, queues, lists, or even virtual interfaces.

      The database has both a name table and a type table and each resource is entered into both. Resources are stored in a database so that each resource can be retrieved by name or by type, and the database is globally accessible.

     

    一、uvm_config_db get and set

    uvm_config_db::set and uvm_config_db::get methods are used to store and retrieve the information from the database respectively.

     

     1.1 uvm config db set method

    void uvm_config_db#(type T = int)::set(uvm_component cntxt, string inst_name, string field_name, T value);

    Where,

    • T  is the type of element being configured. (Type can be scalar objects, class handles, queues, lists, or even virtual interfaces),总之,T代表要set的数据类型
    • cntxt is the hierarchical starting point of where the database entry is accessible.其中cntxt + inst_name = 目标对象的Hierarchy,通常把cntxt设为uvm_root::get(),inst_name用$psprintf("uvm_test_top.env.xxx")来产生
    • inst_name is a hierarchical path that limits the accessibility of the database entry.
    • field_name相当于一个label,get与set要一致才能正确拿到这个config value。如果需要向同一个Hierarchy set同一个对象的多个实例,可以用使用$psprintf("mon_vif[%0d]", i)来做label,通过generate块来set
    • 当set给agent时,可以使用通配符:$psprintf("uvm_test_top.top_env.o_dl_env.o_l1_agent.*")

    • 一般的,推荐的做法是:先把资源set到env,然后再从env向下分发

    example:

    top.env.agent.monitor
    top.*                       – all of the scopes whose top-level component is top.
    top.env.*.monitor   – all of the scopes in env that end in the monitor;

    • field_name is the label used as a lookup for the database entry
    • value is the value to be stored in the database

     

     1.2 uvm_config_db set example

    Below example shows, setting the interface handle intf, type mem_if, label mem_intf with global scope.

    mem_if                 intf(clk,reset);  //interface instance
    
    uvm_config_db#(virtual mem_if)::set(null, "*", "mem_intf", intf);  //set method
    • The above diagrams illustrate how a resource whose name is mem_intf and type is mem_if is stored in the pool.
    • 其中null与uvm_root::get()是等价的,都是set到uvm_root
    • uvm_config_db虽然强大,但是用起来并不方便。所以通常像config这种东西,都在top上实例化,然后把指针赋值给env,例如this.env.top_cfg = cfg。

     

     1.3 uvm config db get method

    bit uvm_config_db#(type T=int)::get(uvm_component cntxt, string inst_name, string field_name,ref T value);
    • value is the variable to which the value is to be retrieved from the database

    * The other fields are the same as in set method.
    * The method returns 1 if it is successful and 0 if there is no such resource of this type in the database.

     

     1.4 uvm config db get method

    Below example shows. Using the get method to get a virtual interface handle from a database and assigns it to mem_vif. If the get method fails, the fatal message will be displayed

    virtual interface mem_if         mem_vif;    //virtual interface declaration
    
    if( !uvm_config_db#(virtual mem_if)::get(this,"*", "mem_intf", mem_vif)) begin
      `uvm_fatal(get_full_name(), {"virtual interface must be set for:", ".mem_vif"} ); //get method
    end

     

    展开全文
  • uvm_config_db的用途大概有如下三种: 传递virtual interface到环境中。 设置单一变量值,如int.string.enum等。 传递配置对象(config object)到环境中 在使用uvm_config_db的配置方法时,下面给出一些建议...
  • UVM】关于uvm_config_db的详细用法(解惑)

    万次阅读 多人点赞 2018-08-27 19:40:13
    如何在有效的使用uvm_config_db来搭建uvm验证环境对于许多验证团队来说仍然是一个挑战。一些验证团队完全避免使用它,这样就不能够有效利用它带来的好处;另一些验证团队却过多的使用它,这让验证环境变得不稳定。 ...
  • uvm_config_db

    千次阅读 2017-01-28 18:58:56
    功能意义 命令解析 ...细节注意功能意义uvm_config_db#(T) 是一个类,简化interface,用于配置uvm_component实例。命令解析class hierarchyuvm_config_db#(T) 或者 uvm_config_dbT就是待配置选项的type类
  • [UVM]uvm_config_db and uvm_resource_db

    千次阅读 2019-08-07 14:49:46
    uvm_config_db如果有多个set,则按照“父获胜,同一层次内最后写入获胜”的顺序,而uvm_resource_db直接按照"最后写入获胜"的顺序。uvm_config_db更便于在test中更改配置(假设在env中已经有配置,而test的级别高于...
  • uvm_config_db#(T)是一个类,用于配置uvm_component实例的资源;uvm_config_db主要是提供了一种资源配置的简化方法。 2. 命令解析 class hierarchy uvm_config_db#(T) 或者 uvm_config_db T 就是待配置选项的...
  • 这篇文章将解释配置数据库(uvm_config_db)是如何工作的。 在配置类中,我们使用uvm_config_db来存储jelly_bean_if,jelly_bean_env_config和两个jelly_bean_agent_configs。 这篇文章将分析配置数据如何存储和检索...
  • UVM中的配置机制uvm_config_dbuvm_config_db机制用于在UVM平台间传递参数。它们通常是成对出现的,set 寄信,而get函数是收信。config 机制大大提高了UVM的验证灵活性。例如module 和 class 连接通过config_db ...
  • 静态类(static class)、成员类(member class)、局部类(local class)、匿名类 (anonymous class)...uvm_config_db 优先级 scope, 资源存给谁,谁可以取 override get set history uvm_pool
  • uvm_config_db使用方法总结 声明:本文参考gsithxy的文章 1. uvm_config_db get and set uvm_config_db::set and uvm_config_db::get methods are used to store and retrieve the information from the database ...
  • uvm_config_db使用注意

    千次阅读 2014-12-24 16:56:31
    uvm_config_db将数据存入数据库中供set, get, 注意这里存进去了就是一个半全局的变量,如果有一处改变了就会对其他使用了相同值的变量造成影响,和全局变量效果是一样的。因此尽量单向使用uvm_config_db get到的对象...
  • uvm_config_db性能权衡

    千次阅读 2015-01-22 10:09:44
    根据mentor的推荐,尽量少用uvm_config_db,因为uvm_config_db是一个数据库,使用正则表达式匹配所有结果,如果数据库过大会影响验证平台性能。但是同时也提到性能与方法学乃至OOP有一个trade off. 这里几个减少uvm_...
  • uvm_config_dbUVM验证环境中的应用

    千次阅读 2017-05-10 01:11:00
    如何在有效的使用uvm_config_db来搭建uvm验证环境对于许多验证团队来说仍然是一个挑战。一些验证团队完全避免使用它,这样就不能够有效利用它带来的好处;另一些验证团队却过多的使用它,这让验证环境变得不稳定。 ...
  • uvm_config_db简介

    千次阅读 2014-12-23 10:58:06
    我发现中文社区里的文章怎么都那么奇怪呢,都讲uvm_config_db是一种特殊的参数配置“机制”,看得我一头雾水,还以为是sv的一种特有的语法啥的。看了英文社区一下子就明白了: uvm_config_db是个uvm中带template的...
  • UVMuvm_config_db tips

    2018-09-19 11:02:54
    uvm_config_dbUVM时经常被用到的,但最近在调试同事环境的时候,有一点跟我之前的认知是不一样,所以在这记录一下。 场景如下: class env extends uvm_env; ... function void build_phase(uvm_phase phase...
  • uvm_config_db.svh

    2020-03-23 19:46:17
    // // If the run-time ~+UVM_CONFIG_DB_TRACE~ command line option is specified, // all configuration DB accesses (read and write) are displayed. //-----------------------------------------------------...
  • UVM基础——config_db机制UVM中的路径config_db基础set和get函数的参数省略get语句跨层次的多重设置非直线的设置和获取config_db机制对通配符的支持check_config_usegeinterface传递变量设置object传递建议 ...
  • 目录 UVM中的路径 set与get函数的参数 *省略get语句 *跨层次的多重设置 *同一层次的多重设置 *非直线的设置与获取 *config_db机制对通配符的支持 *check_config_usage set_config与get_config config_db的调试 UVM中...
  • 一 报告错误 vcs三步方式编译过程中,在第二步vcs编译worklib时报告 Error-[ICTTFC] Incompatible complex type usage the type of the actual is ‘class top.vip_vir_seq’,...Source info: uvm_config_db#(top.cfg):
  • 我们知道利用UVM中的config_db机制,可以很方便的在组件之间传递参数,本文主要记录一下,如何利用config_db机制在组件之间传递数组和枚举类型。 一、利用config_db传递数组 首先需要利用typedef定义一个用户指定...
  • uvm_set/get_config_string

    2021-06-30 14:39:34
    它们分别对应uvm_config_db#(string) ::set/get和uvm_config_db#(uvm_object) ::set/get config_db比set/get_config强大的地方在于,它设置的参数类型并不局限于以上三种。常见的枚举类型、virtual ...
  • uvm config_db/config文件

    2021-03-09 12:03:41
    config文件: `ifndef xxx_CFG_SV `define xxx_CFG_SV class xxx_cfg extends uvm_object; `uvm_object_utils(layer_agent_cfg) bit is_active = 1; //virtual rst_if vif; //string REPORT_TAG = "XXX_CFG" ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 934
精华内容 373
关键字:

uvm_config_db