UVM-sequence和sequencer
文章目录
- 1.sequence挂载sequencer
- 2. sequencer 仲裁特性
1.sequence挂载sequencer
item对象的生命周期:开始于sequence的body()方法,经历了随机化并穿越sequencer最终到达driver,直到被driver消化后,它的生命一般才结束
class flat_seq extends uvm_sequence;
...
task body();uvm_sequence_item tmp;bus_trans req, rsp;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);void'($cast(rsp, tmp));
endtask
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);endfunctiontask run_phase(uvm_phase phase);flat_seq seq;phase.raise_objection(phase);seq = new();seq.start(e.sqr);phase.drop_objection(phase);endtask
endclass
在这段例码中,主要使用两种方法:
1.针对将item挂载到sequence上的应用:
uvm_sequence::start_item(uvm_sequence_item item, int set_priority = -1, uvm_sequencer_base aequencer = null)
//应用
start_item(req)
- 第一个参数:item对象
- 第二个参数:优先级
- 第三个参数:指定item和其parent sequence挂载到sequencer是否是一个,默认相同
uvm_sequence::finish_item(uvm_sequence_item, int set_priority = -1)
//应用
finish_item(req)
- 第一个参数:item对象
- 第二个参数:优先级
2.针对将sequence挂载到sequencer上的应用:
uvm_sequence::start(uvm_sequencer_base sequencer, uvm_sequencer_base parent_sequence = null, int this_priority = -1, bit call_pre_post = 1)
//应用
seq.start(e.sqr)
- 第一个参数:sequencer的句柄
- 第二个参数:上层sequence
- 第三个参数:优先级
- 第四个参数:建议使用默认值指定pre_body()和post_body()执行次序
通过uvm_sequence::start()
来挂载root sequence
,而在内部的child sequence
则可以通过宏``uvm_do`来实现
2. sequencer 仲裁特性
class lock_seq extends uvm_sequence;...task body();bus_trans req;#10ns;m_sequence.lock(this);repeat(3) #10ns `uvm_do_with(req, {data inside {[100:100]};})m_sequence.unlock(this);endtask
endclass
class grap_seq extends uvm_sequence;...task body();bus_trans req;#10ns;m_sequence.grap(this);repeat(3) #10ns `uvm_do_with(req, {data inside {[200:200]};})m_sequence.ungrap(this);endtask
endclass
class top_seq extends uvm_sequence;...task body();child_seq seq1, seq2, seq3;lock_seq locks;grab_seq grabs;m_sequencer.set_arbitration(UVM_SEQ_ARB_STRICT_FIFO);fork`uvm_do_pri_with(seq1, 500, {base == 10;})`uvm_do_pri_with(seq2, 500, {base == 20;})`uvm_do_pri_with(seq3, 300, {base == 30;})`uvm_do_pri(locks, 300)`uvm_do(grabs)joinendtask
endclass
uvm_sequence 自定义变量m_sequence
设置仲裁模式:
uvm_sequencer::set_arbitration(UVM_SEQ_ARB_TYPE val)
- UVM_SEQ_ARB_FIFO: 默认模式。来自sequences的发送请求,按照FIFO先进先出的方式被依次授权和优先级没有关系
- UVM_SEQ_ARB_WEIGHTED: 不同sequence的发送请求,将按照它们的优先级权重随机授权
- UVM_SEQ_ARB_RANDOM: 不同的请求会被随机授权,而无视它们的抵达顺序和优先级
- UVM_SEQ_ARB_STRICT_FIFO: 不同的请求会按照它们的优先级以及抵达顺序来依次授权,因此与优先级和抵达时间都有关
- UVM_SEQ_ARB_STRICT_RANDOM: 不同的请求,会按照它们的最高优先级随机授权,与抵达时间无关
- UVM_SEQ_ARB_USER: 用户可以自定义仲裁方法user_priority_arbitration()来裁定哪个sequence的请求被优先授权
锁定机制:lock()和grab()区别
- lock():
当sequencer按照仲裁机制授权给该sequence,一旦该sequence拿到授权,就不会将授权返回。只有当sequence执行 **unlock()** 时,才会释放这一锁定的权限
- grab():
grab()操作比lock()操作优先级要高,grab请求被放入sequencer仲裁队列的最前面,它几乎是一发出就拥有了sequencer的所有权,当已经有其它sequence获得授权时,grab()就无法获得授权
注意:
如果sequence使用了lock()
或者grab()
方法,必须在sequence结束前调用unlock()
或者ungrab()
方法来释放权限,否则sequencer会进入死锁状态而无法继续为其余sequence授权
。
UVM-sequence和sequencer相关推荐
- UVM——sequence、sequencer、driver概述
sequence.sequencer.driver关系 三者的关系如上图所示: - sequence产生目标数量的sequence item,并通过随机化使每一个sequence item对象的数据内 ...
- UVM学习笔记--sequence和sequencer
1. UVM sequence机制的意义 UVM的sequence机制最大的作用就是将test case和testbench分离开来. 对一个项目而言,testbench是相对稳定的框架,而针对各个m ...
- sequence和sequencer — UVM
文章目录 简介 1.sequence 和 item 2.sequencer 和 driver 1. 通信方式--TLM端口 2.事务传输 3. 通信时序 3.sequence和sequencer 1. ...
- UVM基础-Sequence、Sequencer(二)
目录 sequence和sequencer 将sequence挂载到sequencer 将item挂载到sequencer 宏定义使用实例 sequencer仲裁特性 实例 sequencer的锁定机 ...
- UVM基础-Sequence、Sequencer(一)
目录 Sequence.Sequencer.Driver大局观 Sequence和item item与sequence的关系 flat sequence hierarchical sequence s ...
- UVM学习笔记(四)sequence与sequencer
目录 一.概述 1.1 类的继承 1.2 数据传送机制 二.uvm_sequence_item 2.1 功能与数据成员 2.2 示例 三.uvm_sequence 3.1 功能与分类 3.2 flat ...
- sequence与sequencer
文章目录 1. sequence与sequencer 1.1 sequence和item发送实例 1.2 sequence和item方法 1.3 发送序列的uvm宏 1.4 序列宏实例 1.5 seq ...
- java sequencer_UVM学习笔记--sequence和sequencer(转)
1. UVM sequence机制的意义 ======================= UVM的sequence机制最大的作用就是将test case和testbench分离开来. 对一个项目而言, ...
- UVM中的sequencer
一. p_sequencer 与m_sequencer 的关系 m_sequencer是在UVM 原码中定义的, p_sequencer 需要我们在代码中进行宏定义才能使用,通过如下定义后, 可以直接 ...
- [UVM]UVM Sequence之Response的使用
UVM Sequence之Response 前言:Sequence機制提供了一種Sequence -> Sequencer -> Driver的單向數據傳輸機制.但是在複雜的驗證平台中, ...
最新文章
- android tesseract-ocr实例教程(包含中文识别)(附源码)
- Spring Cache-缓存概述及使用
- 函数调用关系图如何画_乌鲁木齐126中一校三址关系图出炉!佳源和绿谷应该如何选择?...
- [NodeJs] npm提供了哪些钩子?各有什么作用?
- python找人_python之找最后一个人
- 如何计算一只鸡的表面积?
- c# 傅里叶变换 频域_傅里叶变换在MATLAB中的应用(频域滤波)
- Java游戏程序设计教程 第4章 游戏的运行机制
- (转)python3之模块io使用流的核心工具
- 先进的分销管理系统(ADMS)的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
- 打印机状态错误怎么办 打印机状态错误具体的解决方法
- linux环境下如何重装系统,详细教你linux电脑系统怎么安装
- 微信小程序实践——实验4高校新闻网
- 如何编制试算平衡表_会计实务:试算平衡表的编制步骤
- PCI总线---深入理解PCI总线
- SIGCOMM13论文简要选读
- 微软最完善,百度最小气 看微软阿里百度三大物联网云平台对比
- 植入式广告热的冷思考
- A*算法求解15数码问题
- 消防法及相关法律法规(一)