二、UVM Sequencer和Sequence

news2024/11/20 21:24:30

了解sequencer与driver之间传递sequence item的握手过程,也掌握了sequence与item之间的关系。接下来对sequence挂载到sequencer的常用方法总结,可以通过这些方法和宏的介绍,了解到它们不同的使用场景面对多个sequence如果需要同时挂到sequence时,那就要面临这仲裁的需要,uvm_sequencer自带有仲裁特性,结合sequence的优先级设定,最终可以实现想要的效果。

Sequence和Item的发送实例

class bus_trans extends uvm_sequence_item; 
	rand int data; 
	`uvm_object_utils_begin(bus_trans)
		uvm_field_int(data,UVM_ALL_ON)
	uvm_object_utils_end
endclass
class child_seq extends uvm_sequence; 
	`uvm_object_utils(child_seq)
	...
	task body(); 
		uvm_sequence_item tmp; 
		bus_trans req; 
		tmp=create_item(bus_trans::get_type(),m_sequencer,"req"); 
		void'($cast(req, tmp)); 
		start_item(req); 
		req.randomize with {data==10;}; 
		finish_item(req);
	endtask 
endclass
class top_seq extends uvm_sequence; 
	`uvm_object_utils(top_seq)
	...
	task body(); 
		uvm_sequence_item tmp; 
		child_seq cseq; 
		bus_trans req;
		//create child secuence and items 
		cseg=child_seq::type_id::create("cseq"); 
		tmp=create_item(bus_trans::get_type(),m_sequencer,"req");
		//send child sequence via start()
		cseq.start(m_secquencer,this);
		//send sequence item 
		void'($cast(req, tmp)); 
		start_item(req); 
		req.randomize with {data==20;}; 
		finish_item(req); 
	endtask 
endclass
class sequencer extends uvm_sequencer;
	`uvm_component_utils(sequencer)
	...
endclass 
class driver extends uvm_driver; 
	`uvm_component_utils(driver)
	...
	task run_phase(uvm_phase phase); 
		REQ tmp; 
		bus_trans req; 
		forever begin 
			seq_item_port.get_next_item(tmp); 
			void'($cast(req, tmp));
			`uvm_info("DRV",$sformatf("got a item \n %s", req.sprint()), UVM_LOW) 
			seq_item_port.item_done(); 
		end 
	endtask 
endclass
class env extends uvm_env; 
	sequencer sqr; 
	driver drv; 
	`uvm_component_utils(env)
	...
	function void build_phase(uvm_phase phase); 
		sqr=sequencer::type_id::create("sqr", this); 
		drv=driver::type_id::create("drv", this); 
	endfunction 
	function void connect_phase(uvm_phase phase); 
		drv.seq_item_port.connect(sqr.seq_item_export);
	endfunction
endclass
class test1 extends uvm_test; 
	env e; 
	`uvm_component_utils(test1)
	...
	function void build_phase(uvm_phase phase);
		e=env::type_id::create("e", this); 
	endfunction 
	task run_phase(uvm_phase phase); 
		top_seq seq; 
		phase.raise_objection(phase); 
		seq=new(); 
		seq.start(e.sqr); 
		phase.drop_objection(phase); 
	endtask 
endclass

输出结果:

UVM_INFO @ 0:uvm_test_top.e.drv [DRV] got a item
...
UVM_INFO @ 0:uvm_test_top.e.drv [DRV] got a item
...

发送sequence/item方法建议

在这段代码中,主要使用了两种方法。第一个方法是针对将sequence挂载到sequencer上的应用。

uvm_sequence::start 

uvm_sequence::start(uvm_sequencer_base sequencer, 
					uvm_sequence_base parent_sequence=null 
					int this_priority = -1,bit call_ pre_post=11)
  • 在使用该方法的过程中,首先应该指明sequencer的句柄。如果该sequence是顶部的sequence,即没有更上层的sequence嵌套它,则它可以省略对第二个参数parent_sequence的指定
  • 第三个参数的默认值-1会使得该sequence如果有parent_sequence会继承其优先级值,如果它是顶部(root)sequence,则其优先级会被自动设定为100,用户也可以自己制定优先级数值。
  • 第四个参数建议使用默认值,这样的话uvm_sequence::pre_body()和uvm_sequence::post_body()两个方法会在uvm_sequence::body()的前后执行

