0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

谈UVM之sequence/item见解 sequencer特性及应用(下)

西西 2018-02-19 10:14 次阅读

本文将接着分享sequencer的相关知识,对于sequencer的仲裁特性有几种可选,UVM_SEQ_ARB_FIFO ;UVM_SEQ_ARB_WEIGHTED;UVM_SEQ_ARB_RANDOM ;UVM_SEQ_ARB_STRICT_FIFO等。出其中三种需要特别区分外其它的模式可以满足绝大多数的仲裁需求。

sequencer的仲裁特性及应用

在之前我们就谈到了,uvm_sequencer类自建了仲裁机制用来保证多个sequence同时挂载到sequencer时,可以按照规则允许特定的sequence中的item优先通过。在实际使用中,我们可以通过uvm_sequencer::set_arbitration(UVM_SEQ_ARB_TYPE val)来设置仲裁模式。这里的仲裁模式UVM_SEQ_ARB_TYPE有下面几种值可以选择:

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的请求优先被授权。

在上面的仲裁模式中,与priority有关的模式有UVM_SEQ_ARB_WEIGHTED、UVM_SEQ_ARB_STRICT_FIFO和UVM_SEQ_ARB_STRICT_RANDOM。这三种模式的区别在于,UVM_SEQ_ARB_WEIGHTED的授权会落到各个优先级的请求上面,而UVM_SEQ_ARB_STRICT_RANDOM则只会将授权随机安排到最高优先级的请求上面,UVM_SEQ_ARB_STRICT_FIFO则不会随机授权,而是严格按照优先级以及抵达顺序来依次授权。没有特别要的要求,则用户不需要再额外自定义授权算法,因此使用UVM_SEQ_ARB_USER这一模式的情况不多见,其它的模式可以满足绝大多数的仲裁需求。

谈UVM之sequence/item见解 sequencer特性及应用(下)

鉴于sequence在传送的优先级可以影响sequencer的仲裁授权,我们有必要结合sequencer的仲裁模式选择和sequence发送的优先级参数设置给出一段例码。通过这段例码,希望读者可以掌握如何设置仲裁模式和优先级的传递。

谈UVM之sequence/item见解 sequencer特性及应用(下)

谈UVM之sequence/item见解 sequencer特性及应用(下)

谈UVM之sequence/item见解 sequencer特性及应用(下)

谈UVM之sequence/item见解 sequencer特性及应用(下)

输出结果:

谈UVM之sequence/item见解 sequencer特性及应用(下)

