Sequence和Item

news2024/10/5 13:52:58

一、概述

  • sequence指的是uvm_sequence类,而item指的是uvm_sequence_item类。
  • 对于激励生成场景控制,是由sequence来编织的,而对于激励所需要的具体数据控制要求,则是从item的成员数据得到的。

二、Sequence Item介绍

item是基于uvm_object类,这表明了它具备UVM核心基类所必要的数据操作方法,例如copy()clone()compare()record()item根据数据成员的类型,将划分为:

  • 控制类。例如总线协议上的读写类型、数据长度、传送模式等。
  • 负载类。一般指的是数据总线上的数据包。
  • 配置类。用来控制driver的驱动行为,例如命令driver的发送间隔或者有无错误插入。
  • 调试类。用来标记一些额外信息方便调试,例如该对象的实例序号、创建时间、被driver解析的时间始末等。

三、Sequence Item示例

class bus_trans extends uvm_sequence_item;  //定义一个transaction
	rand bit write;
	rand int data;
	rand int addr;
	rand int delay;
	static int id_num;
	`uvm_object_utils_begin(bus_trans)
		`uvm_field_int ...
	`uvm_object_utils_end
	...
endclass

class test1 extends uvm_test;
	`uvm_component_utils(test1)
	...
	
	task run_phase(uvm_phase phase);
		bus_trans t1, t2;
		phase.raise_objection(phase);
		# 100ns;
		t1 = new("t1");
		t1.print();
		#200ns;
		t2 = new("t2");
		void'(t2.randomize());
		t2.print();
		phase.drop_objection(phase);
	endtask
endclass

输出结果:

 item使用时的特点:

  • 如果数据域属于需要用来做驱动,那么应考虑定义为rand类型,同时按照驱动协议给出合适的constraint
  • 由于item本身的数据属性,为了充分利用UVM域声明的特性,将必要的数据成员都通过'uvm_field_XXX来声明,方便使用基本数据方法自动实现。
  • t1没有被随机化而t2被随机化了,这种差别在item通往sequencer之前是很明显的。UVM要求item的创建和随机化都应该发生在sequencebody()任务中,而不是在sequencer或者driver中。
  • 按照item对象的生命周期来区分,它的生命应该开始于sequencebody()方法,而后经历了随机化并穿越sequencer最终到达driver,直到被driver消化之后,它的生命一般来讲才会结束。

四、Item和Sequence的关系

一个sequence可以包含一些有序组织起来的item实例,考虑到item在创建后需要被随机化,sequence在声明时也需要预留一些可供外部随机化的变量,这些随机变量一部分是用来通过层次传递约束来最终控制item对象的随机变量,一部分是用来对item对象之间加以组织和时序控制的。

为了区分几种常见的sequence定义方式,将其分类为:

  • 扁平类。这一类往往只用来组织更细小的粒度,即item实例构成的组织。
  • 层次类。这一类是由更高层的sequence用来组织底层的sequence,进而让这些sequence按照顺序方法,或者按照并行方式,挂载到同一个sequencer上 。
  • 虚拟类。这一类则是最终控制整个测试场景的方式,鉴于整个环境中往往存在不同种类的sequencer和其对应的sequence,因此需要一个虚拟的sequence来协调顶层的测试场景。之所以称这个方式为虚拟类,是因为该序列本身并不会固定挂载于某一种sequencer类型上,而是将其内部不同类型sequence最终挂载到不同的目标sequencer上。
     

五、扁平类

一个flat sequence往往是由细小的sequence item群落构成,在此之上sequence还有更多的信息来完备它需要实现的激励场景。

一般对于flat sequence而言,它包含的信息:

  • sequence item以及相关的constraint用来关联生成的item之间的关系,从而完善出一个flat sequence的时序形态。
  • 除了限制sequence item的内容,各个item之间的时序信息也需要由flat sequence给定,例如何时生成下一个item并且发送至driver
  • 对于需要driver握手的情况(例如读操作),或者等待monitor事件从而做出反应(例如slavememory response数据响应操作),都需要sequence在收到另外一侧组件的状态后,再决定下一步操作,即响应具体事件从而创建对应的item并且发送出去。

