220-223超纲了,暂时先不解读了,毕竟我们关心的是set到哪里。这里我们知道set的内容放到了一个键值对联合数组m_rsc里了,由于这个键值对联合数组是一个static类型,所以通过uvm_config_db类都可以访问,并且这个键值对联合数组在set函数里就已经做了优先级替换的判断了,于是这就回答了我们上面提出的第一个问题。 剩下...
uvm 自定义的只有这样的四种uvm_config_db,那么就不能直接传递数组、枚举、队列等类型的变量。 2.传递数组 2.1在一个component自定义一个int类型的动态数组 (类型可以更改,定宽数组也是一样): 2.2利用自定义的动态数组类型,声明一个句柄: 2.3给动态数组实例化,并调用uvm_config_db::set函数: 2.4在另一个compone...
总结而言,通过uvm_config_db的set函数,我们能够将变量设置到m_rsc数组中。这个数组是静态的,意味着通过uvm_config_db类的任何实例都可以访问。设置过程已经包含了优先级判断,因此,数据被安全地存储和更新。接下来,我们将讨论get函数。其工作原理相对简单,主要是在m_rsc数组中查找并返回对应的值。此...
1. uvm_config_db::set通过层次和变量名,将这些信息放置到uvm_pkg唯一的全局变量uvm_pkg::uvm_resources。 2. 全局变量uvm_resources用来存储和释放配置资源信息(resource information)。uvm_resources是uvm_resource_pool类的全局唯一实例,该实例中有两个resource数组用来存放配置信息,这两个数组中一个由层次名字索引...
1. uvm_config_db::set通过层次和变量名,将这些信息放置到uvm_pkg唯一的全局变量uvm_pkg::uvm_resources。 2. 全局变量uvm_resources用来存储和释放配置资源信息(resource information)。uvm_resources是uvm_resource_pool类的全局唯一实例,该实例中有两个resource数组用来存放配置信息,这两个数组中一个由层次名字索引...
pool = m_rsrc[cntxt],m_rsrc对应的是一个联合数组,索引是iuvm_component,内容是uvm_pool 每一个uvm_component对应一个uvm_pool,uvm_component其实就是对应的set的第一个参数。 当同一个uvm_component对应多次set的时候,会将前一次的给覆盖掉。 get() ...
1.在testbench中例化了interface,然后通过config_db::set来把interface这个样的一个virtual interface放进resource_pool里面,resource_pool也就是两张表。放起来的目的是为了让需要使用virtual interface的component可以获取这个virtual interface。 module tb;
这种方法看上去简单,但是需要多做一个中转变量,而且有个致命缺陷--一旦switch_is_on数组的深度改变,甚至变为动态数组,这set就没法估计packed类型的宽度了。于是我们引入第二种方法。 2. typedef typedef有一系列妙用,除了为了简化起个别名和告诉编译器类的实现在后边意外,还可以帮助我们传递array与queue.同样还是以发...
uvm_config_db#(int)::set(this,"env.i_agt.drv","p_num",100); uvm_config_db#(int)::get(this,"","p_num", pre_num); 省略get语句 set与get函数一般都是成对出现,但是在某些情况下,是可以只有set而没有get语句,即省略get语句。
rtab/ttab是联合数组,索引的类型分别是string(name)和uvm_reousece_base(type),内容为uvm_queue#(uvm_resource_base)的队列,这个是两个全局存在的,用于存储set进来的resource,和get查找resource的地方。 get()表明是全局唯一性。 其实就是将set的内容按照name/type进行存放在globle的rtab和ttab中去。