在上面的代码中, child_seq被嵌套到top_seq中继而在挂载时需要指定parent_sequence;而在test一层调用top_seq时,由于它是root sequence,则不需要再指定parent sequence,这一点需要注意。另外,在调用挂载sequence时,需要对这些sequence进行例化。

uvm_sequence::start_item/finish_item

uvm_sequence::start_item(uvm_sequence_item item,int set_priority=-1,
						uvm_sequencer_base sequencer=null);
uvm_sequence::finish_item(uvm_sequence_item item,int set_priority=-1)
  • 对于start_item()的使用,第三个参数需要注意是否要将item挂载到“非当前parent sequence挂载的sequencer”上面即如果想将item和其parent sequence挂载到不同的sequencer上面,你就需要指定这个参数
  • 在使用这一对方法时,除了需要记得创建item,例如通过uvm_object::create()或者uvm_sequence::create_item(),还需要在它们之间完成item的随机化处理。 

 发送sequence/item方法解析

从这一点建议来看,对于一个item的完整传送,sequence要在sequencer一侧获得通过权限,才可以顺利将item发送至driver。可以通过拆解这些步骤得到更多的细节:

  • 创建item。
  • 通过start_item()方法等待获得sequencer的授权许可,其后执行parent sequence的方法pre_do()。
  • 对item进行随机化处理。
  • 通过finish_item()方法在对item进行了随机化处理之后,执行parent sequence的mid_do(),以及调用uvm_sequencer::send_request()和uvm_sequencer::wait_for_item_done()来将item发送至sequencer再完成与driver之间的握手。最后,执行了parent_sequence的post_do()。

 如果对比start()方法和start_item()/finish_item(),首先要分清它们面向的挂载对象是不同的。

item发送时相关方法的执行顺序如下

 很多情况start_item会立马返回;

发送序列的相关宏

正是通过几个sequence/item宏来打天下的方式,可以通过uvm_do/uvm_do_with来发送无论是sequence还是item。这种不区分对象是sequence还是item的方式,带来了不少便捷。

不同的宏,可能会包含创建对象的过程也可能不会创建对象。例如uvm_do/uvm_do_with会创建对象,而uvm_send则不会创建对象,也不会将对象做随机处理,因此要了解它们各自包含的执行内容和顺序。

此外还有其它的宏,例如,将优先级作为参数传递的uvm_do_prio uvm_do_on_prio等,还有专门针对sequence的uvm_create_seq/uvm_do_seq/uvm_do_seq_with等宏。

序列宏的示例

class child_seq extends uvm_sequence; 
	...
	task body(); 
	bus_trans req; 
	`uvm_create(req)
	`uvm_rand_send_with(req,{data==10;})
endtask 
endclass class top_seq extends uvm_sequence; 
	...
	task body(); 
		child_seq cseq; 
		bus_trans req;
		// send child sequence via start()
		`uvm_do(cseq)
		//send secquence item 
		`uvm_do_with(req,{data==20;})
	endtask
endclass

序列宏建议

在发送sequence/item的几点建议:

  • 无论sequence处于什么层次,都应当让sequence在test结束前执行完毕。但这不是充分条件,一般而言,还应当保留出一部分时间供DUT将所啊发送的激励处理完毕,进入空闲状态才可以结束测试。
  • 尽量避免使用fork-join_any或者fork-join_none来控制sequence的发送顺序。因为这背后隐藏的风险是,如果想终止在后台运行的sequence线程而简单使用disable方式,那么就可能在不恰当的时间点上锁住sequencer。
  • 一旦sequencer被锁住而又无法释放,接下来也就无法发送其它sequence。所以如果想实现类似fork-join_any或者fork-join_none的发送顺序,还应当在使用disable前,对各个sequence线程的后台运行保持关注,尽量在发送完item完成握手之后再终止sequence,这样才能避免sequencer被死锁的问题。
  • 如果要使用fork-join方式,那么应当确保有方法可以让sequence线程在满足一些条件后停止发送item。否则只要有一个sequence线程无法停止,则整个fork-join无法退出。面对这种情况,仍然需要考虑监测合适的事件或者时间点,才能够使用disable来关闭线程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/418553.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习:基于AdaBoost算法对信用卡精准营销建立模型(附案例实战)

