(1) uvm_cofig_db提供的是对uvm_resource_base和uvm_resource#(T)(派生于uvm_resource_base)这两个类里的内容的一些整体操作;
(2) uvm_resource的作用是对uvm_resource_pool进行操作;
(3) uvm_resource_pool里面是两个放资源的联合数组;
1. 作用,优点及由来
(1) UVM中用于在不同component之间共享资源的一种机制,即实现了资源共享,又避免了全局变量的弊端(也可描述为用于在UVM验证平台间传递参数).
(2) umv_config_db是从uvm_resource_db派生而来,对uvm_resource_db的一些功能进行了扩展,主要体现在对资源的写入和读取上.
注:具体应用如将virtual interface传递到环境中(实现DUT与TB的交互)或传递配置对象(config object)到环境.
2. 原理
问题1: 资源存放在什么地方, 队列/关联数组/动态数组? uvm_resource_pool类;
问题2: 资源以什么形式存放? uvm_resource#(type T)类;
问题3: 资源如何存取? 怎么通过set函数把要共享的资源放入要存放的地方,怎么使用get函数把资源从存放的地方取出? uvm_resource_db#(type T)类;
(1) uvm_resources是uvm_resource_pool类的全局唯一实例,用于存储和释放配置资源信息;
(2) uvm_resources中有两个resource数组用于存放配置信息,这两个数组一个是由层次名字索引,一个是由类型索引;
(3) uvm_config_db::set()通过层次和变量名,将这些信息放置到uvm_pkg唯一的全局变量uvm_pkg::uvm_resources中;
(4) uvm_config_db::get()通过层次,在uvm_resources已有的配置信息池中,索引到该配置;
2.1. 资源共享所记录的信息
(1) 以uvm_config_db#(int)::set(this, “tb.env.agent.driver”, “ifg_num”, 8)为例:
问题1: 谁进行了资源的存放(由最顶层的case,还是tb,还是env)?
this,即顶层的case;
问题2: 这个资源要共享给谁?
”tb.env.agent.driver”;
问题3: 共享资源的值?
8.
(2) 与以上记录内容相对应的变量如下:
(2.1) uvm_resource_base中有一个整型变量int unsigned precedence来存放优先级信息.
(2.2) uvm_resource_base中有一个字符串变量scope用来存放目标路径信息,即protected string scope;
(2.3) uvm_resource#(type T)中有一个变量val用来存放变量值,即protected T val.
2.2. uvm_resource_base