uvm_config_db#()::set / get:
set表示把要处理的资源放进全局可见的数据库,get表示从全局可见的数据库输出需要的资源。
寄信方的邮件格式:
uvm_config_db#(邮件类别)::set(发信地址,“相对于发信地址的收件地址”,“邮件名字”,邮件内容);
收信方的邮件格式:
uvm_config_db#(邮件类别)::get(A,“B”,“邮件名字”,邮件内容); // 其中AB合起来为收件地址
当跨层次看待问题时,高层次的set优先;当处于同一层次时,则是时间优先。
// 不同的地方寄到同一个目的地址 (收件地址在发信地址层次结构的同级或下一级)
mdl.sv: uvm_config_db#(int)::set(this.m_parent,“i_agt.sqr",“A”,a); // 发信方是mdl的parent(env),收信方是与mdl同级的i_agt下面的seqencer
i_agt.sv: uvm_config_db#(int)::set(this,“sqr",“A”,a); // 发信方是i_agt,收信方是i_agt的seqencer
// 发信方env在层次结构中的等高,env的信将会被真正地送到
// 同一个地方发出 (收件地址在发信地址层次结构的下一级)
mdl.sv: uvm_config_db#(int)::set(this.m_parent,“i_agt.sqr",“A”,a);
i_agt.sv: uvm_config_db#(int)::set(this.m_parent,“i_agt.sqr",“A”,a);
// 谁来的迟就会丢掉前面的信件,所以在sqr中取到的将是最新的值
// 收件地址在发信地址层次结构的上层
i_agt.sv : uvm_config_db#(int)::set(uvm_root::get(),“uvm_test_top.env",“A”,a);
i_agt.sv : uvm_config_db#(int)::set(null,“uvm_test_top.env",“A”,a);
// 发信地址是可以随意设置的,设置为发件地址为最顶层:uvm_root::get()或null
virtual interface
interface是一个在UVM系统之外的类,不能直接调用,需要加 virtual。也就是在整个uvm系统中,只要用到 interface,都需要加 virtual interface 进行调用。
if.sv : interface my_if(); // 声明interface
dri.sv : virtual my_if vif; // 这个时候vif就是一个指向my_if的指针
uvm_config_db#(virtual my_if)::set(null,“uvm_test_top.drv”,“vif”,vif); // 而在写config db的时候,调用interface类
get_full_name()
获取这个节点的完整层次,实现输出从uvm_test_top到当前节点的路径。返回值如:env.agt.drv(这些名字不是类名,是实例名字)
get_name()
获取当前节点的实例名字,(不是类名)
get_type_name()
获取类的名字,以string形式返回,这个string是在注册的时候产生的。