flat sequence示例1

 class flat_seq extends uvm_sequence;
	rand int length;
	rand int addr;
	rand int data[];
	rand bit write;
	rand int delay;
	constraint cstr{
		data.size() == length;
		foreach(data[i])  soft data[i] == i;
		soft addr == 'h100;
		soft write == 1;
		delay inside {[1:5]};
	};
	`uvm_object_utils(flat_seq)
	...                     //省略掉了new函数
	
	task body();            //sequence主要要做的事情就是body,一旦将sequence挂在到sequencer上面,接下来要做的事情就是body
		bus_trans tmp;      //声明句柄
		foreach(data[i]) begin
			tmp = new();    //例化了很多对象,并对每一个对象就行随机
			tmp.randomize() with {
				data == local::data[i];
				addr == local::addr + i << 2;
				write == local::write;
				delay == local::delay;
			};
			tmp.print();
		end
	endtask
endclass

class test1 extends uvm_test;
	`uvm_component_utils(test1)
	...
	
	task run_phase(uvm_phase phase);	
		flat_seq seq;
		phase.raise_objection(phase);
		seq = new();
		seq.randomize() with {addr == 'h200; length == 100};
		seq.body();
		phase.drop_objection(phase);
	endtask
endclass

输出结果:

 

flat sequence示例2

class bus_trans extends uvm_sequence_item;   //下沉
	rand bit write;
	rand int data[];	//颗粒度变大,可以传输更多的数据
	rand int length;
	rand int addr;
	rand int delay;
	static int id_num;
	constraint cstr{
		data.size() == length;
		foreach(data[i])  soft data[i] == i;
		soft addr == 'h100;
		soft write == 1;
		delay inside {[1:5]};
	};
	`uvm_object_utils_begin(bus_trans)
		`uvm_field_int ...
	`uvm_object_utils_end
	...
endclass

class flat_seq extends uvm_sequence;
	rand int addr;
	rand int length;
	`uvm_object_utils(flat_seq)
	...
	
	task body();
		bus_trans tmp;
		tmp.new();
		tmp.randomize() with {length == local::length;
							  addr == local::addr;};
		tmp.print();
	endtask
endclass

class test1 extends uvm_test;
	`uvm_component_utils(test1)
	...
	
	task run_phase(uvm_phase phase);	
		flat_seq seq;
		phase.raise_objection(phase);
		seq = new();
		seq.randomize() with {addr == 'h200; length == 3};
		seq.body();
		phase.drop_objection(phase);
	endtask
endclass

输出结果:

 这个示例将一段完整发生在数据传输中的、更长的数据都“收编”在一个bug_trans类中,提高这个item粒度的抽象层次,使得item更成熟、更适合切割。这样flat sequence更倾向于控制,不用去关注数据内容,而只关注这个数据包的长度地址等信息即可,扩充随机数据的责任一般由item负责。
 

六、层次类

  • hierarchical sequence区别于flat sequence的地方在于,它可以使用其他sequence,还有item,这么做是为了创建更丰富的激励场景。
  • 通过层次嵌套关系,可以让hierarchical sequence使用其它hierarchical sequenceflat sequencesequence item,这也就意味着,如果底层的sequence itemflat sequence的粒度得当,那么就可以充分复用这些flat sequencesequence来构成形式更多样的hierarchical sequence

hierarchical sequence示例

class hier_seq extends uvm_sequence;
	`uvm_object_utils(hier_seq)
	function new(string name = "hier_seq");
		super.new(name);
	endfunction
	task body();
		bus_trans t1, t2;
		flat_seq s1, s2;
		`uvm_do_with(t1, {length == 2;})   //宏的作用:1、创建 2、随机 3、传送到sequencer
		fork
			`uvm_do_with(s1, {length == 5;})
			`uvm_do_with(s2, {length == 8;})
		join
		`uvm_do_with(t2, {length == 3;})
	endtask
endclass

 

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

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

相关文章

【前端设计】SDC中生成时钟create_generated_clock语法解析

我们的目标是┏ (゜ω゜)=☞芯片前端全栈工程师~喵! 前言 好久没有写前端设计系列的博客了,这次因为要在系统里加入时钟分频器因此复习一下sdc中关于生成时钟的约束语法,以下内容来自《综合与时序分析的设计约束》和一些自己的理解。 生成时钟 在sdc约束中,由端口输入的…

JavaScript -- 07. 面向对象编程

文章目录面向对象编程1 面向对象编程介绍2 类3 属性4 方法5 构造函数6 封装7 多态8 继承9 对象的内存结构10 原型10.1 原型链10.2 原型的作用&#xff1a;11 修改原型12 instanceof和hasOwn12.1 instanceof12.2 in12.3 hasOwnProperty12.4 hasOwn13 旧类14 new运算符面向对象编…

用上了mac才知道的一些事,献给Mac新手

以前电脑用windows&#xff0c;工作后刚用上mac&#xff0c;发现很多使用逻辑挺让人感觉新奇&#xff0c;甚至摸不着头脑,下面一一列举&#xff0c;帮助想要入手Mac的新手&#xff01; 1、鼠标滚轮的逻辑和Windows相反。 Mac上滚动鼠标控制页面上下滚动的逻辑和Windows刚好相…

使用 Learner Lab - 使用 S3 静态网页上传图片,搭配 API Gateway 与 Lambda

使用 Learner Lab - 使用 S3 静态网页上传图片&#xff0c;搭配 API Gateway 与 Lambda AWS Academy Learner Lab 是提供一个帐号让学生可以自行使用 AWS 的服务&#xff0c;让学生可以在 100 USD的金额下&#xff0c;自行练习所要使用的 AWS 服务&#xff0c;如何进入 Learne…

分割研究~~总结

搬来了基于实例分割的最新进展和发展历程&#xff0c;首先介绍了实例分割的基本逻辑,总结了目前主要研究方法及其原理和网络架构&#xff0c;对已发表的主流实例分割方法进行分析&#xff0c;最后对实例分割任务目前面临 的问题以及未来的发展趋势做出了分析,并针对所面临的问题…

磨金石教育插画干货分享|日本插画为什么独树一帜,那么受欢迎

插画的起源很早&#xff0c;在人类诞生文明的初级阶段&#xff0c;就有了岩画与壁画。在古典文明时代&#xff0c;中国印刷行业有了较大的发展&#xff0c;与之伴随的就是插画的长足发展。中国文化对日本起到了极大的影响。 在插画领域也是如此&#xff0c;客观的说&#xff0c…

CCF走进高校

CCF走进高校&#xff08;山东大学-人机专委&#xff09; 陶建华 人工智能与智能交互 人工智能的能力体系 感知智能&#xff1a;发展较快&#xff0c;人机交互场景运用较多&#xff1b; 认知智能&#xff1a;发展相对不成熟。 此外&#xff0c;专用智能领域发展较快&#xff0…

shell编程(一)

shell 简介 Shell 是一个用 C 语言编写的程序,一般我们说的shell编程&#xff0c;是指编写shell脚本。 Shell 负责完成用户与内核之间的交互&#xff08;shell是一个命令解释器&#xff0c;负责将用户的命令解析成操作系 统所能理解的指令&#xff09; 第一个shell脚本 创建…

Vue刷新后页面数据丢失问题的解决过程

在做vue项目的过程中有时候会遇到一个问题,就是进行F5页面刷新的时候,页面的数据会丢失,这篇文章主要给大家介绍了关于Vue刷新后页面数据丢失问题的解决过程,需要的朋友可以参考下&#xff01; 一、为什么刷新后数据会丢失 vuex存储的数据只是在页面中&#xff0c;相当于全局变…

[附源码]计算机毕业设计学习帮扶网站设计与实现Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Linux文件系统调用接口文件描述符的理解

&#x1f9f8;&#x1f9f8;&#x1f9f8;各位大佬大家好&#xff0c;我是猪皮兄弟&#x1f9f8;&#x1f9f8;&#x1f9f8; 文章目录一、对系统调用进行封装的理由二、文件的系统调用接口① openopen的选项--位图open的权限程序中设置umask权限掩码②close③write④read三、…

字节输入流【InputStream】(读文件)

字节输入流【InputStream】 java.io.InputStream 抽象类是表示字节输入流的所有类的超类&#xff0c;可以读取字节信息到内存中。它定义了字节输入流的基本共性功能方法。 public void close(): 关闭此输入流并释放与此流相关联的任何系统资源。 public abstract int read(): …

Telegraf

Telegraf是什么&#xff1f; Telegraf 是 InfluxData 公司开源的一款十分流行的指标采集软件&#xff0c;可以从数据库、系统和物联网传感器收集和发送度量和事件&#xff0c;它用Go编写&#xff0c;编译成一个没有外部依赖的二进制文件–需要非常少的内存&#xff0c;相…

数仓建模理论(一)

学习目录一、关系建模与维度建模二、维度表和事实表&#xff08;重点&#xff09;三、事实表类型四、维度模型分类一、关系建模与维度建模 &#xff08;1&#xff09;关系建模 关系建模将复杂的数据抽象为两个概念——实体和关系&#xff0c;并使用规范化的方式表示出来。关系…

【计算机毕业设计】73.房屋租赁系统求租合同源码

一、系统截图&#xff08;需要演示视频可以私聊&#xff09; 摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;房屋租赁系统当然也不能排除在外。房屋租赁系统是以实际…

Mybatis源码解析(八):插件机制

Mybatis源码系列文章 手写源码&#xff08;了解源码整体流程及重要组件&#xff09; Mybatis源码解析(一)&#xff1a;环境搭建 Mybatis源码解析(二)&#xff1a;全局配置文件的解析 Mybatis源码解析(三)&#xff1a;映射配置文件的解析 Mybatis源码解析(四)&#xff1a;s…

flex布局列表页(一行内容比较多,长度比较长)

一、Flex 布局是什么&#xff1f; Flex 是 Flexible Box 的缩写&#xff0c;意为"弹性布局"&#xff0c;用来为盒状模型提供最大的灵活性。任何一个容器都可以指定为 Flex 布局。 二、基本概念 采用 Flex 布局的元素&#xff0c;称为 Flex 容器&#xff08;flex co…

Java开发必须掌握的运维知识 (九)-- Docker容器监控信息可视化仪表:Grafana

一、Grafana 是用来干什么的&#xff1f; Grafana 是一个监控仪表系统&#xff0c;它是由 Grafana Labs 公司开源的的一个系统监测 (System Monitoring) 工具。它可以大大帮助你简化监控的复杂度&#xff0c;你只需要提供你需要监控的数据&#xff0c;它就可以帮你生成各种可视…

jdk11新特性——JShell交互性工具

目录一、jshell概述二、jshell位置三、jshell示例3.1、示例一&#xff08;声明变量并赋值&#xff09;3.2、示例二&#xff08;输出打印内容&#xff09;3.3、示例三&#xff08;帮助命令&#xff09;一、jshell概述 java9引入了jshell这个交互性工具&#xff0c;让Java也可以…

BUUCTF Misc 黑客帝国 [MRCTF2020]你能看懂音符吗 [HBNIS2018]caesar [HBNIS2018]低个头

黑客帝国 下载文件 一长串16进制&#xff0c;复制到在线16进制转文本 很明显是一个RAR文件&#xff0c;使用脚本将16进制转换成文件 import binasciihex_data这里填十六进制数据 outopen(res.rar,wb) out.write(binascii.unhexlify(hex_data)) out.close() 需要密码&#xff…