文章目录

  • 1.config机制的作用
  • 2.config_db的使用
    • 2.1 传递interface
    • 2.2传递变量
    • 2.3传递object

1.config机制的作用

  • 在创建底层组件之前,需要对验证环境进行配置,为了验证环境的复用性,通过外部的参数配置,使得环境在创建时可以根据不同参数来选择创建的组件类型

  • 与重新编译来调节变量比,UVM config机制可以在仿真中通过变量设置来修改环境

UVM提供了uvm_config_db配置类以及几种方便地变量设置方法来实现仿真的环境控制
uvm_config_db类的使用方式包括:

  • 传递virtual interface 到环境中
  • 设置单一变量值,例如int、string、enum等
  • 传递配置对象(config object)到环境
    set与get函数的参数:
    config_db机制用于在UVM验证平台间传递参数,set()是寄信,get()是收信
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);
  • T是传递信息的类型
  • cntxt是一个uvm_component实例的指针,cntxt+inst_name组成目标路径
  • inst_name是相对此实例的路径
  • field_name变量名set和get的第三个参数必须一致

2.config_db的使用

2.1 传递interface

接口的传递从硬件世界到UVM环境中的传递可以通过uvm_config_db来实现。
在实现的过程中需要注意几点:

  • 接口的传递应该发生在 run_test() 之前。这保证了在进入build_phase之前virtual interface已经被传递到uvm_config_db中;
  • 应当把interface和virtual interface 的声明分开,在传递的过程中的类型应该为virtual interface(接口句柄)
interface  intf1;logic enable = 0;
endinterface
class comp1 extends uvm_component;//底层组件拿到config'uvm_component_utils(comp1);virtual intf1 vif;//声明接口要带virtual...function void build_phase(uvm_phase phase);//这里的this的绝对路径是root.test.c1.vif//第二个参数"",表示要找comp1里面的vifif(!uvm_config_db#(virtual intf1)::get(this, "", "vif", vif))begin//判断是否有误'uvm_error("GETVIF", "no virtual interface is assigned")end'uvm_info("SETVAL", $sformatf("vif.enable is %b after set", vif.enable),UVM_LOW)vif.enable = 1;endfunction
endclass
class test1 extends uvm_test;//顶层test中传递config'uvm_component_utils(test1)comp1 c1;...
endclass
intf1 intf();
initial beginuvm_config_db#(virtual intf1)::set(uvm_root::get(), "uvm_test_top.c1", "vif", intf);//在run_test之前,将配置发送出去run_test("test1");
end

2.2传递变量

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

class comp1 extends uvm_component;'uvm_component_utils(comp1)int val1 = 1;string str1 = "null";...function void build_phase(uvm_phase phase);'uvm_info("SETVAL", $sformatf("vall is %d before get", vall), UVM_LOW)'uvm_info("SETVAL", $sformatf("str1 is %s before get", str1), uvm_low)uvm_config_db#(int)::get(this,"","vall",vall);uvm_config_db#(string)::get(this,"","str1",str1);endfunction
endclass
class test1 extends uvm_test;'uvm_component_utils(test1)comp1 c1;...function void build_phase(uvm_phase phase);uvm_config_db#(int)::set(this,"c1","vall",100);//例化之前setuvm_config_db#(string)::set(this,"c1","str1","comp1");c1 = comp1::type_id::create("c1",this);endfunction
endclass

2.3传递object

  • 如果要给底层配置的参数很多,就可以把封装在一个object类中,在顶层test中将类的实例对象句柄进行set传递;
  • 底层通过get拿到对象句柄,就可以通过句柄获取配置类中的变量设置
//将参数封装到object中
class config1 extends uvm_object;int vall = 1;int str1 = "null";'uvm_object_utils(config1)
endclass
//底层组件拿到config
class comp1 extend uvm_component;'uvm_component_util(comp1)config1 cfg;...function void build_phase(uvm_phase phase);uvm_object tmp;uvm_config_db#(uvm_object)::get(this, "","cfg", tmp);//传递的是父类uvm_object,要获得子类的成员变量,所以要做类型转换void'($cast(cfg,tmp));'uvm_info("SETVAL",$sformatf("cfg.vall is %d after get",cfg.vall),UVM_LOW)'uvm_info("SETVAL",$sformatf("cfg.str1 is %s after get", cfg.srt1),UVM_LOW)endfunction
endclass
//顶层test中传递config
class test1 extends uvm_test;'uvm_component_utils(test1)comp1 c1,c2;config cfg1,cfg2;...function void build_phase(uvm_phase phase);cfg1 = config1::type_id::create("cfg1");cfg2 = config1::type_id::create("cfg2");cfg1.val1 = 30;cfg1.str1 = "c1";cfg2.val1 = 50;cfg2.str1 = "c2";//设置setuvm_config_db#(uvm_object)::set(this, "c1", "cfg", cfg1);uvm_config_db#(uvm_object)::set(this, "c2", "cfg", cfg2);c1 = comp1::type_id::create("c1", this);c2 = comp1::type_id::create("c2", this);endfunction
endclass
  • 这里config传递的是一个父类句柄,所以要做句柄类型转换
  • set和get的类型必须相同,要不都是父类,要不都是子类