上面的例码中,seq1、seq2、seq3在同一时刻发起传送请求,通过`uvm_do_prio_with的宏,在发送sequence时可以传递优先级参数。由于将seq1与seq2设置为同样的高优先级,而seq3设置为较低的优先级,这样在随后的UVM_SEQ_ARB_STRICT_FIFO仲裁模式下,可以从输出结果看到,按照优先级高低和传送请求时间顺序,先将seq1和seq2中的item发送完毕,随后将seq3发送完。

除了在上面的sequence遵循仲裁机制,将自身的item发送完才结束自身的正常模式以外,在一些特殊情形下,有一些sequence需要有更高的权限取得sequencer的授权来访问driver。 例如需要响应中断的情形下,用于处理中断的sequence应该有更高的权限来获得sequencer的授权。为此,uvm_sequencer提供了两种锁定机制,分别可以通过lock()和grab()方法实现。这两种方法的区别在于:

lock()与unlock()这一对方法可以为sequence提供排外的访问权限,但前提条件是,该sequence首先需要按照sequencer的仲裁机制获得授权。而一旦sequence获得授权,则无需担心权限被收回,只有该sequence主动unlock它的sequencer主动解锁,才可以释放这一锁定的权限。lock()是一种阻塞的任务,只有获得了权限,它才会返回。

grab()与ungrab()也可以为sequence提供排外的访问权限,而且它只需要在sequencer下一次授权周期时就可以无条件地获得授权。与lock方法相比,grab方法无视同一时刻内发起传送请求的其它sequence,而唯一可以阻止它的只有已经预先获得授权的其它lock或者grab的sequence。

这里需要注意的是,由于“解铃还须系铃人”,如果sequence使用了lock()或者grab()方法,必须在sequence结束前调用unlock()或者ungrab()方法来释放权限,否则sequencer会进入死锁状态而无法继续为其余sequence授权。下面的给出一段例码,用来展示如何使用上述的方法实现锁定的sequence传送方式。

谈UVM之sequence/item见解 sequencer特性及应用(下)

谈UVM之sequence/item见解 sequencer特性及应用(下)

谈UVM之sequence/item见解 sequencer特性及应用(下)

谈UVM之sequence/item见解 sequencer特性及应用(下)

谈UVM之sequence/item见解 sequencer特性及应用(下)

输出结果:

谈UVM之sequence/item见解 sequencer特性及应用(下)

结合例码和输出结果,我们从中可以发现如下几点:

对于locks,在10ns时,它跟其它几个sequence一同向sequencer发起请求,按照仲裁模式,sequencer先后授权给seq1、seq2、seq3,最后才授权的locks。而locks在获得授权之后,就可以一直享有权限,而无需担心权限被sequencer收回。直到在locks结束前,用户需要通过unlock()方法返还权限。

对于grabs,尽管他在20ns时就发起了请求权限(实际上seq1、seq2、seq3也在同一时刻发起了权限请求),而由于权限已经被locks占用,所以它也无权收回权限。因此只有当locks在40ns结束时,grabs才可以在sequencer没有被锁定权限的状态下获得权限,而grabs获得权限是无视同一时刻发起请求的其它sequence的。同样地,在grabs结束前,也应当通过ungrab()方法释放权限,防止sequencer的死锁行为。

至此,我们就将sequence/item发送的方法和宏,以及sequence与sequencer之间的仲裁和授权请求方式为读者介绍完毕。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Sequencer
    +关注

    关注

    0

    文章

    8

    浏览量

    8176
收藏 人收藏

    评论

    相关推荐

    数字IC验证“构成uvm测试平台的主要组件”(4)连载中...

    设备之间的产品了,事物是组件的操作对象,uvm也对事物建模提供了基类进行扩展,对事物级的建模需要从uvm sequence item扩展。而产生事物对象的事物发生器
    发表于 01-22 15:33

    UVM sequence分层有哪几种方式呢

    种请求可以使用第一种分层方式,在high-layer sequence中依然使用low-layer sequencer进行驱动,同时对low-layer sequence进行更加精细
    发表于 04-11 16:37

    请问一UVM中的UVMsequences是什么意思啊

    uvm_sequencer_base类派生出来的,其 被参数化为用于与driver 通信的sequence item类型。因此要访问正在运行sequence 的真实
    发表于 04-11 16:43

    UVM sequence分层的几种体现

    种请求可以使用第一种分层方式,在high-layer sequence中依然使用low-layer sequencer进行驱动,同时对low-layer sequence进行更加精细
    发表于 04-14 11:08

    如何配置sequence的仲裁算法和优先级及中断sequence的执行

    01 Arbitrary在UVM中,多个sequence可以同时被绑定到相同的sequencer并启动。这种测试场景在实际中是存在的,比如在模拟同一个总线master口上的不同类型的数据流时,可以将
    发表于 09-23 14:35

    介绍两种交互方法来完成Sequencer和Driver的握手机制

    指定请求和响应sequence_item的具体类型,在默认情况,请求和响应sequence_item的类型为uvm_sequence_itemu
    发表于 09-23 14:39

    sequence item实际应用中应该包含哪些东西

    展开。Sequence item是游走在Sequence-Sequencer-Driver这一基本结构中的数据结构类型,在有些地方也直接叫transaction,可以说是UVM的必用品
    发表于 09-23 14:42

    UVM中seq.start()和default_sequence执行顺序

    seqr.start_phase_sequence(phase)解析  start_phase_sequence(xxx)是定义在uvm_sequencer_base类里的,具体看src/seq
    发表于 04-04 17:15

    浅谈UVMsequence/item见解(上)

    item指的是uvm_sequence_itemSequence Item具备UVM核心基类所必要的数据操作方法,对于激励的生成和场景控
    的头像 发表于 02-19 15:52 5000次阅读
    浅谈<b class='flag-5'>UVM</b><b class='flag-5'>之</b><b class='flag-5'>sequence</b>/<b class='flag-5'>item</b><b class='flag-5'>见解</b>(上)

    UVM sequence机制中response的简单使用

    sequence作为UVM几个核心机制之一,它有效地将transaction的产生从driver中剥离出来,并且通过和sequencer相互配合,成功地将driver的负担降低至仅聚焦于根据协议将
    的头像 发表于 09-22 09:26 2338次阅读

    start()如何执行uvm_sequence

    要使用start()启动一个sequence,就必须要指定相应的sequencer句柄, **另外的几个选项一般用不上** 。其中
    的头像 发表于 03-21 11:37 688次阅读
    start()如何执行<b class='flag-5'>uvm_sequence</b>

    UVMsequence的那些事儿

    将 生成测试case的语句 从 main_phase 中独立出来,使得使用不同测试用例时,只需要修改sequence部分即可,而不用关注 UVM剩余部分。
    的头像 发表于 05-26 15:17 1014次阅读
    <b class='flag-5'>UVM</b>中<b class='flag-5'>sequence</b>的那些事儿

    UVM driver和sequencer的通信

    sequencer生成激励数据,并将其传递给driver执行。UVM类库提供了uvm_sequencer基类,其参数为request和response数据类型。
    的头像 发表于 06-07 11:58 1597次阅读
    <b class='flag-5'>UVM</b> driver和<b class='flag-5'>sequencer</b>的通信

    Sequencer上启动一个Sequence

    Sequencer默认不执行任何Sequence。验证工程师可以通过调用start()启动一个Sequence,也可以通过uvm_config_db指定一个自动启动的
    的头像 发表于 06-10 09:10 774次阅读
    在<b class='flag-5'>Sequencer</b>上启动一个<b class='flag-5'>Sequence</b>

    UVM设计中的sequence启动方式有哪几种呢?

    本篇介绍UVM中的sequence,这是UVM中最基础的部分。对于前面介绍的uvm_callback, uvm_visitor等,很少被使用
    的头像 发表于 08-17 10:07 3925次阅读
    <b class='flag-5'>UVM</b>设计中的<b class='flag-5'>sequence</b>启动方式有哪几种呢?