【UVM源码学习】uvm_resource


  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设置的一系列接口。该类中主要有以下方法。

序号方法描述
1new创建并初始化uvm_resource_base:set_scope("*"),modified/read_only置零,优先级设置为默认优先级1000
2get_type_handle返回resource容器的type handle
3set_read_onlyread_only置一,将当前resource设置为只读属性,write会报error
4set_read_writeread_only置零,当前resource可读可写
5is_read_only获取resource读写属性,返回read_only的值,
6wait_modified等待modified==1,然后modified置零以支持再次wait_modified。uvm_resource#(T)::write操作会将modified置一。
7set_scope调用uvm_glob_to_re把通配符转换未常规正则表达式并赋值给scope
8get_scope返回scope值
9match_scope调用uvm_re_match(scope,s)判断scope与表达式s是否匹配,匹配返回1,不匹配返回0
10set_priority设置resource搜索的优先级,纯虚函数,用户在派生类中需自定义
11convert2string默认返回“?”,用户使用时需重新定义该函数
12do_print调用printer.print_string打印scope
13record_read_access记录uvm_resource::read操作:read_count++,更新read_time,记录保存至uvm_resource_type队列access[accessor_name]
14record_write_access记录uvm_resource::write操作:write_count++,更新write_time,记录保存至uvm_resource_type队列access[accessor_name]
15print_accessors打印所有访问记录,即access[$]的值
16init_access_record初始化访问记录,read_time/write_time/read_count/write_count全部置零


  uvm_resource,直接派生自uvm_resource_base,是个参数化的类,提供了读写访问resource数据库的必要方法。

序号方法描述
1m_get_converter返回m_uvm_resource_converter类型的m_r2s,为空则new一个,局部变量m_r2s是把resource转换为字符串
2m_set_converter输入参数r2s赋值给局部变量m_r2s
3convert2string把m_r2s转变为字符串
4get_type返回my_type的值,为空则new一个
5get_type_handle返回get_type的值
6set把当前resource加入到resource pool中
7set_override把当前resource加入到resource pool中并覆盖之前的值,默认name table和type table中该resource都会被覆盖,用户可通过override枚举变量来指定覆盖的table
8get_by_name根据name在name table中查找resource,查找不到返回null
9get_by_type根据type在type table中查找resource,查找不到返回null
10read返回resource value,记录read过程
11write写resource,记录write过程,modified置一。若resource为只读则报error
12set_priority设置resource的搜索优先级,有PRO_HIGH和PRO_LOW
13get_highest_precedence获取最高优先级的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访问历史记录,在仿真任意阶段都可以打印查看该历史记录。该类中的主要方法如下:

序号方法描述
1get返回resource pool的handle,没有则new一个
2spell_chkr调用uvm_spell_chkr进行字符串拼写检查
3set把指定resource加入到resource pool中,若为override模式,则把resource插入队首,否则插入队尾
4set_override把指定resource加入到resource pool中并覆盖之前的值,默认name table和type table中该resource都会被覆盖,用户可通过override枚举变量来指定覆盖的table
5set_name_override对name table进行覆盖性插入
6set_type_override对type table进行覆盖性插入
7push_get_record把resource read操作存入get_record队列
8dump_get_record打印resource read操作历史记录,即打印get_record队列的信息
9lookup_name根据name查找name table中的resource,返回符合匹配规则的resource队列
10get_by_name调用lookup_name并返回优先级最高的resource
11lookup_type根据type查找type table中的resource,返回符合匹配规则的resource队列
12get_by_type调用lookup_type并返回优先级最高的resource
13get_highest_precedence获取最高优先级的resource
14sort_by_precedence按优先级对resource进行排序,优先级越高在队列中位置越靠前,相同优先级按照set顺序排序,越晚set优先级越高
15lookup_regex_names指定scope、name、type_handle,调用lookup_name,lookup_name默认只指定name
16lookup_regex在当前scope下查找符合name的resource,返回resource队列
17lookup_scope根据scope查找resource,不建议使用,开销太大
18set_priority_queue根据PRO_HIGH/PRI_LOW决定把当前resource移至resource队列的队首/队尾,使用时需要指定resource队列
19set_priority_name根据PRO_HIGH/PRI_LOW决定把当前resource移至resource队列的队首/队尾,只改变name table,使用时无需指定resource队列
20set_priority_type根据PRO_HIGH/PRI_LOW决定把当前resource移至resource队列的队首/队尾,只改变type table,使用时无需指定resource队列
21set_priority同时改变name table及type table
22find_unused_resource返回没有读写过的resource
23print_resources打印指定resource queue中所有resource相关信息
24dump打印所有resource相关信息,无需指定resource queue
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MangoPapa

请作者喝瓶可乐吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值