sequencer是什么意思_centralism

sequencer是什么意思_centralismsequencer产生transaction,而driver负责接收transaction。classmy_driverextendsuvm_driver#(my_transaction);

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

sequencer产生transaction,而driver负责接收transaction。

class  my_driver   extends   uvm_driver #(my_transaction);

这样定义的好处是可以直接使用uvm_driver中的某些预先定义好的成员变量,例如uvm_driver中有成员变量req,它的类型是传递给uvm_driver的参数,即my_transaction。

task  my_driver::main_phase(uvm_phase phase);

     phase.raise_objection(this);

 

     phase.drop_objection(this);

endtask

每个sequence都应该派生自uvm_sequence,并且在定义时指定要产生的transaction类型。

每一个sequence都有一个body任务,当一个sequence启动之后,会自动执行body中的代码。

在下面代码中,用到了一个宏uvm_do。这个宏是UVM最常用的宏之一,它用于

1、创建一个my_transaction的实例m_trans;

2、将其随机化;

3、最终将其送给sequencer.

如果不使用uvm_do宏,也可以直接使用start_item和finish_item的方式产生transaction。

class my_sequence extends  uvm_sequence #(my_transaction);

    my_transaction  m_trans;

    function  new(string name=”my_sequence”);

         super.new(name);

    endfunction

     virtual  task body();

          repeat(10) begin

                 `uvm_do(m_trans)

          end

           #1000;

     endtask

     `uvm_object_utils(my_sequence)

endclass

       一个sequence在向sequencer发送transaction前,要先向sequence发送一个请求,sequencer把这个请求放在一个仲裁队列中。

作为sequencer,它需要做两件事情:第一,检测仲裁队列里是否有某个sequence发送transaction的请求;第二,检测driver是否申请transaction。

1、如果仲裁队列里有发送请求,但是driver没有申请transaction,那么sequencer将会一直处于等待状态,直到driver申请新的transaction。

     此时,sequencer同意sequence的发送请求,sequence在得到sequencer的批准后,产生一个transaction并交给sequencer,后者把这个transaction交给driver。

2、如果仲裁队列里没有发送请求,但是driver向sequence申请新的transaction,那么sequencer将会处于等待sequence的状态,一直到有sequence递交发送请求,sequencer马上同意这个请求,

     sequence产生transaction并交给sequencer,最终driver获得这个transaction。

3、如果仲裁队列里有发送请求,同时driver也在向sequencer申请新的transaction,那么将会同意发送请求,sequence产生transaction并交给sequencer,最终driver获得这个transaction。

      driver如何向sequencer申请transaction呢?

      在uvm_driver中有成员变量seq_item_port,而在uvm_sequencer中有成员变量seq_item_export,这两者之间可以建立一个通道。通道中传递的transaction类型就是定义my_sequenr和my_driver

时指定的transaction类型。

      当然,这里并不需要显示的指定“通道”类型,UVM已经做好了。在my_agent中,使用connect函数把两者联系在一起。

      function void my_agent::connect_phase(uvm_phase phase);

             super.connect_phase(phase);

              if(is_active==UVM_ACTIVE)begin

                     drv.seq_item_port.connect(sqr.seq_item_export);

              end

      endfunction

    

       当把两者连接好之后,就可以在driver中通过get_next_item任务向sequencer申请新的transaction。

     task my_driver::main_phase(uvm_phase phase);

            ……

             while(1)begin

                 seq_item_port.get_next_item(req);

                 drive_one_pkt(req);

                 seq_item_port.item_done();

             end

     endtask

      在如上代码中,一个最显著的特征是使用了while(1)循环,因为driver只负责驱动transaction,而不负责产生,只要有transaction就驱动,所以必须做成一个无限循环的形式。

这与monitor、refmodel和scoreboard情况非常类似。

      通过get_next_item任务来得到一个新的req,并且驱动它,驱动完成后调用item_done通知sequencer。这里为什么会有一个item_done?

      当driver使用get_next_item得到一个transaction时,sequencer自己也保留一份刚刚发送出的transaction。当出现sequencer发出了transaction,而driver没有得到的情况时,sequencer会把保留的这份transaction再发送出去。

那么sequencer如何知道driver是否已经成功得到transaction呢?如果在下次调用get_next_item前,item_done被调用,那么sequence就认为driver已经得到了这个transaction,将会把这个transaction删除。换言之,这是一种握手机制。

      在sequence中,向sequencer发送transaction使用的是uvm_do宏。这个宏什么时候会返回呢?

       uvm_do宏产生了一个transaction并交给sequencer,driver取走这个transaction后,uvm_do并不会立刻返回执行下一次uvm_do宏,而是等待在那里,直到driver返回item_done信号。此时,uvm_do宏才算是执行完毕,返回后开始下一个uvm_do。

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/166826.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 利用python建立股票量化交易系统(一)——小市值选股票模型[通俗易懂]

    利用python建立股票量化交易系统(一)——小市值选股票模型[通俗易懂]从今天开始正式开启我的博客之旅,博客内容全部是我自己的量化心得,主要还是为自己将来中工作之中遇到相似问题,可以方便的找到答案,如果能帮到有相似问题的其他同学,我也很开心,如果帮不到的话,不喜勿喷,如果文章中有什么不对的地方,欢迎批评指正。建立第一个简单的量化模型——小市值选股票模型。思路:在A股市场之中,在每个月月底的时候,按照市值排名,选择最小市值的10只股票买入,持有到下个月月底…

    2022年6月26日
    82
  • bigdecimal保留2位小数_java bigdecimal保留两位小数

    bigdecimal保留2位小数_java bigdecimal保留两位小数本篇分享Java注解方法实现BigDecimal保留两位小数!欢迎打卡学习!

    2022年9月23日
    0
  • 漫步数理统计二十六——多元正态分布

    漫步数理统计二十六——多元正态分布本片博文介绍多元正态分布,我们以nn维随机变量为主,但给出n=2n=2时二元情况的一些实例。与上篇文章一样,我们首先介绍标准情况然后扩展到一般情况,当然这里会用到向量与矩阵符号。考虑随机向量Z=(Z1,…,Zn)′\mathbf{Z}=(Z_1,\ldots,Z_n)^\prime,其中Z1,…,ZnZ_1,\ldots,Z_n是独立同分布的N(0,1)N(0,1)随机变量,那么对z∈Rn,Z\ma

    2025年7月31日
    0
  • Android okio简析

    Android okio简析前言看了两天源码,云里雾里的,最终看到这篇blog,才清晰的了解了okio的脉络,能坚持看完肯定有收获。——–自从Google官方将OkHttp作为底层的网络请求之后,作为OkHttp底层IO操作的Okio也是走进开发者的视野,这个甚至是取代了java的原生IO库的存在到底有什么特殊的本领呢?这篇文章主要是对Okio的实现做

    2022年6月11日
    36
  • Unity 地形高度图生成方法[通俗易懂]

    Unity 地形高度图生成方法[通俗易懂]Unity中地形(Terrain)高度图生成方法大概可以归纳为3类:手动绘制直接通过unity的terrain提供的工具手动绘制地形,让后导出成raw格式的高度图,这个没啥可说的,不会的话留言。。。PS等工具生成已经有现成的教程了就不详细描述了。老规则传送门如下:ps生成高度图当然你还可以用其他生成工具,生成raw格式的高度就行。通过noise调整高度图通过noise填充高度图,能够动图的生

    2022年5月26日
    58
  • python+opencv图像模板匹配—单模板匹配

    python+opencv图像模板匹配—单模板匹配

    2021年10月6日
    40

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号