UVM-config机制相关推荐

  1. UVM config_db机制源码探微

    文章目录 1. uvm_config_db 基础 1.1. 简单set 1.2. 多重set 2. uvm_resource 2.1. uvm_resource_base 2.2. uvm_resou ...

  2. UVM factory机制源码探微

    文章目录 1. UVM factory机制的使用 2. class 在factory 中的注册过程 2.1. `uvm_component_utils() 2.1.1. m_uvm_component ...

  3. (7)UVM objection机制

    (7)UVM objection机制 objection机制 控制objection的最佳选择 UVM-1.1之后,结束仿真的机制有且只有一种,那就是利用objection挂起机制来控制仿真结束. o ...

  4. UVM phase机制(一)

    UVM的执行严格按照phase机制在执行的,顺序是: ->build_phase ->connect_phase ->end_of_elaboration_phase ->st ...

  5. 02、UVM工厂机制

    一.工厂机制的意义 工厂机制也是软件的一种典型设计模式,UVM工厂的存在就是为了更方便地替换验证环境中的实例或者注册了的类型,同时工厂的注册机制也带来了配置的灵活性. 这里的实例或者类型替代,在UVM ...

  6. (3)UVM 工厂机制

    工厂机制 文章目录 工厂机制 一.工厂的意义 二.工厂机制 三.构建函数new 四.uvm_coreservice_t类 关注作者 工厂(factor)机制是UVM的真正魅力所在.工厂机制也是软件的一 ...

  7. UVM: callback机制 uvm_callback和uvm_callbacks

    callback机制 callback机制提高代码的可重用性,还用于构建异常的测试用例. 广义的callback机制有post_randomize(),pre_body(),post_body(), ...

  8. Discuz NT 架构剖析之Config机制

    接触了Discuz NT! 一段时间了,是时候做个总结了,标题好霸气,有木有? 都是托园子里的大牛代振军的福啊,哈哈哈哈. 首先论坛的信息不是完全存储在数据库里面的,一部分信息存储在config文件里 ...

  9. UVM sequence机制(4)(response 特性)

    这篇我们介绍一下sequence 机制的response 属性. /sequence1class sequence1 extends uvm_sequence; ................... ...

  10. UVM objection机制

    objection的raise和drop主要用于引入结束仿真的问题.通常用于需要消耗时间的task中. 当所有组件的run_phase的objection全部drop下后,run_phase才会结束. ...

最新文章

  1. BootStrap学习笔记,优缺点总结
  2. Linux常见使用命令小结
  3. 什么是js的严格模式
  4. POJ 3617 Best Cow Line
  5. python基础知识5——赋值与深浅拷贝——整数和字符串,列表元组字典
  6. 严重的“Access:7”供应链漏洞影响100多家厂商150多款联网设备等产品
  7. php7.4报错:Trying to access array offset on value of type null
  8. python获取文件修改时间_Python-获取文件最后修改时间 | 学步园
  9. js实现浏览器打印PDF
  10. ASCII表,二进制、十进制对照表
  11. 装完系统还要装什么_电脑重装系统后,需要做什么准备工作?
  12. C++多线程detach函数使用
  13. md5加密依赖工具utility使用小记
  14. PgSql之操作JSON类型字段
  15. springboot基于Java的电影院售票与管理系统毕业设计源码011449
  16. 折半查找判定树的画法(较简单易懂!)
  17. 有趣的KaTeX(附源码)
  18. pdf转html?pdf转图片
  19. SpringCloud Alibaba 微服务 — 微服务网关 Gateway
  20. 深入了解jvm虚拟机

热门文章

  1. Oracle和Postgre的TRUNC函数
  2. “冰箱强行播广告关不了”上热搜,网友:买了块广告牌回家
  3. Verilog实现25分频电路代码
  4. [FAQ11783][NW]MVNO忽略国内漫游(ignore national roaming)
  5. 亚马逊鲲鹏系统详细功能介绍
  6. 如何优雅地读写HttpServletRequest和HttpServletResponse的请求体
  7. r语言实现sem_利用R语言做结构方程模型分析
  8. word2vec-google code
  9. Git 切换分支的命令
  10. psycopg2几个小坑