机器学习:基于AdaBoosts算法对信用卡精准营销建立模型 作者:i阿极 作者简介:Python领域新星作者、多项比赛获奖者:博主个人首页 😊😊😊如果觉得文章不错或能帮助到你学习,可以点赞&a…

OPNET Modeler 例程——M/M/1 队列建模

文章目录一、例程概述二、模型构建三、仿真配置及结果1.M/M/1 队列2.M/M/n 队列总结一、例程概述 本例程是使用节点编辑器建立一个 M/M/1 队列模型,同时对仿真收集到的统计数据进行数学分析。M/M/1 队列由先进先出的缓冲区组成,数据包的到达服从指数(泊…

Mybatis动态SQL查询 --(附实战案例--8888个字--88质量分)

目录 前言 一、动态SQL---if标签 1. 持久层添加用户通用查询方法 2. 映射文件添加相关标签 3. 测试类新建测试方法 4. 运行结果 二、动态SQL---where标签 1. 映射文件添加相关标签 2. 测试类新建测试方法 3. 运行结果 三、动态SQL---set标签 1. 持久层添加用户更新方…

DNS域名协议(IP段获取DNS服务器、反解析获取主机域名、查找子域名记录、查看子域名记录)

IP段获取DNS服务器 nmap 192.168.190.0/24 -p53 反解析获取主机域名 host 192.168.137.149 192.168.137.149 查找子域名记录 dig 192.168.137.149 -t axfr MAILMAN.com 查看子域名记录 dig 192.168.137.149 -t axfr _msdcs.MAILMAN.com

神经微分方程Resnet变体实现内存下降和保持精度

本文内容&#xff1a; 1、学习神经微分方程的笔记&#xff0c;主要锻炼自己学习新知识的能力和看有很多数学原理的论文能力&#xff1b; 2、神经微分方程可以用于时序数据建模、动力学建模等&#xff0c;但是本文专注于分类问题-resnet变体<比较容易理解>&#xff1b; …

StringBuffer,StringBuilder,

StringBuffer 结构示意图&#xff0c; Serializable,可以实现网络传输 package com.jshedu.StringBuffer_;/*** author Mr.jia* version 1.0*/public class StringBuffer01 {public static void main(String[] args) {/*1.在父类中AbstractStringBuilder 属性char[] value不是f…

博弈论在电动车和电网系统中分布式模型预测控制研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Android中使用有趣的指示器和过渡自定义 Compose Pager

Android使用有趣的指示器和过渡自定义 Compose Pager google最近在compose中新增了Pager控件&#xff0c;HorizontalPager和VerticalPager。 页面之间的转换 该文档涵盖了访问页面从“对齐”位置滚动到多远的基础知识。我们可以使用这些信息来创建页面之间的过渡效果。 例…

DC:4通关详解

信息收集 漏洞发现 访问web 尝试弱口令 账号admin 可以执行ls du df看看发的包,我们是否有机会执行任意命令 发现post传参radio处可以任意命令执行 弹个shell先 提权 从vps上下载LinEnum.sh来枚举脆弱性 优化shell 现在shell就有自动补齐了 在/home/jim下发现密码字典…

cube-studio AI平台 提供开源模型示例列表(3月份)

文章目录背景AI应用商店背景 cube是腾讯音乐开源的一站式云原生机器学习平台&#xff0c;目前主要包含 1、数据管理&#xff1a;特征存储、在线和离线特征&#xff1b;数据集管理、结构数据和媒体数据、数据标签平台 2、开发&#xff1a;notebook(vscode/jupyter)&#xff1b…

【PTA天梯赛】L1-001 L1-002 L1-003 L-004 L-005 L-006 L-007 L-008 L-009 L1-010 c++

&#x1f680; 个人简介&#xff1a;CSDN「博客新星」TOP 10 &#xff0c; C/C 领域新星创作者&#x1f49f; 作 者&#xff1a;锡兰_CC ❣️&#x1f4dd; 专 栏&#xff1a;狠狠的刷题&#xff01;&#xff01;&#xff01;&#x1f308; 若有帮助&#xff0c;还请…

【Ubuntu 22.04 上配置 FTP 服务器步骤】

Ubuntu 22.04 上配置 FTP 服务器步骤 1.安装 vsftpd 软件包&#xff1a; sudo apt-get update sudo apt-get install vsftpd 2.查看vsftpd版本和状态&#xff0c;确认vsftpd安装成功和正常启动 2.修改 vsftpd 配置文件&#xff1a; sudo nano /etc/vsftpd.conf 3.在配置文件中…

Ethercat概念学习

Ethercat技术调研 背景 最近我们要基于Ethercat技术进行开发&#xff0c;首先需要了解其基本原理&#xff0c;github上看到了有相关实现&#xff0c;一起来看看吧。 Ethercat技术 速度更快 传输速率:2*100 Mbaud 全双工 高速性、高实时性 微秒级 像火车一样有帧头、帧尾&a…

如何对农田温室气体进行有效模拟?

农业是甲烷&#xff08;CH4&#xff09;、氧化亚氮&#xff08;N2O&#xff09;和二氧化碳&#xff08;CO2&#xff09;等温室气体的主要排放源&#xff0c;占全产业排放的13.5%。农田温室气体又以施肥产生的N2O和稻田生产产生的CH4为主&#xff0c;如何对农田温室气体进行有效…

计算机组成原理(四)输入/输出系统

一、概述 1.1前言 I/O设备是计算机组成原理之硬件最后的一部分。输入输出系统是计算机系统当中种类最多、功能最多、结构最复杂、构成也最多样的系统。在现代计算机系统当中&#xff0c;外部设备的总成本可以占到计算机总成本的80%以上。可以说&#xff0c;没有这些丰富多彩的外…

「Vue面试题」Vue项目中有封装过axios吗?主要是封装哪方面的?

一、axios是什么 axios 是一个轻量的 HTTP客户端 基于 XMLHttpRequest 服务来执行 HTTP 请求&#xff0c;支持丰富的配置&#xff0c;支持 Promise&#xff0c;支持浏览器端和 Node.js 端。自Vue2.0起&#xff0c;尤大宣布取消对 vue-resource 的官方推荐&#xff0c;转而推荐…

(原创)Flutter基础入门:实现各种Shape效果

前言 上一篇博客讲了Flutter的装饰器Decoration Flutter基础入门&#xff1a;装饰器Decoration 装饰器就可以帮我们实现各种Shape效果 但上篇文章并没有讲如何实现具体的Shape效果 那么具体要怎么做呢&#xff1f;这篇文章就主要讲这块 在Fluter中实现Shape效果时&#xff0c;…

Servlet(一)

目录 1.什么是Servlet 2.servlet程序 2.1 创建项目 2.2 引入依赖 2.3 创建目录 2.4 编写代码 2.5 打包程序 2.6 部署程序 2.7 验证程序 3.更简单的部署方法 3.1 安装 3.2配置 4.访问出错怎么办 4.1 404 4.2 405 4.3 500 4.4 空白页面 4.5 无法访问此页面 5.se…

Gin web框架初步认识

Goland使用及gin框架下载引入 第一次使用Goland时需要配置GOROOT、GOPATH、Go Modules 配置完成后进入面板&#xff0c;右键选择Go Modules文件&#xff0c;或者在go工作区通过命令go mod init [name]创建go mod项目。 创建完的项目一般都有go.mod文件和go.sum&#xff0c;前者…

Mysql【安装教程】

Mysql安装教程 1.安装教程 可以去官网下载这个版本的&#xff1a;mysql-installer-community-8.0.31.0 双击点开&#xff0c;选择自定义&#xff1a; 选择主键&#xff1a;左边选择之后就点蓝色按钮添加到右边去&#xff0c;next&#xff1a; 如果出现这个页面&#xff0c…