[UVM源代码研究] 关于default_sequence和p_sequencer的一点思考

UVM:2.4 UVM的终极大作sequence->2.4.3 default_sequence 的使用 1.上一节的例子中,sequence是在my_env的,但实际应用中,使用最多的还是通过default_sequence 的方式启动sequence。在某个component (如 my_env)的build_phase 中设置如下代码即可: virtual function void build_phase(uvm_phase phase); super.build_phas 阅读详情
AI摘要

文章探讨了在UVM虚拟序列(virtual_sequence)构造函数中能否访问p_sequencer的问题,发现p_sequencer的赋值在sequence启动后,而在构造函数执行前。作者通过源代码分析揭示了UVM的内部机制,包括phase机制和config_db设置顺序。

[UVM源代码研究] 关于default_sequence和p_sequencer的一点思考

1. 引言

今天在用virtual_sequence和virtual_sequencer的时候碰到了一个以前没太留意的问题,就是说在virtual_sequence的构造函数new()中能否引用p_sequencer中的内容,换句话说,在virtual_sequence的new()函数中p_sequencer有没有完成创建。

如图1所示,这样调用是否会报错。

图1 virtual_sequence的new()函数中引用p_sequencer句柄

在这里插入图片描述

答案是会报错,如图2所示

图2 图1代码log结果

在这里插入图片描述

意思就是说p_sequencer还没有被创建就引用了。

这里就涉及到一个问题,p_sequencer所指向的virtual_sequencer什么时候才被创建了?

我们实际项目中一般的做法都是在test_base或者env的build_phase创建virtual_sequencer,如下图3所示

图3 virtual_sequencer的创建

在这里插入图片描述

然后virtual_sequence在testcase的build_phase被设为virtual_sequencer的main_phase上的default_sequence,如图4所示

图4 virtual_sequence被set为default_sequence

在这里插入图片描述

那么问题就转化为了两个时间点执行的先后顺序问题,这两个时间点分别是:

  1. 我们执行的virtual_sequence的构造函数是在什么时间点(t1)执行的呢?
  2. uvm_declare_psequencer()所赋值的p_sequencer又是在什么时间点(t2)指向了我们实际的virtual_sequencer实例的呢?

结论我们不难得出,之所以出现图2的错误,一定是t1在t2之前执行了,导致p_sequencer还是没有指向任何实例的空句柄。

下面我们从UVM源代码执行顺序的角度来看看t1和t2分别是什么时候被执行的。

2. 源代码分析

首先我们来看宏 `uvm_declare_p_sequencer 都干了啥。

查找宏 `uvm_declare_p_sequencer 的定义如图5所示:

图5 src/macros/uvm_sequence_defines.svh中的代码

在这里插入图片描述

