2.uvm_base_AI
UVM 核心知识点详解
**
1. uvm_component 与 uvm_object
uvm_component 和 uvm_object 是 UVM 验证平台的两大核心基类,前者侧重「结构化组件」,后者侧重「数据 / 配置载体」,二者构成了 UVM 框架的基础。
1.2 uvm_object 常用派生类
uvm_object 是 UVM 中所有数据类、配置类的基类,核心用于数据存储、传递与自动化管理,常用派生类如下:
| 类名 | 父类 | 核心作用 |
|---|---|---|
| transaction | uvm_sequence_item | 事务类,封装 DUT 输入 / 输出数据(如地址、数据、控制信号),是数据传输的基本单元 |
| sequence | uvm_sequence | 序列类,组织管理 sequence_item,按场景产生测试激励(如单次读写、突发传输) |
| config | uvm_object | 配置类,集中存储验证平台参数(如时钟频率、DUT 模式),通过 config_db 传递 |
| uvm_reg_item | uvm_sequence_item | 寄存器事务类,封装寄存器读写操作的相关信息(地址、数据、操作类型) |
| uvm_reg_map | uvm_object | 寄存器映射类,管理寄存器地址映射关系,提供寄存器访问接口 |
| uvm_mem | uvm_object | 存储类,模拟 DUT 中的内存模块,支持读写操作 |
| uvm_reg_field | uvm_object | 寄存器字段类,封装寄存器中的单个字段(如控制位、状态位) |
| uvm_reg | uvm_object | 寄存器类,由多个 uvm_reg_field 组成,描述单个寄存器的属性与行为 |
| uvm_reg_file | uvm_object | 寄存器文件类,分组管理多个寄存器,简化寄存器集合的访问 |
| uvm_reg_block | uvm_object | 寄存器块类,顶层寄存器容器,包含多个 uvm_reg_map 和 uvm_reg_file |
| uvm_phase | uvm_object | 阶段控制类,定义验证平台的运行阶段(如 build_phase、run_phase),控制组件行为时序 |
1.3 uvm_component 常用派生类
uvm_component 是 UVM 中所有「结构化组件」的基类,具有生命周期管理、树形层次结构,核心用于实现验证平台的功能模块,常用派生类如下:
1.3.1 uvm_driver 类
核心作用:向 sequencer 索要 sequence_item(事务),将激励数据转换为 DUT 可识别的物理信号并发送给 DUT;部分场景下接收 DUT 响应。
关键成员(扩展自 uvm_component):
uvm_seq_item_pull_port #(REQ, RSP) seq_item_port; // 向 sequencer 拉取事务的端口 uvm_seq_item_pull_port #(REQ, RSP) seq_item_prod_if; // 生产端接口(兼容老版本) uvm_analysis_port #(RSP) rsp_port; // 发送响应的端口 REQ req; // 接收的请求事务(模板参数,需指定具体 transaction 类型) RSP rsp; // 发送的响应事务(模板参数)1.3.2 uvm_monitor 类
核心作用:监听 DUT 的接口信号,采集数据并转换为 transaction 级别的 sequence_item,发送给 scoreboard、reference_model 等组件用于校验。
类定义(无额外扩展成员,仅继承 uvm_component 基础功能):
class uvm_monitor extends uvm_component; function new(string name, uvm_component parent); super.new(name, parent); endfunction const static string type_name = "uvm_monitor"; // 修正原笔误:uvm_monirot → uvm_monitor virtual function string get_type_name(); return type_name; endfunction endclass1.3.3 uvm_sequencer 类
核心作用:组织管理 sequence,维护 sequence 的优先级与执行顺序;当 driver 索要数据时,将 sequence 产生的 sequence_item 转发给 driver,是 sequence 与 driver 之间的桥梁。
扩展说明:支持事务仲裁、锁定、中断等高级功能,默认提供 uvm_sequencer #(REQ, RSP) 模板类,需指定事务类型。
1.3.4 uvm_scoreboard 类
核心作用:接收 monitor 采集的 DUT 实际输出,与 reference_model 输出的预期结果进行对比,判断测试用例是否通过(Pass/Fail)。
扩展说明:无额外扩展成员,用户需自定义对比逻辑(如数组对比、时序对齐对比)。
1.3.5 reference_model 类
核心作用:行为级模型,模仿 DUT 的功能逻辑,接收 monitor 采集的输入事务,计算出预期输出结果并发送给 scoreboard。
扩展说明:UVM 无专门定义的基类,需用户手动继承 uvm_component 实现,确保接口与 monitor、scoreboard 兼容。
1.3.6 uvm_agent 类
核心作用:封装 driver、monitor 和 sequencer(可选),形成独立的接口代理模块,提高验证平台的可重用性(如 UART agent、SPI agent)。
关键成员与方法:
virtual class uvm_agent extends uvm_component; uvm_active_passive_enum is_active = UVM_ACTIVE; // 模式:ACTIVE(含 driver+sequencer)/ PASSIVE(仅 monitor) function void build_phase(uvm_phase phase); int active; super.build_phase(phase); // 修正原笔误:build_active → build_phase if(get_config_int("is_active", active)) // 从 config_db 获取模式配置 is_active = uvm_active_passive_enum'(active); endfunction endclass1.3.7 uvm_env 类
核心作用:顶层组件容器,封装验证平台中所有固定不变的 uvm_component(如 agent、scoreboard、reference_model),统一管理组件的实例化与连接,简化测试用例的编写。
类定义:
virtual class uvm_env extends uvm_component; function new(string name = "env", uvm_component parent = null); super.new(name, parent); endfunction const static string type_name = "uvm_env"; virtual function string get_type_name(); return type_name; endfunction endclass1.3.8 uvm_test 类
核心作用:测试用例的顶层入口,负责实例化 uvm_env,配置验证平台参数(通过 config_db),启动 sequence,控制测试流程(如终止条件)。
类定义:
class uvm_test extends uvm_component; // 修正原笔误:extend → extends function new(string name, uvm_component parent); super.new(name, parent); endfunction const static string type_name = "uvm_test"; virtual function string get_type_name(); return type_name; endfunction endclass1.4 uvm_object 相关注册宏
uvm_object 及其派生类需通过以下宏注册到 UVM Factory 机制,支持动态创建、类型覆盖等功能:
| 宏名 | 适用场景 |
|---|---|
| uvm_object_utils(T) | 非参数化的 uvm_object 派生类注册(如普通 config 类、transaction 类) |
| uvm_object_param_utils(T) | 参数化的 uvm_object 派生类注册(如 uvm_sequence #(REQ)) |
| uvm_object_utils_begin(T) | 带成员变量自动化管理的非参数化类注册(配合 uvm_field_* 宏使用) |
| uvm_object_param_utils_begin(T) | 带成员变量自动化管理的参数化类注册(配合 uvm_field_* 宏使用) |
| uvm_object_utils_end | 结束 uvm_object_utils_begin 块的定义(必须与 begin 成对使用) |
1.5 uvm_component 相关注册宏
uvm_component 及其派生类需通过以下宏注册到 UVM Factory 机制,支持组件实例化、配置传递等功能:
| 宏名 | 适用场景 |
|---|---|
| uvm_component_utils(T) | 非参数化的 uvm_component 派生类注册(如普通 agent、scoreboard) |
| uvm_component_param_utils(T) | 参数化的 uvm_component 派生类注册(如 uvm_driver #(REQ, RSP)) |
| uvm_component_utils_begin(T) | 带成员变量自动化管理的非参数化组件注册(继承 uvm_object 的 compare/print 功能,支持 config_db 配置) |
| uvm_component_param_utils_begin(T) | 带成员变量自动化管理的参数化组件注册 |
| uvm_component_utils_end | 结束 uvm_component_utils_begin 块的定义(必须与 begin 成对使用) |
1.6 uvm_component 与 uvm_object 的核心差异(补充)
| 特性 | uvm_object | uvm_component |
|---|---|---|
| 父类参数 | 无 parent 参数 | 必须指定 parent 参数(构建树形结构) |
| 核心功能 | 数据存储、传递、自动化(copy/compare) | 功能实现、组件管理、生命周期控制 |
| 关键方法 | clone()、copy()、compare() | build_phase()、run_phase() |
| Factory 注册 | 用 uvm_object_* 宏 | 用 uvm_component_* 宏 |
重要限制:
uvm_object 支持 clone() 方法:自动分配内存并复制对象内容。
uvm_component 不支持 clone() 方法(因需绑定 parent 构建树形结构),但可使用 copy() 方法(需提前分配内存)。
2. UVM 的树形结构
UVM 验证平台通过 uvm_component 的 parent 参数构建树形层次结构,实现组件的统一管理(如配置传递、生命周期控制)。
2.1 树形结构的核心:parent 参数
所有 uvm_component 实例化时,必须通过构造函数指定 parent 参数(类型为 uvm_component),用于明确组件在树形结构中的层级关系:
function new(string name = "component_name", uvm_component parent); super.new(name, parent); // 调用父类构造函数,绑定 parent endfunctionparent 为当前组件的父节点(如 agent 的 parent 是 env)。
组件的完整路径由「父组件名 + 子组件名」构成(如 uvm_test_top.env.uart_agent.driver)。
2.2 树形结构的根:uvm_top
UVM 树形结构的根节点是uvm_top,其特性如下:
uvm_top 是 uvm_root 类的唯一实例,uvm_root 继承自 uvm_component。
uvm_top 的 parent 参数为 null(无父节点)。
若实例化 uvm_component 时将 parent 设为 null,系统会自动将其 parent 绑定为 uvm_top。
uvm_top 确保整个验证平台只有一棵组件树,便于全局管理。
2.3 树形结构操作函数
UVM 提供以下函数用于遍历和操作组件树:
| 函数名 | 功能描述 |
|---|---|
| get_parent() | 获取当前组件的父节点 |
| get_child(string name) | 根据名称获取指定子组件 |
| get_children() | 获取当前组件的所有子组件(返回队列) |
| get_first_child() | 获取第一个子组件 |
| get_next_child() | 获取下一个子组件(配合 get_first_child() 遍历) |
| get_num_children() | 获取当前组件的子组件数量 |
3. Field Automation(字段自动化)机制
Field Automation 机制是 UVM 提供的便捷功能,通过 uvm_field_* 系列宏,自动实现 uvm_object 派生类成员变量的 copy、compare、print、pack/unpack 等操作,无需手动编写冗余代码。
3.1 常用 uvm_field_* 宏
3.1.1 基础类型宏
用于单个基础类型成员变量的自动化管理:
| 宏名 | 适用变量类型 | 说明 |
|---|---|---|
| uvm_field_int(ARG, FLAG) | int/bit/logic 等整型 | 自动化管理整型变量 |
| uvm_field_real(ARG, FLAG) | real 浮点型 | 自动化管理浮点型变量 |
| uvm_field_enum(T, ARG, FLAG) | 枚举类型(T 为枚举名) | 自动化管理枚举变量(需指定枚举类型 T) |
| uvm_field_object(ARG, FLAG) | uvm_object 派生类对象 | 自动化管理对象类型变量(需提前实例化) |
| uvm_field_event(ARG, FLAG) | uvm_event 事件类型 | 自动化管理事件变量 |
| uvm_field_string(ARG, FLAG) | string 字符串类型 | 自动化管理字符串变量 |
3.1.2 数组 / 队列 / 联合数组宏
用于集合类型成员变量的自动化管理:
| 宏名 | 适用变量类型 | 说明 |
|---|---|---|
| uvm_field_array_int(ARG, FLAG) | int 数组(固定长度) | 自动化管理整型数组 |
| uvm_field_array_enum(T, ARG, FLAG) | 枚举数组(固定长度) | 自动化管理枚举数组 |
| uvm_field_array_object(ARG, FLAG) | uvm_object 数组(固定长度) | 自动化管理对象数组 |
| uvm_field_array_string(ARG, FLAG) | string 数组(固定长度) | 自动化管理字符串数组 |
| uvm_field_sarray_int(ARG, FLAG) | 动态数组(sarray) | 自动化管理动态整型数组 |
| uvm_field_queue_int(ARG, FLAG) | 队列(queue) | 自动化管理整型队列 |
| uvm_field_queue_enum(T, ARG, FLAG) | 枚举队列 | 自动化管理枚举队列 |
| uvm_field_queue_object(ARG, FLAG) | 对象队列 | 自动化管理对象队列 |
| uvm_field_queue_string(ARG, FLAG) | 字符串队列 | 自动化管理字符串队列 |
| uvm_field_aa_int_string(ARG, FLAG) | 联合数组(int→string) | 自动化管理整型到字符串的联合数组 |
3.2 Field Automation 核心函数
通过 uvm_field_* 宏注册后,uvm_object 派生类会自动获得以下函数(无需手动实现):
| 函数名 | 功能描述 | 用法示例 |
|---|---|---|
| copy(uvm_object rhs) | 将 rhs 对象的成员变量值复制到当前对象 | obj1.copy(obj2);(obj1 是目标对象) |
| compare(uvm_object rhs, uvm_comparer comparer=null) | 对比当前对象与 rhs 的成员变量,返回是否一致(1 = 一致,0 = 不一致) | if(obj1.compare(obj2)) $display(“一致”); |
| pack_bytes(ref byte unsigned bytestream[], input uvm_packer packer=null) | 将成员变量打包为字节流(byte 数组) | byte unsigned stream[]; obj.pack_bytes(stream); |
| unpack_bytes(ref byte unsigned bytestream[], input uvm_packer packer=null) | 从字节流中解包,赋值给成员变量 | obj.unpack_bytes(stream); |
| pack(ref bit bitstream[], input uvm_packer packer=null) | 打包为比特流(bit 数组) | bit stream[]; obj.pack(stream); |
| unpack(ref bit bitstream[], input uvm_packer packer=null) | 从比特流解包 | obj.unpack(stream); |
| pack_ints(ref int unsigned intstream[], input uvm_packer packer=null) | 打包为整型流(int 数组) | int unsigned stream[]; obj.pack_ints(stream); |
| unpack_ints(ref int unsigned intstream[], input uvm_packer packer=null) | 从整型流解包 | obj.unpack_ints(stream); |
| print() | 打印所有注册的成员变量值(带层级) | obj.print(); |
| clone() | 分配内存并复制当前对象,返回新对象指针 | uvm_object obj2 = obj1.clone(); |
3.3 Field Automation 标志位(FLAG)
uvm_field_* 宏的 FLAG 参数用于控制自动化功能的开启 / 关闭,常用标志位如下:
| 标志位 | 功能描述 |
|---|---|
| UVM_ALL_ON | 开启所有自动化功能(copy/compare/print/pack) |
| UVM_PRINT | 仅开启打印功能 |
| UVM_COPY | 仅开启拷贝功能 |
| UVM_COMPARE | 仅开启比较功能 |
| UVM_PACK | 仅开启打包 / 解包功能 |
| UVM_NOPRINT | 关闭打印功能 |
| UVM_NOCOPY | 关闭拷贝功能 |
| UVM_NOCOMPARE | 关闭比较功能 |
| UVM_NOPACK | 关闭打包 / 解包功能 |
标志位使用示例
class my_transaction extends uvm_sequence_item; int dmac; // 目的 MAC 地址 int smac; // 源 MAC 地址 int ether_type; // 以太网类型 int pload[]; // 负载数据(动态数组) int crc; // CRC 校验值 int crc_err; // CRC 错误标记 // 注册类并指定自动化功能(FLAG 组合) `uvm_object_utils_begin(my_transaction) `uvm_field_int(dmac, UVM_ALL_ON) // 开启所有功能 `uvm_field_int(smac, UVM_ALL_ON) // 开启所有功能 `uvm_field_int(ether_type, UVM_ALL_ON) // 开启所有功能 `uvm_field_array_int(pload, UVM_ALL_ON) // 数组类型,开启所有功能 `uvm_field_int(crc, UVM_ALL_ON) // 开启所有功能 `uvm_field_int(crc_err, UVM_ALL_ON | UVM_NOPACK) // 开启所有功能,但关闭打包 `uvm_object_utils_end function new(string name = "my_transaction"); super.new(name); endfunction endclass