UVM实战_3_UVM验证平台的运行

本文详细介绍了UVM验证平台的phase机制,包括task phase与function phase的区别、执行顺序、跳转及超时退出。此外,还讲解了objection机制,包括raise_objection和drop_objection的使用、参数phase的必要性,以及set_drain_time的设置,旨在帮助理解UVM验证流程的控制与协调。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

本篇内容主要总结UVM实战的第5章内容


一、phase机制

UVM由phase来管理验证平台的运行,这些phase统一以xxxx_phase来命名,且都有一个类型为uvm_phase、名字为phase的参数。

1. task phase与function phase

UVM中的phase按照是否消耗仿真时间,可以分成两大类,一类是function phase, 如build_phase、connect_phase等,这些phase通过函数来实现;另一类是task phase,如run_phase等,消耗仿真时间,通过任务来实现。
如下图所示,灰色背景是task phase,其他为function phase
在这里插入图片描述
上述phase使用频率最高的是build_phase、connect_phase和main_phase。

2. phase的执行顺序

  • 按时间顺序执行:
    上节展示的phase都会按图中的顺序自上而下自动执行,即build_phase->connect_phase->main_phase,这是时间的概念。

注意:
对于function phase来说,在同一时间只有一个phase在执行;
对于task phase来说,run_phase和pre_reset_phase等12个小phase并行运行,如下:

fork
	begin
		run_phase();
	end
	begin
		pre_reset_phase();
		...
		main_phase();
		...
		post_shutdown_phase();
	end
join

对于这12个小phase是按顺序执行的,同一phase在所有的component内必须全部执行完,才可以进入到下一个phase,效果如下图所示。
在这里插入图片描述
还有,run_phase和post_shutdown_phase必须全部执行完,才可以进入到下一个phase:extract_phase

  • 按空间顺序执行:

考虑这样的事情,对于build_phase或者connec_phase,是先执行my_case里的build_phase或者connec_phase还是先执行env的呢?

对于build来说,是先从树根到树叶的过程,即my_case -> env -> agt -> drv
对于其他phase,均是先从树叶到树根的过程 ,即drv -> agt -> env -> my_case

注意:对于耗时的phase,并不是等到“下面”的phase(如driver的run_phase)执行完才执行“上面”的phase(如agent的run_phase),而是将这些run_phase通过fork…join_none的形式全部启动。

3. super.phase的内容

看UVM环境会发现,有时候出现super.xxxx_phase,有时候又不会出现。那哪些需要加上super,哪些又可以不加呢?
答案就是除了build_phase或者扩展自用户自定义的类,其他的phase完全可以不必加上super.xxxx_phase

  • build_phase是因为设置了super.build_phase可以通过自动获取通过config_db::set设置的参数。
  • 自定义的的类,比如base_test类,且在其某个phase,如connect_phase中定义了一些重要内容,那么在具体测试用例的connect_phase中就不应该省略super.connect_phase。

4. phase的跳转

在前面的表述中,各个phase都是顺序执行的,前一个phase执行完才执行后一个。实际上phase之间也可以互相跳来跳去。

举例从main_phase到reset_phase,验证平台检测到reset_n信号为低电平,则马上从main_phase跳转到reset_phase,代码如下:

task my_driver::reset_phase(uvm_phase phase);
   phase.raise_objection
<think>好的,用户问的是UVMuvm_field_enum的用法和相关示例。首先,我需要回忆一下UVM的基础知识,特别是关于字段自动化(field automation)的部分。记得uvm_field_enum是用来在UVM对象中注册枚举类型字段的宏,方便自动化的操作比如复制、比较、打印等。 接下来,我需要确认uvm_field_enum的具体语法和参数。根据之前的经验,这个宏通常是在`uvm_object_utils_begin`和`uvm_object_utils_end`之间使用,参数包括枚举类型、变量名以及标志位。比如`uvm_field_enum(T, var_name, FLAG)`,其中T是枚举类型,var_name是变量名称,FLAG是控制操作的标志,比如UVM_ALL_ON。 然后,我需要考虑用户可能的实际使用场景。比如在UVM测试平台中,配置对象里经常会有枚举类型的参数,使用uvm_field_enum可以让这些参数自动支持UVM的field automation方法。比如在transaction或者sequence中定义枚举变量,方便在测试中配置不同的模式。 接下来,我需要查找是否有示例代码能清晰地展示用法。记得在《UVM实战》或者官方文档中有类似的例子,比如定义一个color_enum枚举,然后在类中使用uvm_field_enum注册。同时,可能还需要说明如何通过`print()`方法或`copy()`方法来验证自动化功能是否生效。 另外,用户可能遇到的问题可能包括宏参数顺序错误、忘记包含`uvm_object_utils`宏,或者标志位设置不正确。需要提醒用户注意这些常见错误,并提供相应的解决方法。 还要检查引用的资料是否符合用户提供的引用内容。用户提供的引用[2]和[3]提到了UVM的基础知识和一些实现细节,需要确保回答中的信息与这些引用一致,并正确标注引用来源。 最后,生成的相关问题需要围绕uvm_field_enum的扩展应用、常见错误、调试方法以及与其他宏的比较,确保问题能够覆盖用户可能进一步想了解的内容。</think>### UVM中`uvm_field_enum`的用法与示例 `uvm_field_enum`是UVM中用于注册**枚举类型字段**的宏,属于字段自动化(field automation)的一部分。它允许将枚举类型的变量注册到UVM对象中,从而自动支持`copy()`、`compare()`、`print()`等操作[^3]。 #### 基本语法 ```systemverilog `uvm_field_enum(ENUM_TYPE, FIELD_NAME, FLAG) ``` - **ENUM_TYPE**: 枚举类型名称。 - **FIELD_NAME**: 对象中定义的枚举变量名。 - **FLAG**: 控制字段操作(如`UVM_ALL_ON`表示启用所有自动化功能)。 #### 示例代码 ```systemverilog typedef enum { RED, GREEN, BLUE } color_enum; class my_transaction extends uvm_sequence_item; color_enum color; // 注册字段自动化 `uvm_object_utils_begin(my_transaction) `uvm_field_enum(color_enum, color, UVM_ALL_ON) `uvm_object_utils_end function new(string name = "my_transaction"); super.new(name); endfunction endclass ``` #### 功能说明 1. **自动打印枚举值** 调用`print()`时,枚举变量会输出其名称(如`RED`)而非整数值。 ```systemverilog my_transaction tr = my_transaction::type_id::create("tr"); tr.color = GREEN; tr.print(); // 输出: color = GREEN ``` 2. **支持字段操作** - `copy()`: 复制枚举值。 - `compare()`: 比较枚举值是否相同。 - `pack()`/`unpack()`: 序列化与反序列化(需注意枚举存储为`int`)。 #### 常见问题与解决 1. **枚举值显示为整数而非名称** **原因**: 未正确使用`uvm_field_enum`或未调用`print()`。 **解决**: 确保字段注册正确,并检查`FLAG`是否包含`UVM_PRINT`。 2. **编译错误“uvm_field_enum未定义”** **原因**: 缺少`uvm_object_utils_begin/end`包裹或未包含`uvm_macros.svh`。 **解决**: 添加宏包裹并检查头文件引入。 3. **枚举类型作用域问题** **原因**: 枚举类型定义在类外部时未使用全局作用域。 **解决**: 使用`typedef enum {...} color_enum;`并在注册时指定完整类型。 #### 应用场景 - **配置对象**: 在UVM配置对象中使用枚举类型控制测试行为(如模式选择)。 - **事务字段**: 在Transaction中定义枚举类型的状态或指令码。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值