UVM聚合参数类

<<UVM实战>>读书笔记

1、config_db配置参数聚合类

 对于一个大的项目来说,要配置的参数可能有千百个。如果全部使用config_db的写法,就会比较繁琐。

classs base_test extends uvm_test;
    function void build_phase(uvm_phase phase);
        super.build_phase(phase);
        uvm_config_db#(int)::set(this, "path1", "var1", 7);
        ......
        uvm_config_db#(int)::set(this, "path1000", "var1000", 999);
    endfunction
endclass    

一种比较好的方法就是将这1000个变量放在一个专门的类里面来实现:

class my_config extends uvm_object;
    rand int var1;
    ......
    rand int var1000;
    constraint default_cons{
    var1 = 7;
    ......
    var1000 = 999;
    }
    uvm_object_utils_begin(my_config)
        `uvm_field_int(var1, UVM_ALL_ON)
        ......
        `uvm_field_int(var1000, UVM_ALL_ON)
    `uvm_object_utils_end
endclass

base_test中通过config_db方式set 这个聚合类到各个需要的组件中:

classs base_test extends uvm_test;
    my_config cfg;
    function void build_phase(uvm_phase phase);
        super.build_phase(phase);
        cfg = my_config::type_id::create("cfg");
        uvm_config_db#(my_config)::set(this, "env.i_agt.drv", "cfg", cfg);
        uvm_config_db#(my_config)::set(this, "env.i_agt.mon", "cfg", cfg);
        ......
    endfunction
endclass

每个需要参数类的组件中通过注册的方式,省去get的语句:

class my_driver extends uvm_driver#(my_transaction);
    my_config cfg;
    `uvm_component_utils_begin(my_driver)
    `uvm_field_object(cfg, UVM_ALL_ON | UVM_REFERENCE)
    `uvm_component_utils_end
    extern task main_phase(uvm_phase phase);
endclass
task my_driver::main_phase(uvm_phase phase);
    while(1) begin
    seq_item_port.get_next_item(req);
    pre_num = $urand_range(cfg.pre_num_min, cfg.pre_num_max);
    ...//drive this pkt, and the number of preamble is pre_num
    seq_item_port.item_done();
end
endtask

在某个测试用例中想要改变某个变量的值,只需要在派生的test 的build_phase阶段修改变量的值:

class case100 extends base_test;
    function void build_phase(uvm_phase phase);
    super.build_phase(phase);
    cfg.pre_num_max = 100;
    cfg.pre_num_min = 8;
    ...
    endfunction
endclass

2、virtual sequence中实时配置参数聚合类,实现动态配置参数。

使用聚合参数后,可以将此参数类的指针放在virtual sequencer中:

这样,当sequence要动态地改变某个验证平台中的变量值时,可以使用如下的方式:

3、一些启发:

1.可以将验证场景相关的控制变量放到cfg object中,这样便于集中管理这些变量,而不是每个component中一些独立的控制变量,这样就避免了增减控制变量时的传递语句的书写过程

2.可以定义多个cfg类,每个agnet最好都有一个这样的cfg类,然后最顶层有个大的cfg类用来管理各个agnet的cfg类。

 

posted on 2019-03-01 09:54  hematologist  阅读(1146)  评论(0编辑  收藏  举报

导航