`uvm_declare_p_sequencer可以认为就是定义一个SEQUENCER类型的变量p_sequencer,并且定义一个函数m_set_p_sequencer()(这个函数在uvm_sequence类中肯定以经存在了,否则还需要用户再手动调用,而我们从来没有自己调用过,所以UVM源代码中原本应该已经实现了该函数的调用了,这里要做的就是override覆盖原有函数定义),该函数将m_sequencer $cast给了p_sequencer,由此我们关注的点变成了m_set_p_sequencer()这个函数在什么时候被调用的。

源代码目录查找m_set_p_sequencer()信息,如图6所示,m_set_p_sequencer()在set_sequencer()中被调用,

图6 src/seq/uvm_sequence_item.svh中的代码截图

在这里插入图片描述

同一个文件继续搜索如图7所示显示set_sequencer()在set_item_context()中被调用

图7 src/seq/uvm_sequence_item.svh中的代码截图

在这里插入图片描述

源代码目录搜索set_item_context()如图8所示,set_item_context()在start()中被调用。

图8 src/seq/uvm_sequence_base.svh中的代码截图

在这里插入图片描述

即sequence启动的时候才会调用m_set_p_sequencer()函数,完成p_sequencer的赋值。

而virtual_sequence中的构造函数呢?

答案不言而喻,肯定是在创建virtual_sequence的时候被调用的,那结论是不是很显而易见了,肯定是先创建sequence才会启动sequence,所以t1肯定在t2前面执行,所以肯定不能在virtual_sequence的构造函数里引用p_sequencer。

下面我们再做一些额外的探索,就是上面提到的virtual_sequence在testcase的build_phase被设为virtual_sequencer的main_phase上的default_sequence,那么这个default_sequence在UVM源代码中又是在when & where被创建执行的呢?

源代码目录搜索一下"default_sequence",在src/seq/uvm_sequencer_base.svh文件中找到如图9所示的内容(继承关系为uvm_sequencer extends uvm_sequencer_param_base extends uvm_sequencer_base)

图9 src/seq/uvm_sequencer_base.svh中的代码截图

在这里插入图片描述

但是这里使用的是get_config_string来获取的,而我们在set的时候传递的是uvm_object_wrapper类型,所以这里由于类型不一致并不会get到我们set的内容。

继续往下查看,如图10所示。

图10 src/seq/uvm_sequencer_base.svh中的代码截图

在这里插入图片描述

可以看到1373行get的类型跟我们get的类型是一致的,并且会在1376行创建我们传递过来的virtual_sequence类型的实例,这便是我们virtual_sequence中的构造函数new调用的地方,至于这里的1367行声明的uvm_factory类型的变量f以及1376行通过调用f.create_object_by_type()创建virtual_sequence这部分内容之前在讲factory的时候有提到过,这里就不细讲了,可以简单认为是virtual_sequence中通过`uvm_object_utils宏将virtual_sequence类注册到factory中,这样uvm_factory就可以通过查找类型wrapper来创建对应的变量。(这个wrapper的类型是通过testcase的build_phase中set过来的virtual_sequence::type_id::get()获取的,也就是说set的是一个uvm_object_wrapper类型,而不是一个实例,uvm_object_wrapper作为一个UVM源代码中定义的基类可以接受任何类型)

1394行主动调用set_sequencer()将virtual_sequencer设置为virtual_sequence启动的sequencer(因为virtual_sequence被set到了virtual_sequencer的main_phase,所以这里的this指的就是virtual_sequencer)。根据图6的分析,其实这一步就已经实现了p_sequencer的赋值的。

1408行启动virtual_sequence。

这个start_phase_sequence是在如图11所示代码中被调用的。由之前我们在 数字验证大头兵:[UVM源代码研究] 浅谈UVM PHASE机制的运行 中所讲的内容可知,在每一个task_phase都会调用该函数,这样其实我们在build_phase除了把这个virtual_sequence设置到virtual_seuquencer的main_phase之外,另外11中runtime_phase和run_phase都是可以的,就看你想让这个virtual_sequence什么时间点被执行起来。

图11 src/base/uvm_task_phase.svh中的代码截图

在这里插入图片描述

这里再做一点引申,由图10的1370行可以看出,除了使用与1373行代码对应的

uvm_config_db#(uvm_object_wrapper)::set(this, "env.v_sqr.main_phase", "default_sequence", virtual_sequence::type_id::get());

的方法set default_sequence,还可以用与1370行对应的代码的另一种方法(直接set virtual_sequence的实例):

virtual_sequence myseq = new("myseq");
uvm_config_db #(uvm_sequence_base)::set(null, "env.v_sqr.main_phase", "default_sequence", myseq);

3. 总结

