UVM初学篇 -(20)UVM config_db配置数据机制
UVM验证平台中通信的方式许多,但是由于验证平台的复杂性,使得平台的通信变得繁琐,UVM提供了一种简单高效的通讯方式,就是config_db。例如在DADD验证平台中,平台driver中是通过条理化的访问去驱动interface的,但是对于复杂的DUT来讲,例化条理比力多,改动起来比力繁琐,这种方法显然是不可行了,config_db是一种很好的方法。
3.4.1 set和get
config_db机制需要两个函数,set寄信方式和get发信方式。
1,寄信方式:
uvm_config_db#(type)::set(uvm_component context, string instance_name, string field_name, type value);
第一个和第二个参数团结起来组成目标路径,与此路径符合的目标才气收信。第一个参数必须是一个uvm_component实例的指针,第二个参数是相对此实例的路径。
第三个参数表现一个暗号,用以说明这个值是传给目标中的哪个成员的,
第四个参数是要设置的值。
2,收信方式
uvm_config_db#(type)::get(uvm_component context, string instance_name, string field_name, type value);
get函数中的第一个参数和第二个参数团结起来组成路径。第一个参数也必须是一个uvm_component实例的指针,第二个参数是相对此实例的路径。一般的,假如第一个参数被设置为this,那么第二个参数可以是一个空的字符串。第三个参数就是set函数中的第三个参数,这两个参数必须严格匹配,第四个参数则是要设置的变量。
这里set和get的第一个参数可以是三种环境:this,uvm_root::get(),null。
1,this,代表的是当前的组件,第一个参数和第二个参数就是当前组件下的路径。
2,uvm_root::get(),是为uvm树形结构的uvm_top,第一个参数和第二个参数就是uvm树形结构的路径,这里的路径是uvm_test_top开始的路径。
3,null,假如为null,uvm自动补充为uvm_root::get()。
别的在component中通过get_full_name()获取当前路径,如在driver中打印get_full_name(),那么此时显示的路径应为:uvm_test_top.env.i_agt.drv
特别注意:
1,set和get是有先后顺序的,set的时间必须早于get的时间,否则就可能get不到值。
2,一般来说set和get是成对出现的,但是get是可以省略的,但是不推荐这种用法。
3.4.2 config_db多重set。
config_db中可一个多次set,一次get,但是假如多次set的值不一样,get的值是获取哪一个?
分为三种环境。
1,假如set的第一个参数都为this, 假如为不同条理的set,以高条理的为准,同一条理以执行顺序靠前为准。
part1/config_db就是UVM config_db的实行, 在dadd_environment,dadd_iagent,dadd_scoreboard和dadd_refrence中举行了set,在dadd_driver举行了get。
标志符use_config_db_and_this_set 是利用this举行不同条理的set,分别在add_environment,dadd_iagent,dadd_oagent举行了set,在dadd_driver举行了get。运行Makefile脚本 make all之后,打印的效果是:
----Config_db use "this,different level set",This is dadd_environment----
及利用this后,不同条理的set以高条理为准。
2,假如set的第一个参数都为uvm_root::get(),不同条理以低条理的为准(也可理解为时间靠后为准),同一条理以执行时间靠后为准。
3,set的参数有this和uvm_root::get(),以uvm_root::get()为准。
标志符use_uvm_root_get_different_level_set 是利用uvm_root举行不同条理的set,分别在add_environment,dadd_iagent举行了set,在dadd_driver举行了get。运行Makefile脚本 make all之后,打印的效果是:
----Config_db use "uvm_root::get(),different level set",This is dadd_iagent----
及利用uvm_root::get后,不同条理的set以底条理为准。
标志符use_uvm_root_get_same_level_set是利用uvm_root举行相同条理的set,分别在dadd_scoreboard,dadd_refrence举行了set,在dadd_driver举行了get。运行Makefile脚本 make all之后,打印的效果是:
----Config_db use "uvm_root::get(),same level set",This is dadd_scoreboard----
及利用uvm_root::get后,相同条理的set以运行时间靠后为准。
标志符标志符use_uvm_root_get_same_level_set是利用uvm_root和this在dadd_environment中举行set,在dadd_driver举行了get。运行Makefile脚本 make all之后,打印的效果是:
----Config_db use "this and uvm_root::get set",This is use uvm_root::get----
及利用uvm_root::get和this同时set后,以uvm_root::get为准。
https://i-blog.csdnimg.cn/direct/129c59ab42444749b8d09756e1a52587.png
图3.23 config_db多重set实行仿真log截图
3.4.3 config_db多重get
config_db机制支持一个set,多次get。这就需要通配符的支持,及可以在tb_top种set virtual interface,路径为*,在环境的其他地方都可以获取interface。
part1/config_db实行就是在tb_dadd中设置了virtual interface。
File:tb_dadd.sv
initial
begin
uvm_config_db#(virtual dadd_interface)::set(uvm_root::get(),"*","vif",dadd_if);
end 代码3.37 config_db利用通配符的代码
在dadd_environment 中get。
File: dadd_environment.sv
Class:dadd_environment
function void dadd_environment :: build_phase(uvm_phase phase);
iagt = dadd_iagent :: type_id :: create("iagt",this);
oagt = dadd_oagent :: type_id :: create("oagt",this);
refmdl = dadd_refmodel :: type_id :: create("refmdl",this);
scb = dadd_scoreboard :: type_id :: create("scb",this);
dadd_iagt_to_refmdl_fifo = new("dadd_iagt_to_refmdl_fifo",this);
dadd_oagt_to_scb_fifo = new("dadd_oagt_to_scb_fifo",this);
dadd_refmdl_to_scb_fifo = new("dadd_refmdl_to_scb_fifo",this);
if(!uvm_config_db #(virtual dadd_interface) :: get(this,"","vif",vif))
$display("ERROR,The interface is not get !!!");
iagt.vif = vif;
oagt.vif = vif;
uvm_config_db#(string)::set(uvm_root::get(),"*","use_uvm_root_get_different_level_set","Config_db use \"uvm_root::get(),different level set\",This is dadd_environment");
uvm_config_db#(string)::set(this,"*","use_this_different_level_set","Config_db use \"this,different level set\",This is dadd_environment");
uvm_config_db#(string)::set(this,"*","use_config_db_and_this_set","Config_db use \"this and config_db set\",This is use this");
uvm_config_db#(string)::set(uvm_root::get(),"*","use_uvm_root_get_and_this_set","Config_db use \"this and uvm_root::get set\",This is use uvm_root::get");
uvm_config_db#(string)::set(uvm_root::get(),"uvm_test_top.env.iagt.sqr.*","sequence_use_uvm_config_db_set","Can correctly use config_db in sequence...");
endfunction : build_phase 代码3.38 config_db中通过config_db的get获取virtual interface的代码
从上面代码中看出在dadd_environment后获取virtual interface后,然后通过传参送给了dadd_iagent和dadd_oagent,然后给到了dadd_driver,这样driver中就可以用virtual interface给DUT传递数据。
File:dadd_driver.sv
Class:dadd_driver
task dadd_driver :: reset_phase(uvm_phase phase);
phase.raise_objection(this);
vif.mcb.dadd_in_en <= 0 ;
vif.mcb.dadd_in_addr <= 0 ;
vif.mcb.dadd_in <= 0 ;
wait(vif.reset_n);
phase.drop_objection(this);
endtask : reset_phase 代码3.39 config_db机制实行dadd_driver代码
3.4.4 sequence中利用config_db
sequence是不属于uvm树形结构的但是也可以通过config_db的方式获取变量,假如要用config_db机制对sequence举行set,就需要利用通配符。
通配符实在就是不给出完备的路径。例如现在要对sequence举行set,sequence都需要交由sequencer处理惩罚,而sequencer的路径是可以给出的,所以要找到sequence只需要在启动这个sequence的sequencer后面加上通配符。
part1/config_db实行中对sequence利用config_db。在dadd_environment中set。
uvm_config_db#(string)::set(uvm_root::get(),"uvm_test_top.env.iagt.sqr.*","sequence_use_uvm_config_db_set","Can correctly use config_db in sequence...");
以上代码中在第二个参数中用到了通配符*,在dadd_sequence中get。
File:dadd_sequence.sv
Class:dadd_rand_sequence
task body();
if(starting_phase != null)
starting_phase.raise_objection(this);
if(!uvm_config_db #(string) :: get(null,get_full_name(),"sequence_use_uvm_config_db_set",sequence_use_uvm_config_db_set))
begin
$display("ERROR,the string is not get !!!");
end
else
begin
$display("----%s----",sequence_use_uvm_config_db_set);
end
repeat(20)
begin
`uvm_do(item)
end
if(starting_phase != null)
starting_phase.drop_objection(this);
endtask : body 代码3.40 config_db机制实行中在dadd_rand_sequence利用config_db的代码
在dadd_sequence的get中,因为sequence不属于uvm_component所以第一个参数为null,前面讲过null就相当于uvm_root::get,第二个参数get_full_name()就是获得了sequence的路径,执行Makefile脚本:
make all
执行仿真,检察log,dadd_sequence可以正确获得设置的参数:
----Can correctly use config_db in sequence...----
本书(《UVM实行教程-从平台、脚本到方法学全代码解析-王建利》)及实在行代码已上传至GitHub 访问网址为: https://github.com/brentwang-lab/uvm_tb_gen
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]