首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >揭开UVM configure机制的神秘面纱

揭开UVM configure机制的神秘面纱

作者头像
tech life
发布2020-06-12 16:25:49
发布2020-06-12 16:25:49
2K0
举报

UVM中的configure机制用来将一些对象(objects)数据(data)传递到验证平台中的各种组件。

本文主要分为:

1、什么是uvm_config_db? ------What

2、什么时候使用uvm_config_db? ------When

3、怎么使用和调试uvm_config_db?------How

What:什么是uvm_config_db?

一个可配置的验证环境会提高重用性,一般可以通过外部参数传递。

使用$test$plusargs优化设计仿真速度

UVM的configure机制更加方便地提供了配置功能的实现,就是建立一个数据库或者说键值对,即通过键(key)写入(set)或者读取(get)相应的值(value)。

在了解uvm_config_db之前我们先了解下uvm_config_db的父类uvm_resource_db。

代码语言:javascript
复制
class uvm_resource_db#(type T=uvm_object)

可以看出,uvm_resource_db是一个参数化的类,默认的参数是uvm_object。

代码语言:javascript
复制
class uvm_config_db#(type T=int) extendsuvm_resource_db#(T)

uvm_config_db继承自uvm_resource_db,其也是一个参数化的类,默认的参数是int。

相比uvm_resource_db,uvm_config_db增加了层次化的信息,即uvm_resource_db建立的是一个全局的配置数据库,uvm_config_db建立的是一个局部的配置数据库,需要指定具体配置数据库的层次信息。

When:什么时候使用uvm_config_db?

一个使用uvm_config_db的经典场景是传递virtual interface。interface在顶层例化,连接testbench和DUT,要想在driver和monitor中驱动和监测DUT就需要将physical interface传递给driver和monitor中的virtual interface。

How:怎么使用和调试uvm_config_db?

uvm_config_db使用set()和get()分别完成interface的设置和获取。

代码语言:javascript
复制
static function void set(uvm_component cntxt,
string inst_name,
string field_name,
T value)

set()是静态方法,在使用时需要加上范围解析运算符“::”,下表是set()静态方法四个参数的作用描述。

参数

描述

uvm_component cntxt

所指定层次路径的起点,层次越高,优先级越大

string inst_name

和cntxt一起形成层次路径

string field_name

用于索引的标签,相当于键“key”

T value

用于索引的数据值,相当于值“value”

代码语言:javascript
复制
static function bit get(uvm_component cntxt,
string inst_name,
string field_name,
inout T value)

get()和set()类似。

virtual interface的配置流程如下:

1、在顶层实例化physical interface。并连接到DUT

代码语言:javascript
复制
my_if input_if(clk, rst_n);
my_if output_if(clk, rst_n);
dut my_dut(.clk(clk),
           .rst_n(rst_n),
          .rxd(input_if.data),
          .rx_dv(input_if.valid),
          .txd(output_if.data),
          .tx_en(output_if.valid));

2、配置physical interface到各个组件的virtual interface

代码语言:javascript
复制
initial begin
   uvm_config_db#(virtualmy_if)::set(null, "uvm_test_top.env.i_agt.drv", "vif",input_if);
   uvm_config_db#(virtualmy_if)::set(null, "uvm_test_top.env.i_agt.mon", "vif",input_if);
   uvm_config_db#(virtualmy_if)::set(null, "uvm_test_top.env.o_agt.mon", "vif",output_if);
end

3、在组件内获取physical interface。

代码语言:javascript
复制
if(!uvm_config_db#(virtual my_if)::get(this, "", "vif",vif))
        `uvm_fatal("my_driver", "virtual interface must be setfor vif!!!")

除了上面的get()显式调用,还可以factory机制完成get()的隐式调用

STEP1:通过field automation macro注册

STEP2:在build_phase调用super. build_phase()

创建对象/数据后,UVM factory机制将查看该对象/数据是否使用uvm_config_db配置值。如果使用set()一个新的配置值,则自动隐式执行对象/数据配置。可查看super. build_phase()中的apply_config_settings()

通常在testcase中配置验证case相关(Test-specific)的对象/数据(例如),在env中配置验证平台相关(structure-related)的对象/数据。

在实际项目中可能会由于字符串书写错误而编译无法检查出来导致大量时间的浪费,我们可以使用条件判断+`uvm_fatalcheck_config_usage和仿真选项+UVM_CONFIG_DB_TRACE来进行configure机制的调试。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-13,如有侵权请联系 cloudcommunity@tencent.com 删除
目录
  • 使用$test$plusargs优化设计仿真速度
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档