在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 3638|回复: 8

[原创] 关于uvm里面config_db机制的一点讨论

[复制链接]
发表于 2021-2-15 18:05:33 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
本帖最后由 leine 于 2021-2-15 18:12 编辑

今天小白我在公司代码里看到了对config_db应用的这样一种情况:
test:在顶层test对sequencer中的变量var进行了set
uvm_config_db#(T)::set(this , "sequencer" , "var" , value);

sqr:
在sequencer中并没有声明任何变量包括变量var



seq:sequence的m_sqr已经指向了同一个sqr。然后在seq中去get在sqr中并不存在的变量var
uvm_config_db#(T)::get(m_sqr , "" , "var" , value);

---------------------------------------------------------------
代码运行的结果是pass了的。
所以这里就有一个问题:config_db看网上的介绍就是一个全局的关联数组。那这是不是意味着使用时,只要确保这个关联数组的key是一致的即可保证set与get的运行正确,而无需真正的声明某一个变量?

---------------------------------------------------------------

之后小白我用了这个在线仿真的平台(https://www.edaplayground.com/)对下面的代码进行测试。
如下uvm拓扑结构只包含一个basetest、env和comp。在basetest对env中不存在的变量str进行设置,然后再comp再去获取env中不存在的变量str的值。comp中声明了m_env变量指向了env。





  1. `include "uvm_macros.svh"
  2. import uvm_pkg::*;

  3. //to avoid type undefined
  4. typedef class comp;
  5. typedef class env;

  6. //comp declartion
  7. class comp extends uvm_component;

  8.   env m_env;              //basetest will assign this m_env handle pointed to env
  9.   string str = "default"; //use a string variable to get. If it is failed to get value from config_db, this variable will print "default"

  10.   `uvm_component_utils(comp)

  11.   function new(string name = "comp",uvm_component parent=null );
  12.     super.new(name,parent);
  13.   endfunction
  14.   
  15.   function void build_phase(uvm_phase phase);  
  16.     `uvm_info(get_full_name(),"build_phase of comp is entered",UVM_NONE)

  17.     uvm_config_db#(string)::get(m_env,"","str",str); //get str's value from m_env.Note there is no str variable defined in env.
  18.     $display("str = %s",str); //print the value of str

  19.     `uvm_info(get_full_name(),"build_phase of comp is exited",UVM_NONE)
  20.   endfunction

  21. endclass

  22. //env declartion
  23. class env extends uvm_env;

  24.   comp comp1; //only define a comp as sub_component

  25.   `uvm_component_utils(env)

  26.   function new(string name = "env",uvm_component parent=null );
  27.     super.new(name,parent);
  28.     comp1= comp::type_id::create("comp1",this);
  29.   endfunction
  30.   
  31.   function void build_phase(uvm_phase phase);
  32.     `uvm_info(get_full_name(),"build_phase of env is entered",UVM_NONE)

  33.     `uvm_info(get_full_name(),"build_phase of env is exited",UVM_NONE)   
  34.   endfunction

  35. endclass

  36. //basetest declartion
  37. class basetest extends uvm_test;

  38.   env env1; //only define a env as sub_component

  39.   `uvm_component_utils(basetest)

  40.   function new(string name = "basetest",uvm_component parent=null );
  41.     super.new(name,parent);
  42.     env1 = env::type_id::create("env1",this);
  43.   endfunction
  44.   
  45.   function void build_phase(uvm_phase phase);  
  46.     `uvm_info(get_full_name(),"build_phase of basetest is entered",UVM_NONE)

  47.     env1.comp1.m_env = env1;//assign the comp1.m_env handle to env1
  48.     uvm_config_db#(string)::set(this,"env1","str","Greetings!"); //set str's value in m_env.Note there is no str variable defined in env.

  49.     `uvm_info(get_full_name(),"build_phase of basetest is exited",UVM_NONE)
  50.   endfunction
  51.   
  52. endclass


  53. module test;
  54.   initial begin
  55.     run_test("basetest");
  56.   end  
  57. endmodule


复制代码
如果开启config_db,那么str会打印Greetings
如果注释掉config_fb,那么str会打印default





发表于 2021-2-15 20:42:27 | 显示全部楼层
set和get的第一个参数是一个指针吧
发表于 2021-2-19 09:53:43 | 显示全部楼层
var不是变量,是field name,field name就相当于关联数组的key,set会创建或者更新field name。
变量value是要声明的,不声明会报错的吧
 楼主| 发表于 2021-2-23 21:04:05 | 显示全部楼层


anpengfei 发表于 2021-2-19 09:53
var不是变量,是field name,field name就相当于关联数组的key,set会创建或者更新field name。
变量value ...


是的,对于第4个参数来说,要get或者set的变量肯定要声明。
但是之前我迷惑的是field name这个参数,我之前理解是他是在指定一个具体存在的变量(因为我看一些书里面的例子,filed name这个参数通常和变量是同名的)。现在才明白应该就是config_db里面的一个key,这个filed name我随便起名都没事,只要保证前后get与set匹配即可。
发表于 2021-2-24 14:13:52 | 显示全部楼层


leine 发表于 2021-2-23 21:04
是的,对于第4个参数来说,要get或者set的变量肯定要声明。
但是之前我迷惑的是field name这个参数,我之 ...


按照我浅显的理解,uvm config_db set/get机制核心的关联数组是通过string来管理的,所以可以使用*这样的通配符,因此set某一hierarchy内的“var”,其实只是增加了一组关联数组的值,跟真实是否存在这一hierarchy下变量没有关系。
不知道这样是否可以帮助楼主理解?
发表于 2021-2-24 17:30:04 | 显示全部楼层
同样小白一枚,不知道楼主这里有没有学习uvm的例子,比uvm实战中的dut复杂一点的,谢谢

发表于 2021-3-1 16:46:59 | 显示全部楼层
var是你自己取的名字,爱取啥取啥
发表于 2021-3-10 17:08:16 | 显示全部楼层
第三个参数相当于key,保持一致的情况下取什么名字都无所谓,不需要在当前类里声明它。
第四个参数用来 发送/接收 值,必须在当前类里声明。
以上纯属小白理解,意见不同欢迎探讨~~
发表于 2021-3-17 10:41:07 | 显示全部楼层
config机制的get是有返回值的,可以在前面用if判断一下
如果set和get配对失败,返回值为0,成功为1,并且对匹配变量赋值。


您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条

×

小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-25 12:16 , Processed in 0.019714 second(s), 6 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表