• uvm_do系列宏浅析


     

    uvm_do系列宏浅析

    外表篇:

    uvm_do系列宏包括:

    • `uvm_do
    • `uvm_do_pri
    • `uvm_do_with
    • `uvm_do_pri_with
    • `uvm_do_on
    • `uvm_do_on_pri
    • `uvm_do_on_with
    • `uvm_do_on_pri_with

    宏的形式记忆:

      细心的读者,从上面的排列总就能发现一个简答的规律,帮组记忆。金字塔记忆方法。

      总共8个,分两组:一组带on,一组不带on。每组都是由 pri,with的有无来组合,所以每组有四个。

    宏的参数记忆:

      其实可以从宏的形式来知道,其到底传了什么参数。并且能方便记忆参数的位置。

      首先,所有宏都有参数:“SEQ_OR_ITEM",该参数可以使sequence或者transaction。与do对应。

      其次,带有on的宏,其要传一个”SEQR“的参数,该参数是sequencer,用来指定在要将后面产生的transaction发给哪一个sequencer。与on对应。

      然后,带有pri的宏,都要给其传一个“PRIORITY"的参数,该参数是大于-1的整数,表示产生的transaction的优先级。与pri对应。

      最后,带有with的宏,都有传一个”CONSTRAINT“的参数,该参数是由{ }包括的约束,表示对SEQ_OR_ITEM的一个约束。与with对应。 

      所以,`uvm_do_on_pri_with的具体形式为:`uvm_do_on_pri_with(SEQ_OR_ITEM, SEQR, PRIORITY, CONSTRAINT)。   

     

    内在篇:

    代码解析:

      虽然说uvm_do系列宏有八个,但是每一个宏最终的落脚点都是在`uvm_do_on_pri_with,这8个是统一的。具体源码里面怎么实现的呢?

    • 宏中没有on的,其实是`uvm_do_on_pri_with( SEQ_OR_ITEM , m_sequencer, PRIORITY, CONSTRAINT)
    • 宏中没有pri的,其实是`uvm_do_on_pri_with(SEQ_OR_ITEM, SEQR, -1, CONSTRAINT)
    • 宏中没有with的,其实是`uvm_do_on_pri_with(SEQ_OR_ITEM, SEQR, PRIORITY, {}) 

      一句话总结:就是SEQR的默认参数是m_sequencer, PRIORITY的默认参数是-1, with的默认参数是{},不指明参数的将用默认参数代替。  

      下面来具体分析`uvm_do_on_pri_with。

      源码如下:

    里面有个uvm_create_on函数,其定义如下:

    这里面又调用ceate_item函数,创建一个SEQ_OR_ITEM。create_item函数是uvm_sequence_base类的一个函数,为此,这就说明了uvm_do系列宏只能在sequence类里面用

    create_item宏定义如下:

    最终调用factory.create_object_by_type来实例化SEQ_OR_ITEM。并且指定SEQ_OR_ITEM的m_sequencer(SEQR),和parent_sequence(this)。位start_item做准备。

    下面回到`uvm_do_on_pri_with中。

    SEQ_OR_ITEM被返回后,后面要先判断SEQ_OR_ITEM是SEQ还是ITEM,从而为执行不同的动作。

    1. 如果是ITEM,则start_item(SEQ_OR_ITEM, PRIORITY) , randomize, finish_item(SEQ_OR_ITEM, PRIORITY)。
    2. 如果是SEQ,则调用start(SEQR,this,PRIORITY, 0)。

    后面分两次分析start方法,以及start_item和finish_item。

  • 相关阅读:
    Linux进程间通信:父子进程通过信号通信,实现交替数数,时间间隔1秒
    Ubuntu18 给terminal改个漂亮的命令行提示符
    int型、char*、string、的swap算法
    C++中的友元函数的总结
    C++内联函数
    static作用,静态成员变量和静态成员函数
    9——对象的创建和撤销,构造函数和析构函数
    如何用敏捷搞垮一个团队?
    .Net核心中间件httpContext不支持并发读写 Concurrent reads or writes are not supported.
    CentOS 7 MySQL5.7 多实例(多端口)
  • 原文地址:https://www.cnblogs.com/htaozy/p/8051849.html
Copyright © 2020-2023  润新知