(18)UVM sequencer和sequence
UVM sequencer和sequence
文章目录
- UVM sequencer和sequence
- 一、概述
- 二、sequence和item发送实例
- 三、发送sequence/item方法建议
- 四、发送sequence/item方法解析
- 关注作者
一、概述
- 了解了sequencer与driver之间传递sequence item的握手过程,同时也掌握了sequence与item之间的关系。
- 接下来需要就sequence挂载到sequencer的常用方法做出总结,大家可以通过对这些常用方法和宏的介绍,了解到它们不同的使用场景。
- 面对多个sequence如果需要同时挂载到sequencer时,那就面临着仲裁的需要,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...
endclassclass 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));strat_item(req);req.randomize with{data==10;};finish_item(req);endtask
endclassclass top_sequence extends uvm_sequence;`uvm_object_utils(top_sequence)...task body();uvm_sequence_item tmp;bus_trans req;child_seq cseq;cseq=child_seq::type_id::create("cseq");tmp=create_item(bus_trans::get_type,m_sequencer,"req");cseq.start(m_sequencer,this);void'($cast(req,tmp));strat_item(req);req.randomize with{data==10;};finish_item(req);endtask
endclass
挂载sequence和item的过程是不一样的
指明挂载的sequence的父类,它们的优先级是一样的
。比如说,top_sequence的优先级是100,如果child_sequence没有指明父类,那它是默认的优先级
,如果我告诉了它的parent sequence,那么它们整个链条上面产生的所有item,sequence优先级都跟顶层top优先级一致。
class sequencer extends uvm_sequencer;`uvm_component_utils(sequencer)...
endclassclass driver extends uvm_driver;`uvm_component_utils(driver)...task run_phase(uvm_phase phase);REQ tmp;bus_trans req;forever beginseq_item_port.get_next_item(tmp);void'($cast(req,tmp));seq_item_port.item_done();endendtask
endclassclass 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);endfunctionfunction void connect_phase(uvm_phase phase);drv.seq_item_port.connect(sqr.seq_item_export);endfunction
endclassclass test1 extends uvm_test;env e;`uvm_component_utils(test1)...function void build_phase(uvm_phase phase);e=env::type_id::create("e",this);endfunctiontask run_phase(uvm_phase phase);top_seq seq;phase.raise_objection(phase);seq=new();seq.start(e.sqr);phase.drop_objection(phase);endtask
endclass
三、发送sequence/item方法建议
在上述例码中,主要使用了两种方法。
第一个方法是针对将sequence挂载到sequencer上的应用。
- uvm_sequence::start(uvm_sequencer_base sequencer,uvm_sequence_base parent_sequence=null,int this priority=-1,bit call_pre_post=1)
- 在使用该方法的过程中,用户首先应该指明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进行例化。
第二个方法是针对将item挂载到sequencer上的应用。
- uvm_sequencer::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。拆解步骤如下:
1.创建item
2.通过start_item()方法等待获得sequencer的授权许可,其后执行parent sequence的方法pre_do()。
3.对item进行随机化处理。
4.通过finish_item()方法在对item进行了随机化处理之后,执行parent sequence的mid_do(),以及调用uvm_sequencer::send_request()和uvm_sequencer::wait_for_item_done()来将item发送至sequencer再完成与driver之间的握手。最后,执行了parent_sequence的post_do()。
这些完整的细节有两个部分需要注意。
- 第一,sequence和item自身的优先级,可以决定什么时刻可以获得sequencer的授权。
- 第二,读者需要注意到,parent sequence的虚方法pre_do()、mid_do()和post_do()会发生在发送item的过程中间。
如果对比start()方法和start_item()/finish_item(),读者首先要分清它们面向的挂载对象是不同的。
在执行start()过程中,默认情况下会执行sequence的pre_body()和post_body(),但是如果start()的参数call_pre_post=0,那么就不会这样执行,所以在一些场景中,UVM用户会奇怪为什么pre_body()和post_body()没有被执行。
pre_body()和post_body()并不是一定会被执行的
,这一点同UVM的phase顺序执行是有区别的。
下面一段代码是对start()
方法执行过程的自然代码描述,可以看出它们执行的顺序关系和条件:
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) YPUR 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()而言,子一级的sequence/item在被发送过程中会间接调用parent sequence的pre_do()等方法。
- 只要在参数传递过程中,确保子一级sequence/item与parent sequence的联系,那么这些执行过程是会按照上面的描述依次执行的。
不建议使用pre_do、mid_do、post_do,也不建议使用pre_body和post_body
下面是start_item()/finish_item()
的自然代码描述,来表示执行发送item时的相关方法执行顺序:
sequencer.wait_for_grant(prior) (task)
parent_seq.pre_do(1) (task)
parent_seq.mid_do(item) (func)
sequencer.send_request(item) (func)
sequencer.wait_for_item_done() (task)
parent_seq.post_do(item) (func)
解析:
- 上述代码前两条属于start_item
- 后四条属于finish_item
关注作者
- 自述
作者是一位中科大数字设计专业的研究生,水平有限,如有错误,请大家指正,想要与大家一同进步。 - 经历
曾获得国家奖学金,“高教社杯”数学建模国家二等奖等 - 陆续更新:
1.与UVM验证相关的system verilog后续内容;
2.与verilog数字设计相关的一些基础模块设计,例如FIFO,UART,I2C等的书写。
3.保研与竞赛经历等 - 微信公众号
欢迎大家关注公众号“数字IC小白的日常修炼”,期待与大家一同仗剑遨游数字IC世界。
(18)UVM sequencer和sequence相关推荐
- UVM学习笔记--sequence和sequencer
1. UVM sequence机制的意义 UVM的sequence机制最大的作用就是将test case和testbench分离开来. 对一个项目而言,testbench是相对稳定的框架,而针对各个m ...
- UVM入门与进阶学习笔记16——sequencer和sequence(2)
目录 sequence的层次化 Hierarchical Sequence Virtual Sequence Layering Sequence sequence的层次化 就水平复用而言,在MCDF各 ...
- (17)UVM sequencer和driver
UVM sequencer和driver 文章目录 UVM sequencer和driver 一.概述 二.端口和方法 三.事务传输实例 四.事务传输过程分析 五.通信时序 六.握手建议 关注作者 一 ...
- (8)UVM Sequencer和Driver
UVM Sequencer和Driver 概述 端口和方法 实例 通信时序 握手建议 概述 driver同sequencer之间的TLM通信采取了get模式,即由driver发起请求,从sequenc ...
- UVM知识点总结-sequence
sequence及相关组件 基本的点 (1)uvm_sequence_item可以在uvm_sequece的任何阶段进行创建(2)sequence一旦活动起来就必须挂载在一个sequencer,通过这 ...
- UVM——Sequencer Driver
driver和sequencer之间的通信方式采取get模式,即由driver发起请求,从sequencer一端获得item,再由sequencer将其传递至drive.driver只要可以从sequ ...
- UVM中的sequence
sequence基础 1. 如果将激励放在driver的main_phase中,是可行的,但是如果要对激励作修改,那么扩展性较差,所以我们将激励改为放在sequence中去写. driver就负责驱动 ...
- Sequencer和Sequence
一.sequence和item发送实例 class bus_trans extends uvm_sequence_item;rand int data;`uvm_object_utils_begin( ...
- 关于UVM中的Sequence(一)
1.sequence存在的意义 sequence机制的目的是为了将激励的产生功能从driver中剥离出来.这样在不同的测试用例中,就可以将不同的sequence设置成sequencer的main_ph ...
最新文章
- 设计模式10——flyweight模式
- CWNA考试常见RF术语
- Python中常见的数据类型小结
- 系统优化怎么做-新系统上线前做什么
- 关于.NET中的Server push技术
- mysql originator_MySQL数据库事件调度(Event)
- JulyNovel-React
- Spring properties定义bean
- MySQL高级知识(四)——Explain
- Producer Consumer
- IBM加入OpenOffice 贡献Lotus Notes程序代码
- 原生Servlet 上传文件
- svn服务端安装、迁移教程、Eclipse切换svn连接库
- 完整JAVAweb项目源码,打字游戏,用jdbc在mysql保存游戏数据,完整项目源码和数据库
- 推荐3个免费开源的加密软件,知乎高赞
- 计算机端最好用的词典——GoldenDict
- 国产GP232RL 串口芯片完美兼容FT232RL 引脚开发资料
- 【Unity3d】U3d灯光
- Linux第7章Gdk及Cairo基础,GNOME 平台的2D图形编程(GTK,GDK,Cairo...) 简介 [转]...
- 老说程序员如何看产品经理,今天说说产品经理讨厌哪些程序员