求助:关于UVM中的config类
各位:
我在my_sequence类中需要使用的配置变量太多,因此想把它们放在一个config类中。我想把这个config类放在my_test中,用它来配置sequence的操作,但是有些问题,我好像描述不清,还是直接贴代码吧。
my_test.sv中:
......
video_config vcfg;
.....
virtual function void build_phase(uvm_phase phase);
.....
vcfg = video_config::type_id::creata("vcfg",this);
uvm_config_db#(video_config)::set(this,"venv.i_agt.sqr.vdo_seq","cfg",vcfg);
....
....
在my_sequence中:
.......
video_confg cfg;
.......
cfg.print();
......
这样,在每次执行到cfg.print()的时候,总是提示:Null objec access的Error。我猜问题在于没有把这个config类从my_test中传递到my_sequence中。可是该怎么传递呢,另外,我要对这个config类进行随机化,应该把assert(cfg.randomize())放在哪里比较合适呢?
我知道一部分问题所在了。
刚才在my_test中要display一个my_sequence的变量,用venv.i_agt.sqr.vdo_seq.name这样的方式,提示错误是:Could not find member ‘vdo_seq' in class 'my_sequencer' 。那么,该怎么样才能在其他class中找到sequence呢?
uvm sequence 不是component,层次结构的config机制是针对env中的component层次结构进行的。uvm sequencer是component,可以使用config机制。
你可以先把要配置的东西配置到sequencer中,然后在sequence中使用this.p_squencer.cfg来调用你说需要的config东西,也就是可以通过sequencer来牵线搭桥过度一下。
在my_test.sv中:
......
video_config vcfg;
.....
virtual function void build_phase(uvm_phase phase);
.....
vcfg = video_config::type_id::creata("vcfg",this);
uvm_config_db#(video_config)::set(this,"venv.i_agt.sqr.vdo_seq","cfg",vcfg);
....
....
在my_sequence中,尝试下面代码,或许可以的。
.......
video_confg cfg;
vritual taskbody
if(!uvm_config_db#(video_config)::get(this,get_full_name(),"cfg",cfg)) begin
`uvm_info("","",UVM_NONE)
end
.......
cfg.print();
endtask : body
谢谢两位!
真是帮了我大忙了。
3楼是正解, 必须用sequencer调度!
yes, put the config into your sequence and randomize it
最近研究了一下,可以不用sequencer 调度。
可以直接set到UVM_TEST_TOP这一层,然后sequence可以直接从UVM_TEST_TOP get。
四楼的代码还需要修改一下:
在my_test.sv中:
......
video_config vcfg;
.....
virtual function void build_phase(uvm_phase phase);
.....
vcfg = video_config::type_id::creata("vcfg",this);
uvm_config_db#(video_config)::set(this,"","cfg",vcfg);
....
....
在my_sequence中,尝试下面代码,或许可以的。
.......
video_confg cfg;
vritual taskbody
if(!uvm_config_db#(video_config)::get(this,get_full_name(),"cfg",cfg)) begin
`uvm_info("","",UVM_NONE)
end
.......
cfg.print();
endtask : body
cfg是可以直接配置到sequence中
uvm_config_db#(cfg)::set(null,"uvm_test_top.env.agt.sqr.seq","cfg",cfg)
这个写法是ok的;
似乎他的问题是在于cfg::type_type::create(), cfg不是一个component,不应该有父类this
学习一下。
if(!uvm_config_db#(video_config)::get(this,get_full_name(),"cfg",cfg))
这句话是什么意思啊?我才开始接触UVM
提一下代码:if(!uvm_config_db#(video_config)::get(this,get_full_name(),"cfg",cfg))中的this应该改为null,根据张强的UVM实战。get函数原型中第一个参数必须为component,sequence不是component,所以不能使用this指针。只能使用null或者uvm_root::get()。