uvm_config_db#()::set 和 uvm_config_db#()::get

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是在注册的时候产生的。


`uvm_config_db` 是Universal Verification Methodology (UVM)库的一部分,用于在设计验证环境中存储检索配置信息。`uvm_object_wrapper` 是一个轻量级的对象包装器,它本身并不是UVM配置数据库的数据类型,但是它可以作为`uvm_config_db` 的键值类型。 当你想要在配置数据库中操作UVM Object(比如环境变量、模块实例或者配置信息)时,可以将`uvm_object_wrapper` 作为键。这是因为UVM Config DB的设计理念是提供一种安全的方式去访问修改系统配置,尤其是对于那些由用户代码动态创建或注册的Object。 使用`uvm_config_db` 的基本步骤包括: 1. **注册对象**:在代码初始化阶段,你需要将`uvm_object` 类型的实例注册到配置数据库中,通过调用`uvm_config_db#(T).set()` 方法,其中T是你想要注册的实际对象类型。 ```c++ uvm_object_registry::set("my_key", my_obj, my_obj.get_type()); ``` 2. **查找对象**:如果你需要获取先前注册的对象,可以通过`uvm_config_db` 查询该键值。 ```c++ uvm_object_wrapper obj = uvm_config_db#(my_type>::get("my_key")); if (!obj.is_null()) { my_type* retrieved_obj = dynamic_cast<my_type*>(obj.read()); // 使用retrieved_obj } ``` 3. **更新或删除**:你可以通过类似的方式修改或删除已注册的对象。 ```c++ obj.write(new_obj); // 更新对象 uvm_config_db#(my_type>::delete("my_key"); // 删除对象 ``` `uvm_config_db` 可以在全局范围或者每个特定区域(如进程、任务等)内使用,使得配置信息在整个验证流程中保持一致。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值