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设置的一系列接口。该类中主要有以下方法。
序号 | 方法 | 描述 |
---|---|---|
1 | new | 创建并初始化uvm_resource_base:set_scope("*"),modified/read_only置零,优先级设置为默认优先级1000 |
2 | get_type_handle | 返回resource容器的type handle |
3 | set_read_only | read_only置一,将当前resource设置为只读属性,write会报error |
4 | set_read_write | read_only置零,当前resource可读可写 |
5 | is_read_only | 获取resource读写属性,返回read_only的值, |
6 | wait_modified | 等待modified==1,然后modified置零以支持再次wait_modified。uvm_resource#(T)::write操作会将modified置一。 |
7 | set_scope | 调用uvm_glob_to_re把通配符转换未常规正则表达式并赋值给scope |
8 | get_scope | 返回scope值 |
9 | match_scope | 调用uvm_re_match(scope,s)判断scope与表达式s是否匹配,匹配返回1,不匹配返回0 |
10 | set_priority | 设置resource搜索的优先级,纯虚函数,用户在派生类中需自定义 |
11 | convert2string | 默认返回“?”,用户使用时需重新定义该函数 |
12 | do_print | 调用printer.print_string打印scope |
13 | record_read_access | 记录uvm_resource::read操作:read_count++,更新read_time,记录保存至uvm_resource_type队列access[accessor_name] |
14 | record_write_access | 记录uvm_resource::write操作:write_count++,更新write_time,记录保存至uvm_resource_type队列access[accessor_name] |
15 | print_accessors | 打印所有访问记录,即access[$]的值 |
16 | init_access_record | 初始化访问记录,read_time/write_time/read_count/write_count全部置零 |
uvm_resource
,直接派生自uvm_resource_base,是个参数化的类,提供了读写访问resource数据库的必要方法。
序号 | 方法 | 描述 |
---|---|---|
1 | m_get_converter | 返回m_uvm_resource_converter类型的m_r2s,为空则new一个,局部变量m_r2s是把resource转换为字符串 |
2 | m_set_converter | 输入参数r2s赋值给局部变量m_r2s |
3 | convert2string | 把m_r2s转变为字符串 |
4 | get_type | 返回my_type的值,为空则new一个 |
5 | get_type_handle | 返回get_type的值 |
6 | set | 把当前resource加入到resource pool中 |
7 | set_override | 把当前resource加入到resource pool中并覆盖之前的值,默认name table和type table中该resource都会被覆盖,用户可通过override枚举变量来指定覆盖的table |
8 | get_by_name | 根据name在name table中查找resource,查找不到返回null |
9 | get_by_type | 根据type在type table中查找resource,查找不到返回null |
10 | read | 返回resource value,记录read过程 |
11 | write | 写resource,记录write过程,modified置一。若resource为只读则报error |
12 | set_priority | 设置resource的搜索优先级,有PRO_HIGH和PRO_LOW |
13 | get_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访问历史记录,在仿真任意阶段都可以打印查看该历史记录。该类中的主要方法如下:
序号 | 方法 | 描述 |
---|---|---|
1 | get | 返回resource pool的handle,没有则new一个 |
2 | spell_chkr | 调用uvm_spell_chkr进行字符串拼写检查 |
3 | set | 把指定resource加入到resource pool中,若为override模式,则把resource插入队首,否则插入队尾 |
4 | set_override | 把指定resource加入到resource pool中并覆盖之前的值,默认name table和type table中该resource都会被覆盖,用户可通过override枚举变量来指定覆盖的table |
5 | set_name_override | 对name table进行覆盖性插入 |
6 | set_type_override | 对type table进行覆盖性插入 |
7 | push_get_record | 把resource read操作存入get_record队列 |
8 | dump_get_record | 打印resource read操作历史记录,即打印get_record队列的信息 |
9 | lookup_name | 根据name查找name table中的resource,返回符合匹配规则的resource队列 |
10 | get_by_name | 调用lookup_name并返回优先级最高的resource |
11 | lookup_type | 根据type查找type table中的resource,返回符合匹配规则的resource队列 |
12 | get_by_type | 调用lookup_type并返回优先级最高的resource |
13 | get_highest_precedence | 获取最高优先级的resource |
14 | sort_by_precedence | 按优先级对resource进行排序,优先级越高在队列中位置越靠前,相同优先级按照set顺序排序,越晚set优先级越高 |
15 | lookup_regex_names | 指定scope、name、type_handle,调用lookup_name,lookup_name默认只指定name |
16 | lookup_regex | 在当前scope下查找符合name的resource,返回resource队列 |
17 | lookup_scope | 根据scope查找resource,不建议使用,开销太大 |
18 | set_priority_queue | 根据PRO_HIGH/PRI_LOW决定把当前resource移至resource队列的队首/队尾,使用时需要指定resource队列 |
19 | set_priority_name | 根据PRO_HIGH/PRI_LOW决定把当前resource移至resource队列的队首/队尾,只改变name table,使用时无需指定resource队列 |
20 | set_priority_type | 根据PRO_HIGH/PRI_LOW决定把当前resource移至resource队列的队首/队尾,只改变type table,使用时无需指定resource队列 |
21 | set_priority | 同时改变name table及type table |
22 | find_unused_resource | 返回没有读写过的resource |
23 | print_resources | 打印指定resource queue中所有resource相关信息 |
24 | dump | 打印所有resource相关信息,无需指定resource queue |