文章目录

  • 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相关推荐

  1. UVM——sequence、sequencer、driver概述

    sequence.sequencer.driver关系 三者的关系如上图所示: - sequence产生目标数量的sequence item,并通过随机化使每一个sequence item对象的数据内 ...

  2. UVM学习笔记--sequence和sequencer

    1. UVM sequence机制的意义 UVM的sequence机制最大的作用就是将test case和testbench分离开来. 对一个项目而言,testbench是相对稳定的框架,而针对各个m ...

  3. sequence和sequencer — UVM

    文章目录 简介 1.sequence 和 item 2.sequencer 和 driver 1. 通信方式--TLM端口 2.事务传输 3. 通信时序 3.sequence和sequencer 1. ...

  4. UVM基础-Sequence、Sequencer(二)

    目录 sequence和sequencer 将sequence挂载到sequencer 将item挂载到sequencer 宏定义使用实例 sequencer仲裁特性 实例 sequencer的锁定机 ...

  5. UVM基础-Sequence、Sequencer(一)

    目录 Sequence.Sequencer.Driver大局观 Sequence和item item与sequence的关系 flat sequence hierarchical sequence s ...

  6. UVM学习笔记(四)sequence与sequencer

    目录 一.概述 1.1 类的继承 1.2 数据传送机制 二.uvm_sequence_item 2.1 功能与数据成员 2.2 示例 三.uvm_sequence 3.1 功能与分类 3.2 flat ...

  7. sequence与sequencer

    文章目录 1. sequence与sequencer 1.1 sequence和item发送实例 1.2 sequence和item方法 1.3 发送序列的uvm宏 1.4 序列宏实例 1.5 seq ...

  8. java sequencer_UVM学习笔记--sequence和sequencer(转)

    1. UVM sequence机制的意义 ======================= UVM的sequence机制最大的作用就是将test case和testbench分离开来. 对一个项目而言, ...

  9. UVM中的sequencer

    一. p_sequencer 与m_sequencer 的关系 m_sequencer是在UVM 原码中定义的, p_sequencer 需要我们在代码中进行宏定义才能使用,通过如下定义后, 可以直接 ...

  10. [UVM]UVM Sequence之Response的使用

    UVM Sequence之Response  前言:Sequence機制提供了一種Sequence -> Sequencer -> Driver的單向數據傳輸機制.但是在複雜的驗證平台中, ...

最新文章

  1. android tesseract-ocr实例教程(包含中文识别)(附源码)
  2. Spring Cache-缓存概述及使用
  3. 函数调用关系图如何画_乌鲁木齐126中一校三址关系图出炉!佳源和绿谷应该如何选择?...
  4. [NodeJs] npm提供了哪些钩子?各有什么作用?
  5. python找人_python之找最后一个人
  6. 如何计算一只鸡的表面积?
  7. c# 傅里叶变换 频域_傅里叶变换在MATLAB中的应用(频域滤波)
  8. Java游戏程序设计教程 第4章 游戏的运行机制
  9. (转)python3之模块io使用流的核心工具
  10. 先进的分销管理系统(ADMS)的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  11. 打印机状态错误怎么办 打印机状态错误具体的解决方法
  12. linux环境下如何重装系统,详细教你linux电脑系统怎么安装
  13. 微信小程序实践——实验4高校新闻网
  14. 如何编制试算平衡表_会计实务:试算平衡表的编制步骤
  15. PCI总线---深入理解PCI总线
  16. SIGCOMM13论文简要选读
  17. 微软最完善,百度最小气 看微软阿里百度三大物联网云平台对比
  18. 植入式广告热的冷思考
  19. A*算法求解15数码问题
  20. 消防法及相关法律法规(一)

热门文章

  1. 整理了46个python人工智能库,详细介绍(含资源),建议收藏
  2. 植物大战僵尸用户存档修改(单机版)
  3. 数字孪生开启传统行业数字化转型升级之路
  4. 利用wordcloud和jieba制作词云
  5. 微信商户号企业付款到零钱开通地址
  6. sqlplus执行语句报错:unknown command beginning解决方案
  7. iio Engine 1
  8. Spring启动的bean回调函数
  9. element ui 自定义icon图标
  10. 技术分享 | DNS解析不生效的原因及解决方法