• Sequence和Item


    一、概述

    • sequence指的是uvm_sequence类,而item指的是uvm_sequence_item类。
    • 对于激励生成场景控制,是由sequence来编织的,而对于激励所需要的具体数据控制要求,则是从item的成员数据得到的。

    二、Sequence Item介绍

    item是基于uvm_object类,这表明了它具备UVM核心基类所必要的数据操作方法,例如copy()clone()compare()record()item根据数据成员的类型,将划分为:

    • 控制类。例如总线协议上的读写类型、数据长度、传送模式等。
    • 负载类。一般指的是数据总线上的数据包。
    • 配置类。用来控制driver的驱动行为,例如命令driver的发送间隔或者有无错误插入。
    • 调试类。用来标记一些额外信息方便调试,例如该对象的实例序号、创建时间、被driver解析的时间始末等。

    三、Sequence Item示例

    1. class bus_trans extends uvm_sequence_item; //定义一个transaction
    2. rand bit write;
    3. rand int data;
    4. rand int addr;
    5. rand int delay;
    6. static int id_num;
    7. `uvm_object_utils_begin(bus_trans)
    8. `uvm_field_int ...
    9. `uvm_object_utils_end
    10. ...
    11. endclass
    12. class test1 extends uvm_test;
    13. `uvm_component_utils(test1)
    14. ...
    15. task run_phase(uvm_phase phase);
    16. bus_trans t1, t2;
    17. phase.raise_objection(phase);
    18. # 100ns;
    19. t1 = new("t1");
    20. t1.print();
    21. #200ns;
    22. t2 = new("t2");
    23. void'(t2.randomize());
    24. t2.print();
    25. phase.drop_objection(phase);
    26. endtask
    27. endclass

    输出结果:

     item使用时的特点:

    • 如果数据域属于需要用来做驱动,那么应考虑定义为rand类型,同时按照驱动协议给出合适的constraint
    • 由于item本身的数据属性,为了充分利用UVM域声明的特性,将必要的数据成员都通过'uvm_field_XXX来声明,方便使用基本数据方法自动实现。
    • t1没有被随机化而t2被随机化了,这种差别在item通往sequencer之前是很明显的。UVM要求item的创建和随机化都应该发生在sequencebody()任务中,而不是在sequencer或者driver中。
    • 按照item对象的生命周期来区分,它的生命应该开始于sequencebody()方法,而后经历了随机化并穿越sequencer最终到达driver,直到被driver消化之后,它的生命一般来讲才会结束。

    四、Item和Sequence的关系

    一个sequence可以包含一些有序组织起来的item实例,考虑到item在创建后需要被随机化,sequence在声明时也需要预留一些可供外部随机化的变量,这些随机变量一部分是用来通过层次传递约束来最终控制item对象的随机变量,一部分是用来对item对象之间加以组织和时序控制的。

    为了区分几种常见的sequence定义方式,将其分类为:

    • 扁平类。这一类往往只用来组织更细小的粒度,即item实例构成的组织。
    • 层次类。这一类是由更高层的sequence用来组织底层的sequence,进而让这些sequence按照顺序方法,或者按照并行方式,挂载到同一个sequencer上 。
    • 虚拟类。这一类则是最终控制整个测试场景的方式,鉴于整个环境中往往存在不同种类的sequencer和其对应的sequence,因此需要一个虚拟的sequence来协调顶层的测试场景。之所以称这个方式为虚拟类,是因为该序列本身并不会固定挂载于某一种sequencer类型上,而是将其内部不同类型sequence最终挂载到不同的目标sequencer上。
       

    五、扁平类

    一个flat sequence往往是由细小的sequence item群落构成,在此之上sequence还有更多的信息来完备它需要实现的激励场景。

    一般对于flat sequence而言,它包含的信息:

    • sequence item以及相关的constraint用来关联生成的item之间的关系,从而完善出一个flat sequence的时序形态。
    • 除了限制sequence item的内容,各个item之间的时序信息也需要由flat sequence给定,例如何时生成下一个item并且发送至driver
    • 对于需要driver握手的情况(例如读操作),或者等待monitor事件从而做出反应(例如slavememory response数据响应操作),都需要sequence在收到另外一侧组件的状态后,再决定下一步操作,即响应具体事件从而创建对应的item并且发送出去。

    flat sequence示例1

    1. class flat_seq extends uvm_sequence;
    2. rand int length;
    3. rand int addr;
    4. rand int data[];
    5. rand bit write;
    6. rand int delay;
    7. constraint cstr{
    8. data.size() == length;
    9. foreach(data[i]) soft data[i] == i;
    10. soft addr == 'h100;
    11. soft write == 1;
    12. delay inside {[1:5]};
    13. };
    14. `uvm_object_utils(flat_seq)
    15. ... //省略掉了new函数
    16. task body(); //sequence主要要做的事情就是body,一旦将sequence挂在到sequencer上面,接下来要做的事情就是body
    17. bus_trans tmp; //声明句柄
    18. foreach(data[i]) begin
    19. tmp = new(); //例化了很多对象,并对每一个对象就行随机
    20. tmp.randomize() with {
    21. data == local::data[i];
    22. addr == local::addr + i << 2;
    23. write == local::write;
    24. delay == local::delay;
    25. };
    26. tmp.print();
    27. end
    28. endtask
    29. endclass
    30. class test1 extends uvm_test;
    31. `uvm_component_utils(test1)
    32. ...
    33. task run_phase(uvm_phase phase);
    34. flat_seq seq;
    35. phase.raise_objection(phase);
    36. seq = new();
    37. seq.randomize() with {addr == 'h200; length == 100};
    38. seq.body();
    39. phase.drop_objection(phase);
    40. endtask
    41. endclass

    输出结果:

     

    flat sequence示例2

    1. class bus_trans extends uvm_sequence_item; //下沉
    2. rand bit write;
    3. rand int data[]; //颗粒度变大,可以传输更多的数据
    4. rand int length;
    5. rand int addr;
    6. rand int delay;
    7. static int id_num;
    8. constraint cstr{
    9. data.size() == length;
    10. foreach(data[i]) soft data[i] == i;
    11. soft addr == 'h100;
    12. soft write == 1;
    13. delay inside {[1:5]};
    14. };
    15. `uvm_object_utils_begin(bus_trans)
    16. `uvm_field_int ...
    17. `uvm_object_utils_end
    18. ...
    19. endclass
    20. class flat_seq extends uvm_sequence;
    21. rand int addr;
    22. rand int length;
    23. `uvm_object_utils(flat_seq)
    24. ...
    25. task body();
    26. bus_trans tmp;
    27. tmp.new();
    28. tmp.randomize() with {length == local::length;
    29. addr == local::addr;};
    30. tmp.print();
    31. endtask
    32. endclass
    33. class test1 extends uvm_test;
    34. `uvm_component_utils(test1)
    35. ...
    36. task run_phase(uvm_phase phase);
    37. flat_seq seq;
    38. phase.raise_objection(phase);
    39. seq = new();
    40. seq.randomize() with {addr == 'h200; length == 3};
    41. seq.body();
    42. phase.drop_objection(phase);
    43. endtask
    44. endclass

    输出结果:

     这个示例将一段完整发生在数据传输中的、更长的数据都“收编”在一个bug_trans类中,提高这个item粒度的抽象层次,使得item更成熟、更适合切割。这样flat sequence更倾向于控制,不用去关注数据内容,而只关注这个数据包的长度地址等信息即可,扩充随机数据的责任一般由item负责。
     

    六、层次类

    • hierarchical sequence区别于flat sequence的地方在于,它可以使用其他sequence,还有item,这么做是为了创建更丰富的激励场景。
    • 通过层次嵌套关系,可以让hierarchical sequence使用其它hierarchical sequenceflat sequencesequence item,这也就意味着,如果底层的sequence itemflat sequence的粒度得当,那么就可以充分复用这些flat sequencesequence来构成形式更多样的hierarchical sequence

    hierarchical sequence示例

    1. class hier_seq extends uvm_sequence;
    2. `uvm_object_utils(hier_seq)
    3. function new(string name = "hier_seq");
    4. super.new(name);
    5. endfunction
    6. task body();
    7. bus_trans t1, t2;
    8. flat_seq s1, s2;
    9. `uvm_do_with(t1, {length == 2;}) //宏的作用:1、创建 2、随机 3、传送到sequencer
    10. fork
    11. `uvm_do_with(s1, {length == 5;})
    12. `uvm_do_with(s2, {length == 8;})
    13. join
    14. `uvm_do_with(t2, {length == 3;})
    15. endtask
    16. endclass

     

  • 相关阅读:
    数据库实验二:图书信息管理系统数据查询与数据更新
    petite-vue-源码剖析-v-for重新渲染工作原理
    caj格式能免费转换成pdf吗
    通过tushare接口完成股票的实际交易的方法有哪些?
    Sentinel 熔断规则 (DegradeRule)
    多目标优化算法:基于非支配排序的高尔夫优化算法(NSGOA)MATLAB
    PHP M题 20221104
    暖宫宝触摸芯片-DLT8SA20A-杰力科创
    y89.第五章 分布式链路追踪系统 -- 部署skywalking和skywalking案例(三)
    Web的三大作用域详解
  • 原文地址:https://blog.csdn.net/Arvin_ing/article/details/128119230