你真的了解UVM sequence的运行机制吗
1. 前言
UVM在sequence里提供了很多的callback方法给用户,从而更灵活地完成各种复杂场景的交互和控制执行顺序。我们可能在很多情况下只使用了body()方法,本文将介绍sequence里常见的callback方法,以及在不同场景下,它们的是否被调用和调用顺序。
2. start()方法参数
UVM中,sequence的执行是通过调用它的start()方法,可以直接调用start()或者间接调用`uvm_do_*宏来启动。Sequence的start()方法定义如下:
virtual task start (uvm_sequencer_base sequencer,uvm_sequence_base parent_sequence = null,int this_priority = -1,bit call_pre_post = 1);
start()有4个参数:
- 第一个参数sequencer指定哪一个sequencer去运行这个sequence,sequencer的类型必须要和sequence兼容,另外,如果调用start()方法没有传递sequencer的话,start()会默认使用第二个参数parent_sequence的sequencer。
- 第二个参数parent_sequence用于传递当前调用start()方法sequence的父sequence。如果parent_sequence传递的是null,那么当前sequence将是最顶层sequence(root sequence)。否则,在sequence层次结构上它将是parent_sequence的子sequence。Parent_sequence的pre_do(), mid_do()和post_do()方法将在子sequence执行期间被调用。
- 第三个参数this_priority用于指定仲裁优先级,数字越高优先级越高。默认情况下,也就是this_priority等于-1,那么sequence的priority等于父sequence的priority。如果sequence是root sequence,那么默认它的priority是100。当然,如果this_priority传递的值大于等于0,那么sequence的priority将直接使用该值。
- 第四个参数call_pre_post的参数值会影响到sequence的pre_body()和post_body()在否会在body()前后被调用。如果为1,那么在执行sequence的body()前会调用pre_body(),执行后会调用post_body()。反之则不会。
3. start()方法执行
Sequence start()方法会调用的方法可能有:pre_start(), pre_body(), pre_do(), mid_do(), body(), post_do(), post_body(), post_start()。为什么说是可能呢?我们在介绍start()参数时说过,parent_sequence参数和call_pre_post参数的取值会影响pre_do(), mid_do(), post_do(), pre_body()和post_body()的调用只有pre_start(), post_start()和body()不受这些参数的影响,一定会被调用,因此用户如果有些代码在任何情况下都必须被执行,最好放在这三个方法里。因此,根据用户的使用需求,sequence的start()方法被直接调用时可以通过控制参数来完成不同的功能。下面举例子来更清楚地说明。
例子1:
假设有两个sequence,分别叫parent_seq和sub_seq,sub_seq例化在parent_seq内,并且在parent_seq的body()内调用sub_seq.start(seqr, parent_seq, priority, call_pre_post),那么将按顺序调用以下方法:
sub_seq.pre_start() (task)
sub_seq.pre_body() (task) if call_pre_post==1parent_seq.pre_do(0) (task) if parent_sequence!=nullparent_seq.mid_do(this) (func) if parent_sequence!=null
sub_seq.body (task) YOUR STIMULUS CODEparent_seq.post_do(this) (func) if parent_sequence!=null
sub_seq.post_body() (task) if call_pre_post==1
sub_seq.post_start() (task)
根据上述伪代码,pre_do(), mid_do(), post_do(), pre_body()和post_body()是否执行是受call_pre_post和parent_sequence参数控制的。
例子2:
假设有两个sequence,分别叫parent_seq和sub_seq,sub_seq例化在parent_seq内,并且在parent_seq的body()内调用`uvm_do_with_prior(parent_seq, { constraints }, priority),那么将按顺序调用以下方法:
sub_seq.pre_start() (task)
parent_seq.pre_do(0) (task)
parent_req.mid_do(sub_seq) (func)sub_seq.body() (task)
parent_seq.post_do(sub_seq) (func)
sub_seq.post_start() (task)
根据上述伪代码,`uvm_do_with_prior宏在使用start()方法时,传递的call_pre_post参数默认设置为0,所以sub_seq的pre_body()和post_body()是不会被执行的。
例子3:
假设有1个sequence和1个sequence_item, 分别叫parent_seq和item,item例化在parent_seq内,并且在parent_seq的body()内调用parent_seq.start_item(item, priority)和parent_seq.finish_item(item),或者调用`uvm_do_with_prior(item, constraints, priority) ,那么将按顺序调用以下方法:
sequencer.wait_for_grant(prior) (task) \ start_item \
parent_seq.pre_do(1) (task) / \`uvm_do* macros
parent_seq.mid_do(item) (func) \ /
sequencer.send_request(item) (func) \finish_item /
sequencer.wait_for_item_done() (task) /
parent_seq.post_do(item) (func) /
根据上述伪代码,parent_seq在调用start_item()/finish_item()或`uvm_do宏去启动item的过程中,parent_seq的pre_do(), mid_do()和post_do()方法也会被按顺序调用。
另外,pre_do(is_item)里的is_item的值会指示是启动sequence还是sequence_item导致它被调用,mid_do()和post_do()会把启动它们的sequence或sequence_item的指针传递给parent_sequence,这样可以更灵活完成更多功能,可以发挥自己的想象力。比如说,在mid_do()里根据子sequence的不同,初始化子sequence的内部变量;或者统计在pre_do()里启动sequence_item和sequence的个数等等。
相关文章:

