uvm_config_db传递的参数类型统计

文章目录

  • 前言
  • 0、uvm_config_db和uvm_resource_db介绍
  • 1、传递整数类型(int)
  • 2、传递字符串类型(string)
  • 3、传递接口类型(interface)
  • 4、传递枚举类型(enum)和数组类型(array)
  • 5、传递序列(sequence)
  • 总结


前言

在uvm环境中,可以非常方便的利用uvm_config_db,在不同的组件之间传递参数。本文主要统计一下,利用uvm_config_db可以传递的参数类型,以及演示一下每种参数类型的传递方法。


0、uvm_config_db和uvm_resource_db介绍

uvm_config_db用于实例化的对象之间传递参数;uvm_resource_db用于全局配置。

uvm_config_db的set和get函数的参数介绍如下所示,如果get函数匹配到了set,则返回1,否则返回0。
uvm_config_db传递的参数类型统计_第1张图片

uvm_resource_db的参数介绍如下图所示,设置的时候使用set函数,获取的时候使用read_by_name或者read_by_type函数。
uvm_config_db传递的参数类型统计_第2张图片

1、传递整数类型(int)

图中演示了如何利用uvm_config_db传递整数类型的数据。值得注意的是,如果组件中的变量被用uvm_field_*的方式注册了,那么该组件中,则会隐藏的自动执行uvm_config_db::get,去获取变量的值。
uvm_config_db传递的参数类型统计_第3张图片
uvm_config_db传递的参数类型统计_第4张图片

可以通过仿真命令+uvm_set_config_int传递参数,但是在uvm_config_db::get的时候数据类型必须用uvm_bitstream_t。
uvm_config_db传递的参数类型统计_第5张图片

<sim command> +uvm_set_config_int ="uvm_test_top.env.drv,port_id,10"

2、传递字符串类型(string)

在base_test中,通过uvm_config_db #(string)::set进行设置。

class test_base extends uvm_test;
  `uvm_component_utils(test_base)
  virtual function void build_phase(uvm_phase phase);
    super.build_phase(phase);
    uvm_config_db #(string)::set(this, "env", "hdl_path", "router_test_top.dut");
  endfunction: build_phase
endclass: test_base

在env中,通过uvm_config_db #(string)::get进行获取。

class router_env extends uvm_env;
  `uvm_component_utils(router_env)
  virtual function void build_phase(uvm_phase phase);
    super.build_phase(phase);
    `uvm_info("TRACE", $sformatf("%m"), UVM_HIGH);
      string hdl_path;
      `uvm_info("HOST_CFG", "Self constructing regmodel", UVM_MEDIUM);
      if (!uvm_config_db #(string)::get(this, "", "hdl_path", hdl_path)) begin
        `uvm_warning("HOST_CFG", "HDL path for DPI backdoor not set!");
      end
  endfunction: build_phase
endclass: router_env

3、传递接口类型(interface)

在testbench层,利用uvm_resource_db来全局传递interface,相比较uvm_config_db,可以有效避免因为层次结构发生改变造成的问题。
uvm_config_db传递的参数类型统计_第6张图片
在base_test中,通过uvm_resource_db::read_by_type获取到interface,再通过uvm_config_db::set传递下去。
uvm_config_db传递的参数类型统计_第7张图片
在driver底层的组件中,通过uvm_config_db::get获取interface,同时要判断获取到的句柄是否为空。
uvm_config_db传递的参数类型统计_第8张图片
在agent中间层的组件中,通过uvm_config_db::get获取interface,再通过uvm_config_db::set设置下去。
另外也可以通过直接赋值的方式将interface传递下去。
uvm_config_db传递的参数类型统计_第9张图片
uvm_config_db传递的参数类型统计_第10张图片

4、传递枚举类型(enum)和数组类型(array)

使用方法参考如下链接。

UVM config_db如何传递数组和枚举类型

5、传递序列(sequence)

基于例化的sequence配置,在利用uvm_config_db的set函数发送sequence时,传递的是sequence的例化名路径,用get函数获取sequence时,则用this.get_full_name函数去获取sequence的路径。
uvm_config_db传递的参数类型统计_第11张图片
基于类的sequence配置,这是一种比较推荐的做法,在利用uvm_config_db的set函数传递sequence时,路径选用sequence的类名,在利用get函数获取sequence时,则利用get_sequencer函数获取sequence的sequencer路径,再利用this.get_type_name获取sequence类名。
uvm_config_db传递的参数类型统计_第12张图片
基于sequencer的sequence配置,在利用uvm_config_db的set函数传递sequence时,路径只设置到sequencer的例化名sqr,在利用get函数获取sequence时,则利用get_sequencer函数获取sequence的sequencer路径。
uvm_config_db传递的参数类型统计_第13张图片
基于agent的sequence配置,在利用uvm_config_db的set函数传递sequence时,路径只设置到agent的例化名agt,在利用get函数获取sequence时,则利用get_sequencer函数获取sequence的sequencer路径my_sqr,再通过my_sqr.get_parent函数获取到agent的路径。
uvm_config_db传递的参数类型统计_第14张图片


总结

本文主要记录了,如何利用uvm_config_db和uvm_resource_db在uvm中间传递不同数据类型的变量,包括整形int、字符串string、接口interface、枚举enum、数组array。

你可能感兴趣的:(UVM,uvm_config_db,数据类型,uvm,uvm_resource_db)