uvm_resource.svh引入了resource的概念,resource是一种参数化的容器,该容器可用来存放任意类型的数据(只要是SystemVerilog支持的数据类型都可以,例如列表、队列、向量、class handle、virtual interface等等)。
resource可用于配置component、给sequence传递数据或者在测试平台各分立部件之间传递信息。
resource会以其name及type为标签(或称关键词、scope)存放在全局资源数据库的name table及type table下, uvm中所有组件/对象可以通过name或type对数据库中的resource进行筛选取用。在name table中,每个resource都有一组正则表达式标签与之对应,所有符合该表达式的name都能够索引到该resource;在type table中,每个resource type都有一个独一无二的静态type handle与之对应。
若多个resource的name/type相同,相同name/type的resource会按照从前向后的顺序存放在以该name/type为标签的资源队列(resource queue)中,查找resource时从前向后搜索队列,对于相同优先级数值的resource,在队列中位置越靠前其优先级实际上越高。
相同name/type的resource queue中,默认情况下各resource的优先级数值相同,该变优先级有两种方法:一是改变resource的优先级数值,二是改变resource在队列中的位置。
uvm_resource.svh中主要实现了以下五个class:uvm_resource_types、uvm_resource_options、uvm_resource_base、uvm_resource、uvm_resource_pool。
uvm_resource_types,只定义了一些typedef、enum、结构体:用以设置override属性(TYPE/NAME)的override_e,用以设置priority属性(HIGH/LOW)的priority_e,resource访问结构体access_t(读写时间、读写计数),通用resource队列rsrc_q_t。
uvm_resource_options,选项设置策略的类,提供了resource选项管理的空间。该类中定义了静态局部数据成员auditing及用以读取/更新auditing的静态函数。auditing默认为1,为1表示resource数据库可读写,为0表示不可读写。is_auditing()返回auditing的值,turn_on/off_auditing()来打开/关闭auditing。
uvm_resource_base,resource基类,直接派生自uvm_object,该类实现了resource access/notification/scope/auditing/priority设置的一系列接口。该类中主要有以下方法。
uvm_resource
,直接派生自uvm_resource_base,是个参数化的类,提供了读写访问resource数据库的必要方法。
uvm_resource_pool,基类,资源池,uvm_resource通过set操作可将其加入到uvm_resource_pool中,uvm_resource_pool中的resource全局可见,uvm中各组件、部分都可以到该资源池中通过get_by_name/type对resource进行取用。
需要注意的是,各resource的标签(scope)是存放在个resource内部的,而非uvm_resource_pool中, uvm_resource_pool仅存放各resource read/write访问历史记录,在仿真任意阶段都可以打印查看该历史记录。该类中的主要方法如下: