数字验证:一文弄懂UVM的phase机制

2024-08-25 20:36

本文主要是介绍数字验证:一文弄懂UVM的phase机制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 9大phase

1.1 整体介绍

        uvm中的phase共有9种,按照是否消耗仿真时间可以分为function phasetask phase。其中只有run_phase是耗时的,给DUT施加激励和检测输出也是在这个phase里完成的。

        UVM整体框架的运行都是从tb中的一句run_test("my_test")开始 ,那么在这句程序背后发生了什么呢?

        首先uvm的树根uvm_root类对象uvm_top创建了uvm_test_top,这一过程体现在仿真中就是在0时刻创建。接着引入的phase机制清晰地实现UVM树的层次例化,同时将仿真过程层次化。具体而言,uvm_top从时间和空间两个维度规定了执行顺序。时间上,仿真时不同phase按照某种时间顺序执行。空间上,仿真时同—phase不同组件按照某种层次顺序执行。

        而这一切都是由UVM自动完成的,整体流程就是先例化uvm_top,之后例化uvm_test_top,之后全部component按照一定顺序实现build_phase之后,全部component再按照定顺序实现connect_phase()等等,直到最终的$finish()

以一个case举例,包含的phase的执行顺序代码可能如下:

class my_case0 extends base_test;string tID = get_type_name();virtual function void build_phase(uvm_phase phase);super.build_phase(phase);uvm_info(tID, "build_phase is executed", UVM_LOW)endfunctionvirtual function void start_of_simulation_phase(uvm_phase phase);super.start_of_simulation_phase(phase);uvm_info(tID, "start_of_simulation_phase is executed", UVM_LOW)endfunctionvirtual task run_phase(uvm_phase phase);`uvm_info(tID, "run_phase is executed", UVM_LOW)endtaskvirtual task pre_reset_phase(uvm_phase phase);`uvm_info(tID, "pre_reset_phase is executed", UVM_LOW)endtaskvirtual task post_shutdown_phase(uvm_phase phase);`uvm_info(tID, "post_shutdown_phase is executed", UVM_LOW)endtaskvirtual function void extract_phase(uvm_phase phase);super.extract_phase(phase);`uvm_info(tID, "extract_phase is executed", UVM_LOW)endfunctionvirtual function void final_phase(uvm_phase phase);super.final_phase(phase);`uvm_info(tID, "final_phase is executed", UVM_LOW)endfunctionendclass

其中run_phase又可以分成12个小phase,他们是并行执行的关系:

forkbeginrun_phase();endbeginpre_reset_phase();reset_phase();post_reset_phase();pre_configure_phase();configure_phase();post_configure_phase();pre_main_phase();main_phase();post_main_phase();pre_shutdown_phase();shutdown_phase();post_shutdown_phase();end
join

        当然,并不是所有的phase都一定会被使用到,在验证时使用频率最高的phase一般是:build_phase,connect_phase,main_phase

        UVM这么做的好处是什么呢?一是方便验证工程师将不同的代码写进对应的phase中,二是有利于其他验证方法学向UVM迁移。因为它的阶段划分非常细致,在迁移时总能找到一个phase对应原来方法学中的仿真阶段。

1.2 run_phase

        UVM为什么要引入run_phase里的12个小phase呢?

        这有助于实现更加精细化的控制:reset、configure、main、shutdown四个phase是核心,可以模拟DUT复位,配置,运行,断电的行为。在没有这些细分的phase之前,这些操作要在scoreboard、reference model等加入一些额外的代码来保证验证平台不会出错。但是现在分别在scoreboard、reference model及其他部分的reset_ phase写好相关代码,之后如果想做一次复位操作,那么只要通过phase的跳转,就会自动跳转回reset_phase。

2. phase的执行顺序

        9个phase之间是自上向下的执行顺序,这是一种的时间的概念。而每种phase本身又具有执行顺序,这是一种空间的概念,描述的是运行某一phase时component从顶层到底层或是底层到顶层的执行顺序。

名称类型执行顺序功能
build_phasefunction自上向下创建结构
connect_phasefunction自下向上建立组件的连接
end_of_elaboration_phasefunction自下向上测试环境微调
start_of_simulation_phasefunction自下向上准备测试环境的仿真
run_phasetask自下向上激励设计
extract_phasefunction自下向上收集数据
check_phasefunction自下向上检查不期望的行为
report_phasefunction自下向上报告测试结果
final_phasefunction自上向下完成测试,结束仿真

        为什么需要规定是这样的执行顺序呢?以build_phase为例,driver和monitor作为agent中的成员变量,需要在agent的build_phase中进行实例化。如果driver的build_phase在agent的build_phase之前执行,此时driver本身还没有实例化,这样调用就会发生错误。

        可以发现其实大部分的phase都是以自下向上的顺序执行,包括run_phase。但与其它function phase不同的是,run_phase消耗时间,并不是等drv之类的run_phase执行完才执行agt的run_phase,而是将这些run_phase通过fork join_none的形式全部启动,同时运行。

        对于同一个component来说,12个小phase是顺序执行的,但这不意味着前一个phase执行结束后就会马上执行下一个phase。以component A 和 B举例,A的main_phase在100时刻执行结束,B的main_phase在400时刻执行结束,那么A和B的post_main_phase都会在400时刻才开始执行。在100~400时刻中,A处于等待B的状态;但从整个平台来看,各个phase之间当然不存在空白。

        而这种同步不仅适用于不同component之间,对同一个component的run_phase和post_shutdown_phase来说也需要实现同步:只有当run_phase和它的post_shutdown_phase都完成后才会进入下一个phase。

3. phase机制的必要性

        验证平台非常复杂,要搭建一个验证平台是一件相当繁杂的事情,要正确地掌握并理顺这些步骤是一个相当艰难的过程。比如在env中会实例化agent、scoreboard、reference model等,agent下面又会有sequencer、driver、monitor。并且,这些组件之间还有连接关系,如agent中monitor的输出要送给scoreboard或reference model,这种通信的前提是要先将reference model和scoreboard连接在一起。那么可以:

scoreboard = new;
reference_model = new;
reference_model.connect(scoreboard);
agent = new;
agent.driver = new;
agent.monitor = new;
agent.monitor.connect(scoreboard);

        这里面反应出来的问题就是最后一句话一定要放在最后写,因为连接的前提是所有的组件已经实例化。但是,reference_model.connect(scoreboard)的要求则没有那么高,只需要在上述代码中reference_model = new之后任何一个地方编写即可。可以看出,代码的书写顺序会影响代码的实现。若要将代码顺序的影响降低到最低,可以按照如下方式:

scoreboard = new;
reference_model = new;
agent = new;
agent.driver = new;
agent.monitor = new;
reference_model.connect(scoreboard);
agent.monitor.connect(scoreboard);

        UVM采用了这种方法,它将前面实例化的部分都放在build_phase来做,而连接关系放在connect_phase来做,这就是phase机制的优势:在不同的时间做不同的事。

        遵循UVM的代码顺序划分原则:build做实例化,connect做连接等等可以很大程度上减少验证平台开发者的工作量,并且便于我们理解运用。

这篇关于数字验证:一文弄懂UVM的phase机制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1106594

相关文章

一文带你搞懂Python中__init__.py到底是什么

《一文带你搞懂Python中__init__.py到底是什么》朋友们,今天我们来聊聊Python里一个低调却至关重要的文件——__init__.py,有些人可能听说过它是“包的标志”,也有人觉得它“没... 目录先搞懂 python 模块(module)Python 包(package)是啥?那么 __in

Python实现特殊字符判断并去掉非字母和数字的特殊字符

《Python实现特殊字符判断并去掉非字母和数字的特殊字符》在Python中,可以通过多种方法来判断字符串中是否包含非字母、数字的特殊字符,并将这些特殊字符去掉,本文为大家整理了一些常用的,希望对大家... 目录1. 使用正则表达式判断字符串中是否包含特殊字符去掉字符串中的特殊字符2. 使用 str.isa

Linux内核参数配置与验证详细指南

《Linux内核参数配置与验证详细指南》在Linux系统运维和性能优化中,内核参数(sysctl)的配置至关重要,本文主要来聊聊如何配置与验证这些Linux内核参数,希望对大家有一定的帮助... 目录1. 引言2. 内核参数的作用3. 如何设置内核参数3.1 临时设置(重启失效)3.2 永久设置(重启仍生效

一文详解如何在Python中从字符串中提取部分内容

《一文详解如何在Python中从字符串中提取部分内容》:本文主要介绍如何在Python中从字符串中提取部分内容的相关资料,包括使用正则表达式、Pyparsing库、AST(抽象语法树)、字符串操作... 目录前言解决方案方法一:使用正则表达式方法二:使用 Pyparsing方法三:使用 AST方法四:使用字

电脑死机无反应怎么强制重启? 一文读懂方法及注意事项

《电脑死机无反应怎么强制重启?一文读懂方法及注意事项》在日常使用电脑的过程中,我们难免会遇到电脑无法正常启动的情况,本文将详细介绍几种常见的电脑强制开机方法,并探讨在强制开机后应注意的事项,以及如何... 在日常生活和工作中,我们经常会遇到电脑突然无反应的情况,这时候强制重启就成了解决问题的“救命稻草”。那

SpringRetry重试机制之@Retryable注解与重试策略详解

《SpringRetry重试机制之@Retryable注解与重试策略详解》本文将详细介绍SpringRetry的重试机制,特别是@Retryable注解的使用及各种重试策略的配置,帮助开发者构建更加健... 目录引言一、SpringRetry基础知识二、启用SpringRetry三、@Retryable注解

SpringKafka错误处理(重试机制与死信队列)

《SpringKafka错误处理(重试机制与死信队列)》SpringKafka提供了全面的错误处理机制,通过灵活的重试策略和死信队列处理,下面就来介绍一下,具有一定的参考价值,感兴趣的可以了解一下... 目录引言一、Spring Kafka错误处理基础二、配置重试机制三、死信队列实现四、特定异常的处理策略五

一文详解JavaScript中的fetch方法

《一文详解JavaScript中的fetch方法》fetch函数是一个用于在JavaScript中执行HTTP请求的现代API,它提供了一种更简洁、更强大的方式来处理网络请求,:本文主要介绍Jav... 目录前言什么是 fetch 方法基本语法简单的 GET 请求示例代码解释发送 POST 请求示例代码解释

opencv图像处理之指纹验证的实现

《opencv图像处理之指纹验证的实现》本文主要介绍了opencv图像处理之指纹验证的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录一、简介二、具体案例实现1. 图像显示函数2. 指纹验证函数3. 主函数4、运行结果三、总结一、

一文详解SpringBoot响应压缩功能的配置与优化

《一文详解SpringBoot响应压缩功能的配置与优化》SpringBoot的响应压缩功能基于智能协商机制,需同时满足很多条件,本文主要为大家详细介绍了SpringBoot响应压缩功能的配置与优化,需... 目录一、核心工作机制1.1 自动协商触发条件1.2 压缩处理流程二、配置方案详解2.1 基础YAML