你真的了解UVM sequence的运行机制吗
1. 前言 UVM在sequence里提供了很多的callback方法给用户,从而更灵活地完成各种复杂场景的交互和控制执行顺序。我们可能在很多情况下只使用了body()方法,本文将介绍sequence里常见的callback方法,以及在不同场景下,它们的是否被…...
Bug升级记
2023.12.28 (1) 小程序session_key泄露隐患 核心:session_key这个字段及对应值不应该传到小程序客户端等服务器外的环境 错误操作:直接在小程序调用https://api.weixin.qq.com/sns/jscode2session并将session_key作为参数进行明文传输 正确操…...

爬虫详细教程第1天
爬虫详细教程第一天 1.爬虫概述1.1什么是爬虫?1.2爬虫工具——Python1.3爬虫合法吗?1.4爬虫的矛与盾1.4.1反爬机制1.4.2反爬策略1.4.3robots.txt协议 2.爬虫使用的软件2.1使用的开发工具: 3.第一个爬虫4.web请求4.1讲解一下web请求的全部过程4.2页面渲染…...

[Linux] MySQL数据库的备份与恢复
一、数据库备份的分类和备份策略 1.1 数据库备份的分类 1)物理备份 物理备份:对数据库操作系统的物理文件(如数据文件、日志文件等)的备份。 物理备份方法: 冷备份(脱机备份) :是在关闭数据库的时候进…...
Django、Python版本升级问题大汇总
Django3.0升级到4.1,Python3.8升级到3.11.6问题大汇总 报错1:ERROR: Could not build wheels for cffi, uWSGI, which is required to install pyproject.toml-based projects ERROR: Could not build wheels for cffi, uWSGI, which is required to install pyproject.tom…...

2023-12-30 AIGC-LangChain介绍
摘要: 2023-12-30 AIGC-LangChain介绍 LangChain介绍 1. https://youtu.be/Ix9WIZpArm0?t353 2. https://www.freecodecamp.org/news/langchain-how-to-create-custom-knowledge-chatbots/ 3. https://www.pinecone.io/learn/langchain-conversational-memory/ 4. https://de…...

