UVM学习随笔(3)config机制

Config机制

1、config机制的意义

1)、传递外部配置参数,使得环境在创建时可以根据不同参数来选择创建的组件类型(如UVM_ACTIVE)、组件实例数目、组件之间的连接以及组件的运行模式。
2)、在仿真中通过变量设置来修改环境,而不用重新编译来调节变量。

2、config机制的使用形式

1)、uvm_config_db#(T)::set(uvm_component cntxt, string inst_name, string field_name, T value)
第一个参数和第二个参数组成传递的目标路径,第三个参数表示一个记号,用以说明这个值传递给目标类中的哪个成员变量,第四个参数是要设置的值。
2)、uvm_config_db#(T)::get(uvm_component cntxt, string inst_name, string field_name, inout T value)
第一个参数是一个uvm_component实例的指针,第二个参数是相对于此实例的路径,第三个参数和set()的第三个参数一致,第四个参数是要设置的变量。

3、config机制的使用场景

3.1 传递virtual interface到环境中

1)、接口传递应该发生在run_test()之前,保证进入build phase之前,virtual interface已经被传递到uvm_config_db中。
2)、使用形式(以test_top传递到driver为例):
uvm_config_db#(virtual interface)::set(null, "uvm_test_top.env.agent.driver", "vif", vif)
第一个参数为null时,uvm会自动把第一个参数替换为uvm_root::get(),即uvm_top。
uvm_config_db#(virtual interface)::get(this, "", "vif", vif)
第一个参数为this时,表示当前所在类,第二个参数可以是空字符串。

3.2 设置单一变量值,例如int、string、enum等

对单一变量的值进行传递,使用形式及参数和interface传递过程一样。

3.3 传递配置对象(config object)到环境

需要配置的参数数量可能很多,且分属于不同的组件,如果对每一个变量单独配置,会产生很大的代码量,且不易复用。我们可以将每个组件的变量加以整合,放置在一个uvm_object中,作为一个中心化配置对象,使用config_db机制进行传递。其传递形式和interface传递一样。

4、注意事项

1)、在使用set()/get()方法时,如果set()/get()的类型不一致,应当先通过$cast()进行类型转换。
2)、set()/get()方法传递的参数可以使用通配符“*”来表示任意层次。
3)、uvm_config_db::set()方法应当在相关配置组件创建前调用,只有这样,才能在组件创建前拿到配置值继而正确地例化。
4)、在set()方法第一个参数使用当前层次的前提下,对于同一组件的同一变量,如果有多个高层次组件对该变量进行设置,会遵循高层次的配置,如果同一层次组件对该变量进行多次配置,会遵循后面的配置。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UVM中的config_db机制是一种方便的配置管理机制,可以在测试用例中动态地配置不同组件之间的参数。它允许用户将配置信息存储在单个数据库中,并在需要时从中检索。 config_db机制的核心是一个名为uvm_config_db的类,它提供了一些静态方法,用于将配置信息存储在数据库中、从数据库中检索配置信息和删除配置信息。每个配置信息都有一个名称和一个通用的数据类型,可以是任意类型的数据结构,包括简单的整数和字符串,以及更复杂的对象和指针。 config_db机制可以用于多种情况,例如: 1. 在测试用例中配置测试环境中的组件; 2. 在测试用例中配置测试用例本身; 3. 在测试用例中配置测试运行时环境(如时钟周期)。 下面是一个例子,展示如何使用config_db机制来配置两个组件之间的参数: ```systemverilog // 存储配置信息 uvm_config_db#(int)::set(null, "env.agent1.config", "data", 100); uvm_config_db#(string)::set(null, "env.agent2.config", "data", "hello"); // 从数据库中检索配置信息 int my_int; string my_string; uvm_config_db#(int)::get(null, "env.agent1.config", "data", my_int); uvm_config_db#(string)::get(null, "env.agent2.config", "data", my_string); ``` 在上面的例子中,我们使用uvm_config_db类的set方法将一个整数值和一个字符串值存储在了数据库中,并使用get方法从数据库中检索这些值。注意,我们使用了不同的名称("env.agent1.config"和"env.agent2.config")来区分不同的配置信息。这些名称应该在测试用例中被定义为常量或宏,以便在整个测试用例中使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值