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
————————————————
版权声明:本文为CSDN博主「SD.ZHAI」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_46022434/article/details/105604729

浙公网安备 33010602011771号