(7)UVM 怎么用好config机制?

本文详细介绍了UVM的config机制,包括接口传递、变量设置和对象传递。通过config机制,可以在验证环境中灵活配置组件,提升复用性。在使用uvm_config_db时,应注意接口传递应在run_test()前完成,变量设置需在组件创建前,同时建议在get()和set()操作中保持参数一致性,并理解通配符的使用。文章提供了实例和使用建议,帮助读者更好地理解和应用UVM配置机制。
摘要由CSDN通过智能技术生成

config机制

一、概述

  • 在验证环境的创建过程build phase中,除了组件的实例化,配置也是必不可少的。
  • 为了验证环境的复用性,通过外部的参数配置,使得环境在创建时可以根据不同参数来选择创建的组件类型、组件实例数目、组件之间的连接以及组件的运行模式等。
  • 在更细致的环境调节(environment tuning)中有更多的变量需要配置,例如for-loop的阈值、字符串名称、随机变量的生成比重等。
  • 比起重新编译来调节变量,如果在仿真中可以通过变量设置来修改环境,那么就更灵活了,而UVM config机制正提供了这样的便捷。
  • 配置的部分必须发生在底层组件创建之前,这在SV中是做不到的。因为SV中必须顶层组件创建之后,通过句柄来索引。
  • 在UVM提供了uvm_config_db配置类以及几种方便的变量设置方法来实现仿真时的环境控制,常见的uvm_config_db类的使用方式包括:
  1. 传递virtual interface到环境中
  2. 设置单一变量值,例如int、string、enum等
  3. 传递配置对象(config object)到环境
uvm_config_db #(T)::set(uvm_component cntxt,string inst_name,string field_name,T value);
uvm_config_db #(T)::get(uvm_component cntxt,string inst_name,string field_name,inout T value);

二、interface传递

  • interface传递可以很好地解决连接硬件世界和软件世界。
  • 而在之前SV验证模块中,虽然SV可以通过层次化的interface的索引来完成传递,但是这种方式不利于软件环境的封装和复用。
  • UVM的uvm_config_db使得接口的传递和获取彻底分离开来。
  • 在实现接口传递的过程中需要注意:
  1. 接口传递应该发生在run_test()之前。这保证了在进入build phase之前,virtual interface已经被传递到uvm_config_db中。
  2. 用户应当把interface与virtual interface的声明区分开来,在传递过程中的类型应当为virtual interface,即实际接口的句柄。

三、变量设置

在各个test中,可以在build phase对底层组件的变量加以配置,进而在环境例化之前完成配置,使得环境可以按照预期运行。

四、object传递

  • 在test配置中,需要配置的参数不只是数量多,而且可能还分属于不同的组件。
  • 如果对许多层次中的变量做出变量设置,那么会需要很多代码,容易出错还不易于服用,甚至底层组件的变量被删除后,也无法通过uvm_config_db::set()得知配置是否成功。
  • 然而如果将每个组件中的变量加以整合,首先放置到一个uvm_object中,再对中心化的配置对象进行传递,那么将会更有利于整个环境的修改维护。

五、实例

 interface uvm_config_if;
 logic [31:0] addr;
 logic [31:0] data;
 logic [ 1:0] op;
endinterface

package uvm_config_pkg;
 import uvm_pkg::*;
 `include "uvm_macros.svh"
 
 class config_obj extends uvm_object;
   int comp1_var;
   int comp2_var;
   `uvm_object_utils(config_obj)
   function new(string name = "config_obj");
     super.new(name);
     `uvm_info("CREATE", $sformatf("config_obj type [%s] created", name), UVM_LOW)
   endfunction
 endclass
 
 class comp2 extends uvm_component;
   int var2;
   virtual uvm_config_if vif;  
   config_obj cfg; 
   `uvm_component_utils(comp2)
   function new(string name 
  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 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
发出的红包

打赏作者

数字IC小白的日常修炼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值