pytorch01:概念、张量操作、线性回归与逻辑回归
目录 一、pytorch介绍1.1pytorch简介1.2发展历史1.3pytorch优点 二、张量简介与创建2.1什么是张量?2.2Tensor与Variable2.3张量的创建2.3.1 直接创建torch.tensor()2.3.2 从numpy创建tensor 2.4根据数值创建2.4.1 torch.zeros()2.4.2 torch.zeros_like()2.4.3 torch…...
storyBook play学习
场景 在官方给出的案例中, Page.stories.js import { within, userEvent } from storybook/testing-library import MyPage from ./Page.vueexport default {title: Example/Page,component: MyPage,parameters: {// More on how to position stories at: https:/…...
Android Matrix画布Canvas旋转Rotate,Kotlin
Android Matrix画布Canvas旋转Rotate,Kotlin private fun f1() {val originBmp BitmapFactory.decodeResource(resources, R.mipmap.pic).copy(Bitmap.Config.ARGB_8888, true)val newBmp Bitmap.createBitmap(originBmp.width, originBmp.height, Bitmap.Config.…...

私有部署ELK,搭建自己的日志中心(三)-- Logstash的安装与使用
一、部署ELK 上文把采集端filebeat如何使用介绍完,现在随着数据的链路,继续~~ 同样,使用docker-compose部署: version: "3" services:elasticsearch:container_name: elasticsearchimage: elastic/elasticsearch:7.9…...
2023就这样过去了,2024会更好吗?
2023年,不是很好 2023年是疫情后的第一年,疫情过去了,大家都有大多的希望,希望经济可以恢复,希望信心可以恢复,但是整体都是远远低于预期的。年初的一片热潮,年中的一片哀嚎,年底基…...
SpringBoot加载配置的6种方式
从配置文件中获取属性应该是SpringBoot开发中最为常用的功能之一,简单回顾一下这六种的使用方式: 说明Environment对象Environment是springboot核心的环境配置接口,它提供了简单的方法来访问应用程序属性,包括系统属性、操作系统…...

大语言模型(LLM)训练平台与工具
LLM 是利用深度学习和大数据训练的人工智能系统,专门 设计来理解、生成和回应自然语言。 大模型训练平台和工具提供了强大且灵活的基础设施,使得开发和训练复杂的语言模型变得可行且高效。 平台和工具提供了先进的算法、预训练模型和优化技术,…...
docker配置buildx插件
一、介绍 Docker buildx是docker的一个插件 支持Moby BuildKit的所有特性 可以跨CPU架构编译镜像 可以在多节点编译镜像 二、前提 使用 buildx 作为 docker CLI 插件需要使用 Docker 19.03 或更新版本。 三、配置步骤 1)客户端:在客户端的配置文…...
mysql 空间函数
ST_GeomFromText:将文本表示的几何对象转换为几何对象。 SELECT ST_GeomFromText(POINT(1 1)); ST_AsText:将几何对象转换为文本表示。 SELECT ST_AsText(ST_GeomFromText(POINT(1 1))); ST_Contains:判断一个几何对象是否包含另一个几何对象…...

vscode调试 反汇编c/c++ 查看汇编代码gdb/lldb
先看下流程! 先看下流程! 有问题请留言! 文章目录 必备F5开启调试左侧侧边栏->确保打开回调栈右键函数栈->查看反汇编 方法二:手动输入命令查看 必备 使用c/c 插件,这应该是必备的。 F5开启调试 左侧侧边栏-&…...
总结项目中oauth2模块的配置流程及实际业务oauth2认证记录(Spring Security)
文章目录 简单示例添加oauth2的依赖配置认证服务器配置资源服务器配置安全使用http或者curl命令测试 实际业务中工具类(记录):认证服务器资源服务器、配置安全用户验证登录控制层配置文件application.yml 项目中用过的spring security&#x…...
传感器原理与应用复习
测量与误差 传感器原理与应用复习—测量概述与测量误差 传感器特性与应变式传感器 传感器原理与应用复习–传感器基本特性与应变式传感器 电感式传感器 传感器原理与应用复习–电感式传感器 电容式与电压式传感器 传感器原理与应用复习–电容式与压电式传感器 电磁式与…...
蓝桥杯python比赛历届真题99道经典练习题 (8-12)
【程序8】 题目:输出9*9口诀。 1.程序分析:分行与列考虑,共9行9列,i控制行,j控制列。 2.程序源代码: #include "stdio.h" main() {int i,j,result;printf("\n");for (i=1;i<10;i++){ for(j=1;j<10;j++){result=i*j;printf("%d*%d=%-3…...

八个理由:从java8升级到Java17
目录 前言 1. 局部变量类型推断 2.switch表达式 3.文本块 4.Records 5.模式匹配instanceof 6. 密封类 7. HttpClient 8.性能和内存管理能力提高 前言 从Java 8 到 Java 20,Java 已经走过了漫长的道路,自 Java 8 以来,Java 生态系统…...

Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...

python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...

【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...

QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...

Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...

dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...

初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...