这里我们知道set的内容放到了一个键值对联合数组m_rsc里了,由于这个键值对联合数组是一个static类型,所以通过uvm_config_db类都可以访问,并且这个键值对联合数组在set函数里就已经做了优先级替换的判断了,于是这就回答了我们上面提出的第一个问题。 剩下的get函数无非就是到键值对联合数组里取值,就比较简单了。 至...
从这个例子中可以看到,通过使用成对的set_config_/get_config_方法与uvm_config_db set/get的方法也是相同的,实际上UVM代码对set_config_/get_config_方法的封装中,也是调用了uvm_config_db set/get的方法。这些已经需要淘汰的方法,对于UVM的新用户而言,不算是苦恼,但是对于已经有OVM使用经验的用户来讲,我们还需...
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数组中查找并返回对应的值。此...
uvm_config_db扩展自uvm_resource_db m_rsrc是一个关联数组,索引是uvm_component,内容是uvm_pool#(string,uvm_resource#(T)) 其实跟uvm_resource_db是一样的。 pool.add是用来判断同一个component的path+inst_name是否有多次覆盖。 同一个uvm_component,并且path+inst_name相同的时候,set_priority_name(),后一...
其实跟uvm_resource_db:::set()做的事情大同小异。 更加关注precedence的属性。 如果同一个config多次set的话,set_priority_name()将会根据参数,将rtab中再次set一个config。 static uvm_pool#(string,uvm_resource#(T)) m_rsc[uvm_component]; pool = m_rsrc[cntxt],m_rsrc对应的是一个联合数组,索引是i...
uvm_config_db::set()通过层次和变量名,将这些信息放置到uvm_pkg唯一的全局变量uvm_pkg::uvm_resources。 全局变量uvm_resources用来存储和释放配置资源信息(resource information)。uvm_resources 是uvm_resources_pool类的全局唯一实例,该实例中有两个resource数组用来存放配置信息, 这两个数组中一个由层次名字索引,...
config_db分为set和get两部操作。 在main_phase中,raise_objection()应该放在第一个消耗时间的语句前,否则无法起到作用。当然,标准的基于uvm 的testbench只应该在sequence里 raise/drop objection. 执行顺序: 在build_phase时是从树根到叶子,有在每级节点创建完成后才开始下级结点的创建。同一级下的component创建先...
在run_test()之前,通过uvm里的函数uvm_config_db::set()函数把interface存储到指定的存储路径。 第四步,在uvm里读取interface,并存储到virtual interface里。 从名字上看,config_db是一种存储配置信息的数据库(类似全局变量,可以想象成一个关联数组),要正确存储和读取数据,需要类型和存储路径同时正确。v_intf有点...
if (!uvm_config_db # (virtual intfl)::get(this,"", "vif", vif)) begin `uvm_ error ("GETVIF", "no virtual interface is assigned") end `uvm_info("SETVAL", $sformatf("vif. enable is %b before set", vif.enable), UVM_LOW) ...