本文通过工作过程中使用virtual_sequence和virtual_sequencer时遇到的一个bug,引申出了UVM源代码中`uvm_declare_psequencer()宏和default_sequence相关代码的实现机制,对virtual_sequence®的使用相信会有更深刻的认识。

回到我们文章一开始遇到的那个bug问题,如果我们想在virtual_sequence的主体代码body()之前做一些预处理工作(这也是为什么会在new()函数里引用p_sequencer的原因),可以把这部分工作放在pre_body()里完成。

UVM实战_4_UVM中的sequence总结 本篇主要总结《UVM实战》第6章:sequence基础提示:这里对文章进行总结:例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。 阅读详情

相关推荐

UVM验证平台搭建避坑指南:搞懂default_sequence、手动启动sequence和objection管理的三种姿势

本文深入解析UVM验证平台中default_sequence配置、手动启动sequence和test中管理objection三种启动方式的实现细节与适用场景。通过对比分析各方式的优缺点和常见问题,为芯片验证工程师提供实用的避坑指南和选型建议,帮助优化验证平台搭建效率。

weixin_31321361的博客 289

default_sequence的作用?

UVM中default_sequence的作用

沧月九流的博客 4522

【UVM基础】m_sequencer 和 p_sequencer 概念与区别(面试常问)

【UVM基础】m_sequencer 和 p_sequencer

悟已往之不谏 知来者之可追 3416

sequence的启动方式和sequence内部函数的调用

1,default_sequence 的方式启动 2,通过start函数直接启动

zyj0oo0的博客 4961

【GAMES101】现代计算机图形学入门 资料整理

课程网址 课程主页 包括ppt 课程PPT和视频 一篇搞定!GAMES101现代计算机图形学入门(全) 作业链接地址 作业论坛 GAMES101课程环境搭建(Win10+VSCode) 计算机图形学笔记 虎书pdf 提取:n2rx 【必须】:高等数学(微积分、线性代数)、算法、数据结构 【非必须】:信号处理、数值分析、大学物理(光学) 在线公式编辑器 一定要做作业,如果个人要配置环境的话应该是配置opencv,eigen这两个核心库就行了,目前觉得最核心的一个作业是作业3,实现着色器和渲染管线,做完一遍

ysh的博客 2683

Python 高级语法:闭包

闭包(Closure)是函数式编程中的一个重要概念。在Python中,闭包可以简单理解为:一种特殊的函数。外函数:嵌套函数中最外层的函数称之为外函数。内函数:嵌套函数中最内层的函数称之为内函数;内函数引用了外函数的临时变量;外函数的返回使用了临时变量的内函数。

moment159的博客 2353

UVM设计模式 ( 四 ) 模板模式、策略模式、default_sequence、uvm_callback

上一篇介绍了结构型设计模式:单例模式和工厂模式,接下来介绍行为型设计模式在UVM中的应用。 策略模式

Holden_Liu的博客 5136

SpringBoot 自定义注解来实现动态切换数据源

/ 初始化数据源@Override@Inherited@Pointcut(“@annotation(包名.aop.DataSource)”) public void@Pointcut 注解定义了一个切点,名称为 dynamicDataSource。@annotation(包名.aop.DataSource) 表示这个切点匹配所有带有 @DataSource 注解的方法。

晴天飛 雪的博客 1836

UVM设计模式 (七)命令模式、三种sequence启动方式、start_item/finish_item、中介模式、virtual sequence

a

Holden_Liu的博客 2万+

切比雪夫(最小区域法)直线拟合算法

切比雪夫,最小区域法直线拟合

闪电彬彬的博客 3961

新手必看!华为S5700交换机健康检查清单:从CPU到日志的完整巡检流程

本文为新手网管人员提供华为S5700交换机的健康检查完整指南,涵盖CPU、内存、温度、日志等核心指标的日常维护流程。通过详细的display命令和实用案例,帮助用户快速掌握设备体检技巧,确保交换机稳定运行。

weixin_29251337的博客 236

default_sequence理解

UVM实战里面的介绍 sequence 必须要做为 sequencer 的某个 phase(比如 main_phase)的 default_sequence 一般的例子都是把自己定义的sequence通过config设置成main——phase的default——sequence eg: uvm_config_db#(uvm_object_wrapper)::set(this, "env.i_agt.sqr.main_phase", "default_sequenc e", my_sequence

hyykq的博客 2174

嵌入式Linux Qt应用程序卡死问题分析记录

根据应用和系统层面的分析,软件功能异常和卡死现象的原因是系统控制台/dev/console阻塞导致依赖其的相关应用和命令异常。系统控制台/dev/console阻塞的原因还未确定,最近的软件版本和其他测试同事未出现该问题,所以很大可能是串口线的问题,待后续有进展了继续更新。

V10_x的博客 1636

UVM中启动sequence的方法

UVM中启动sequence的方式有两种方式,分别为手工启动和自动启动。

W1Z1Q的专栏 8224

Nvidia Jetson平台 JP4.2.1版本GStreamer视频采集异常问题调试记录

Nvidia Jetson平台GStreamer in JP4.2.1不能采集但是 v4l2-ctl和 ffmpeg能正常采集视频。

jzwjzw19900922的博客 2124

深度测评:Accio Work——目前普通用户最友好的多 Agent 协同工具

摘要:Accio Work是阿里国际站推出的多Agent协同工具,通过借鉴古代"三省六部制"构建高效协作框架。该工具支持主流大模型,可配置专业Agent角色,实现40分钟内完成复杂产品PRD等高效协作。其亮点在于直观的UI设计和流程驱动机制,能强制各Agent从专业视角深度思考。虽然超长对话稳定性有待优化,但作为目前最用户友好的多Agent工具,显著降低了构建复杂AI团队的门槛,成为提升个人和小微企业生产力的利器。

Maynor的博客 1726

UVM中的sequence

sequence基础 1. 如果将激励放在driver的main_phase中,是可行的,但是如果要对激励作修改,那么扩展性较差,所以我们将激励改为放在sequence中去写。 driver就负责驱动激励就好了,而具体是什么样的激励,应该由sequence去完成。 2. 当定义完一个sequence后,可以使用start任务将其启动。 my_sequence my_seq; my_seq = my_sequence::type_id::create("my_seq"); my_seq.start(seque

weixin_44915807的博客 3393

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

UVM基础-m_sequencer和p_sequencer

在UVM的sequence机制中,sequence其实是独立与验证环境之外的部件,作为uvm_object而存在,那么sequence最终是要在某个sequencer上启动的,那么启动的方式有两种:tar_seq.start(env.i_agt.tar_sqr)config_db #(uvm_object_wrap)::set(this, “env.i_agt.sqr.main_phase”, “default_sequence”, tar_seq) 此时sequence会自动调用其pre_bo

qq_36955425的博客 6405

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

uvm中sequence机制详解

sequence机制详解

whddddddddddd的博客 3456

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

【UVM】sequence

将不同类型transaction在同个sequencer上启动:将sequencer和driver能够接受的数据类型设置为uvm_sequence_item,然后需要在driver中用cast转换成员类型。原理:是driver将rsp推送给sequencer,而sequencer内部维持一个队列,当有新的response进入时,就推入此队列,队列默认大小为8。uvm_send系列宏的意义:可以使发送的transaction都使用同一块内存,只是其中的内容可以不同,这样可以节省内存。

加油小狗的博客 1182

UVM中sequence的两种启动方式

第一种: 当完成一个sequence的定义后,可以使用start任务将其启动: task my_env::main_phase(uvm_phase phase); my_sequence seq; // phase.raise_objection(this); seq = my_sequence::type_id::create("seq"); //或者 seq = new("seq"); seq.start(i_agt.sqr

Alfred的博客 1507

UVM学习之sequence启动

无

weixin_60687833的博客 1631

UVM中seq.start()和default_sequence执行顺序

解析UVM中seq.start()和default_sequence如果在同一个phase中,它们的执行顺序

W1Z1Q的专栏 2925

uvm_declare_p_sequencer

问题:p_sequencer的理解 张强UVM白皮书中对p_sequencer的使用做了详尽的说明,但是一直没有理解p_sequencer的本质,现在似乎有点理解了。 1.考虑如下情况,sequencer 有如下变量: 2.在sequence 发送transaction 时,必须设置此dmac 和smac,sequence 的body如何得到这两个值呢? 1)在介绍sequence 时,内部有m_sequencer, 直接使用m_sequencer 得到这两个变量: 编译错误: ...

zilan23的博客 8112

uvm_declare_p_sequencer获取sequencer原理

uvm_declare_p_sequencer获取sequencer原理

Kizuna_AI的博客 1893
上一篇: [验证百花筒] 聊聊模块级寄存器模型如何复用到系统级
下一篇: [UVM源代码研究] 聊聊uvm_sequence中常用的宏以及方法
数字验证Kane陈
博客等级 码龄12年 662粉丝 48原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值