寄存器模型Reg Model源码与使用方法
寄存器模型源码文件介绍
Register Layer 类继承关系
Register Layer
UVM寄存器层定义了几个基类,当对这些基类进行适当的扩展后,这些类对DUT中的寄存器和memory读取/写入操作进行了抽象化。
寄存器模型通常由block层次结构组成,这些blocks通常映射到设计的层次结构。blocks包含寄存器、register files和memories。
UVM register layer类不能按原样使用。它们只提供通用和自省功能。它们必须通过扩展进行定制化,以提供与设计中的实际寄存器和memories相对应的抽象视图。由于设计中有大量寄存器,并且正确配置UVM寄存器层类涉及许多小细节,因此这种定制化通常由模型生成器完成。模型生成器根据设计中寄存器和存储器的规范工作,因此能够提供最新的、按构造更正的寄存器模型。模型生成器不在UVM库的范围内(比如nManager工具)。
寄存器层模型的类图如下所示。
uvm_reg_block.svh 源代码文件
uvm_reg_block类
类的介绍:
block抽象基类
块表示设计层次结构。它可以包含寄存器、寄存器文件、内存和子块。
一个块有一个或多个地址映射,每个地址映射对应于块上的一个物理接口。
类的方法:
方法名 | 方法简介 |
---|---|
Initialization | 初始化 |
new | 创建新实例和特定于类型的配置 |
configure | 特定于实例的配置 |
create_map | 在此块中创建地址映射 |
check_data_width | 检查指定的数据宽度(以位为单位)是否小于或等于`UVM_REG_data_width的值 |
set_default_map | 定义默认地址映射 |
default_map | 默认地址映射 |
lock_model | 锁定模型并构建地址映射。 |
is_locked | 如果模型被锁定,则返回TRUE。 |
Introspection
方法名 | 方法简介 |
---|---|
get_name | 获取简单名称 |
get_full_name | 获取分层名称 |
get_parent | 获取父块 |
get_root_blocks | 获取所有根块 |
find_blocks | 查找层次名称与指定名称glob匹配的块。 |
find_block | 查找层次名称与指定名称glob匹配的第一个块。 |
get_blocks | 获取子块 |
get_maps | 获取地址映射 |
get_registers | 获取寄存器 |
get_fields | 获取字段 |
get_memories | 获取记忆 |
get_virtual_registers | 获取虚拟寄存器 |
get_virtual_fields | 获取虚拟字段 |
get_block_by_name | 查找具有指定简单名称的子块。 |
get_map_by_name | 查找具有指定简单名称的地址映射。 |
get_reg_by_name | 查找具有指定简单名称的寄存器。 |
get_field_by_name | 查找具有指定简单名称的字段。 |
get_mem_by_name | 查找具有指定简单名称的内存。 |
get_vreg_by_name | 查找具有指定简单名称的虚拟寄存器。 |
get_vfield_by_name | 查找具有指定简单名称的虚拟字段。 |
Coverage覆盖率
方法名 | 方法简介 |
---|---|
build_coverage | 检查是否必须构建所有指定的覆盖模型。 |
add_coverage | 指定可用的其他覆盖率模型。 |
has_coverage | 检查块是否具有覆盖模型 |
set_coverage | 打开覆盖测量。 |
get_coverage | 检查覆盖率测量是否打开。 |
sample | 功能覆盖测量方法 |
sample_values | 字段值的功能覆盖测量方法 |
Access
方法名 | 方法简介 |
---|---|
get_default_path | 默认访问路径 |
reset | 重置此块的镜像。 |
needs_update | 检查是否需要写入DUT寄存器 |
update | 寄存器的批量更新。 |
mirror | 更新镜像值 |
write_reg_by_name | 写入命名寄存器 |
read_reg_by_name | 读取命名寄存器 |
write_mem_by_name | 写入命名内存 |
read_mem_by_name | 读取命名内存 |
Backdoor后门
方法名 | 方法简介 |
---|---|
get_backdoor | 获取此块中所有寄存器的用户定义后门 |
set_backdoor | 为此块中的所有寄存器设置用户定义的后门 |
clear_hdl_path | 删除hdl路径 |
add_hdl_path | 添加hdl路径 |
has_hdl_path | 检查是否指定了hdl路径 |
get_hdl_path | 获取增量hdl路径 |
get_full_hdl_path | 获取完整的分层hdl路径 |
set_default_hdl_path | 设置默认设计抽象 |
get_default_hdl_path | 获取默认设计抽象 |
set_hdl_path_root | 指定根hdl路径 |
is_hdl_path_root | 检查此块是否有绝对路径 |
uvm_reg_map.svh 源代码文件
uvm_reg_transaction_order_policy类
类的介绍:
类的方法:
order()函数可以对单个uvmreg事务(读/写)生成的总线事务序列进行重新排序。当寄存器宽度与总线宽度不同,并且一个寄存器访问导致一系列总线事务时,可以使用这种方法。
队列的第一个item(0)将是第一个总线事务(最后一个item($)将是最后一个事务)。
uvm_reg_map类
类的介绍:
此类表示地址映射。地址映射是通过特定物理接口访问的寄存器和内存的集合。地址映射可以组成更高级的地址映射。
地址映射是使用uvm_reg_block::create_map()方法创建的。
类的方法:
方法名 | 方法简介 |
---|---|
backdoor | 返回后门伪映射单例 |
Initialization | 初始化 |
new | 创建新实例 |
configure | 特定于实例的配置 |
add_reg | 添加寄存器 |
add_mem | 添加内存 |
add_submap | 添加地址映射 |
set_sequencer | 设置与此映射关联的序列器和适配器。 |
set_submap_offset | 将给定子映射的偏移设置为偏移。 |
get_submap_offset | 返回给定子映射的偏移量。 |
set_base_addr | 设置此映射的基址。 |
reset | 重置此地址映射中所有寄存器的镜像。 |
Introspection
方法名 | 方法简介 |
---|---|
get_name | 获取简单名称 |
get_full_name | 获取分层名称 |
get_root_map | 获取外部可见的地址映射 |
get_parent | 获取父块 |
get_parent_map | 获取高级地址映射 |
get_base_addr | 获取此映射的基偏移地址。 |
get_n_bytes | 获取与此映射关联的总线的宽度(以字节为单位)。 |
get_addr_unit_bytes | 获取映射中最小可寻址单元的字节数。 |
get_base_addr | 获取与此映射关联的总线的端号。 |
get_sequencer | 获取与此映射关联的总线的序列器。 |
get_adapter | 获取与此映射关联的总线的总线适配器。 |
get_submaps | 获取地址子映射 |
get_registers | 获取寄存器 |
get_fields | 获取字段 |
get_memories | 获取记忆 |
get_virtual_registers | 获取虚拟寄存器 |
get_virtual_fields | 获取虚拟字段 |
get_physical_addresses | 将本地地址转换为外部地址 |
get_reg_by_offset | 获取在偏移量处映射的寄存器 |
get_mem_by_offset | 获取偏移处映射的内存 |
Bus Access总线访问
方法名 | 方法简介 |
---|---|
set_auto_predict | 为他的地图设置自动预测模式。 |
get_auto_predict | 获取此映射的自动预测模式设置。 |
set_check_on_read | 为他的地图及其所有子地图设置读取检查模式。 |
get_check_on_read | 获取此映射的读取模式检查设置。 |
do_bus_write | 执行总线写入操作。 |
do_bus_read | 执行总线读取操作。 |
do_write | 执行写入操作。 |
do_read | 执行读取操作。 |
set_transaction_order_policy | 设置事务顺序策略 |
get_transaction_order_policy | 设置事务顺序策略 |
uvm_reg_file.svh 源代码文件
uvm_reg_file类
类的介绍:
注册文件抽象基类
寄存器文件是用于创建规则重复结构的寄存器文件和寄存器的集合。
寄存器文件通常实例化为数组。
类的方法:
Initialization初始化
new创建新实例
configure配置注册文件实例
Introspection 反省
get_name获取简单名称
get_full_name获取分层名称
get_parent获取父块
get_regfile获取父注册文件
Backdoor后门
clear_hdl_path删除hdl路径
add_hdl_path添加hdl路径
has_hdl_path检查是否指定了hdl路径
get_hdl_path获取增量hdl路径
get_full_hdl_path获取完整的分层hdl路径
set_default_hdl_path设置默认设计抽象
get_default_hdl_path获取默认设计抽象
uvm_reg类
类的介绍:
regisiter抽象基类
寄存器表示可作为单个实体访问的一组字段。
一个寄存器可以映射到一个或多个地址映射,每个地址映射具有不同的访问权限和策略。
类的方法:
Initialization初始化
new创建新实例和特定于类型的配置
configure特定于实例的配置
set_offset修改寄存器的偏移量
Introspection 反省
get_name获取简单名称
get_full_name获取分层名称
get_parent获取父块
get_regfile获取父注册文件
get_n_maps返回映射此寄存器的地址映射数
is_in_map如果该寄存器位于指定的地址映射中,则返回1
get_maps返回映射此寄存器的所有地址映射
get_rights返回给定映射中该寄存器的可访问性(“RW”、“RO”或“WO”)。
get_n_bits返回此寄存器的宽度(以位为单位)。
get_n_bytes返回此寄存器的宽度(以字节为单位)。
get_max_size返回所有寄存器的最大宽度(以位为单位)。
get_fields返回此寄存器中的字段
get_field_by_name返回此寄存器中的命名字段
get_offset返回此寄存器的偏移量
get_address返回此寄存器的基本外部物理地址
get_addresses标识此寄存器的外部物理地址
Access通道
set设置此寄存器的所需值
get返回寄存器中字段的所需值。
get_mirrored_value返回寄存器中字段的镜像值。
needs_update如果任何字段需要更新,则返回1
reset 重置此寄存器的所需/镜像值。
get_reset获取此寄存器的指定重置值
has_reset检查寄存器中的任何字段是否具有指定重置类型的重置值。
set_reset指定或修改此寄存器的重置值
write 将指定值写入此寄存器
read 从该寄存器读取当前值
poke将指定值存入此寄存器
peek 从该寄存器读取当前值
update 更新设计中寄存器的内容,以匹配所需的值
mirror 读取寄存器并更新/检查其镜像值
predict更新此寄存器的镜像值和所需值。
is_busy如果当前正在读取或写入寄存器,则返回1。
Frontdoor前门
set_frontdoor为此寄存器设置用户定义的前门
get_frontdoor返回此寄存器的用户定义前门
Backdoor 后门
set_backdoor为此寄存器设置用户定义的后门
get_backdoor返回此寄存器的用户定义后门
clear_hdl_path删除hdl路径
add_hdl_path添加hdl路径
add_hdl_path_slice将指定的hdl切片附加到指定设计抽象的寄存器实例的hdl路径。
has_hdl_path检查是否指定了hdl路径
get_hdl_path获取增量hdl路径
get_hdl_path_kinds获取已定义hdl路径的设计抽象
get_full_hdl_path获取完整的分层hdl路径
backdoor_read用户定义后门读取权限
backdoor_write用户定义的后门读取权限
backdoor_read_func用户定义的后门读取权限
backdoor_watch用户定义DUT寄存器更改监视器
Coverage
include_coverage指定必须包含在各种块、寄存器或内存抽象类实例中的覆盖模型。
build_coverage检查是否必须构建所有指定的覆盖率模型。
add_coverage指定可用的其他覆盖率模型。
has_coverage检查寄存器是否有覆盖模型
set_coverage打开覆盖测量。
get_coverage检查覆盖率测量是否打开。
sample功能覆盖测量方法
sample_values字段值的功能覆盖测量方法
Callbacks 回调
pre_write在寄存器写入之前调用。
post_write在寄存器写入后调用。
pre_read在寄存器读取之前调用。
post_read在寄存器读取后调用。
uvm_reg_field类
类的介绍:
字段抽象类
字段表示一组作为单个实体一致运行的位。
一个字段包含在单个寄存器中,但根据地址映射使用寄存器的访问权限(因此字段),可能有不同的访问策略。
类的方法:
value 镜像字段值。
Initialization 初始化
new新建字段实例
configure特定于实例的配置
Introspection 反省
get_name获取简单名称
get_full_name获取分层名称
get_parent获取父注册
get_lsb_pos返回字段的位置
get_n_bits返回字段的宽度(以位为单位)。
get_max_size返回最大字段的宽度(以位为单位)。
set_access修改字段的访问策略
define_access定义新的访问策略值
get_access获取字段的访问策略
is_known_access检查访问策略是否为内置策略。
set_volatile将字段的volatile修改为指定值。
is_volatile指示字段值是否为volatile
Access 通道
set设置此字段的所需值
get返回字段的所需值
get_mirrored_value返回字段的镜像值
reset 重置此字段的所需/镜像值。
get_reset获取此字段的指定重置值
has_reset检查字段是否指定了重置值
set_reset指定或修改此字段的重置值
needs_update检查抽象模型是否包含不同的期望值和镜像值。
write在该字段中写入指定值
read 从该字段读取当前值
poke将指定值存入此字段
peek 从该字段读取当前值
mirror 读取字段并更新/检查其镜像值
set_compare在镜像更新期间设置比较策略。
get_compare返回此字段的比较策略。
is_indv_accessible检查此字段是否可以单独写入,即。
predict更新此字段的镜像值和所需值。
Callbacks回调
pre_write在字段写入之前调用。
post_write在字段写入后调用。
pre_read在字段读取之前调用。
post_read在字段读取后调用。
uvm_mem类
类的介绍:
memory抽象基类
memory是连续位置的集合。可以通过多个地址映射访问内存。
与寄存器不同,内存不会被镜像,因为数据空间可能很大:遍历整个内存空间的测试将抵消稀疏内存建模技术的任何好处。建议使用后门通道,而不是mirror。
类的方法:
Initialization初始化
new创建新实例和特定于类型的配置
configure特定于实例的配置
set_offset修改内存的偏移量
修改内存的偏移量将使抽象模型偏离用于创建它的规范。
mam内存分配管理器
Introspection 反省
get_name获取简单名称
get_full_name获取分层名称
get_parent获取父块
get_n_maps返回映射此内存的地址映射数
is_in_map如果该内存位于指定的地址映射中,则返回TRUE
get_maps返回映射此内存的所有地址映射
get_rights返回此内存的访问权限。
get_access通过地址映射写入和读取时返回内存的访问策略。
get_size返回此内存中唯一内存位置的数量。
get_n_bytes返回每个内存位置的宽度(字节数)
get_n_bits返回每个内存位置的宽度(以位为单位)
get_max_size返回所有内存的最大宽度(以位为单位)
get_virtual_registers返回此内存中的虚拟寄存器
get_virtual_fields返回内存中的虚拟字段
get_vreg_by_name查找指定的虚拟寄存器
get_vfield_by_name查找命名的虚拟字段
get_vreg_by_offset查找在指定偏移量处实现的虚拟寄存器
get_offset返回内存位置的基偏移量
get_address返回内存位置的基本外部物理地址
get_addresses标识内存位置的外部物理地址
HDL Access HDL接入
write将指定值写入内存位置
read 从内存位置读取当前值
burst_write将指定值写入内存位置
burst_read从内存位置读取值
poke将指定值存放在内存位置
peek从内存位置读取当前值
Frontdoor前门
set_frontdoor为此内存设置用户定义的前门
get_frontdoor返回此内存的用户定义前门
Backdoor 后门
set_backdoor为此内存设置用户定义的后门
get_backdoor返回此内存的用户定义后门
clear_hdl_path删除hdl路径
add_hdl_path添加hdl路径
add_hdl_path_slice将指定的hdl切片添加到指定设计抽象的hdl路径。
has_hdl_path检查是否指定了hdl路径
get_hdl_path获取增量hdl路径
get_full_hdl_path获取完整的分层hdl路径
get_hdl_path_kinds获取已定义hdl路径的设计抽象
backdoor_read用户定义后门读取权限
backdoor_write用户定义的后门读取权限
backdoor_read_func用户定义的后门读取权限
Callbacks回调
pre_write在内存写入之前调用。
post_write在内存写入后调用。
pre_read在内存读取之前调用。
post_read在内存读取后调用。
Coverage
build_coverage检查是否必须构建所有指定的覆盖模型。
add_coverage指定可用的其他覆盖率模型。
has_coverage检查内存是否有覆盖模型
set_coverage打开覆盖测量。
get_coverage检查覆盖率测量是否打开。
sample 功能覆盖测量方法
寄存器模型原理介绍
——待补充。