UVM序列篇之三:sequence和item(下)

本文转自:http://www.eetop.cn/blog/html/28/1561828-5940196.html

Flat Sequence

一个flat sequence往往由细小的sequence item群落构成,在此之上sequence中还有更多的信息来完备它自身需要实现的激励场景。一般对于一个flat sequence而言,它里面包含的信息有:

  • sequence item以及相关的constraint用来关联生成的item之间的关系,从而完善出一个flat sequence的时序形态。

  • 除了限制sequence item的内容,各个item之间的时序信息也需要由flat sequence给定,例如何时来生成下一个item并且发送至driver。

  • 对于需要与driver握手的情况(例如读操作),或者等待monitor的事件从而做出反应(例如slave的memory response数据响应操作),都需要sequence在收到另外一侧组件的状态之后,再决定下一步的操作,即响应具体事件从而创建对应的item并且发送出去。

接下来我们给出一个例子,帮助读者理解flat sequence的大致结构和用法:

输出结果:

这个例子中,我们暂时没有使用sequence的宏或者其它用来发送item的宏来表示sequence/item与sequencer之间的传送方法,而是用更直白的方式来描述这种层次关系和包含性。flat_seq自身可以看做是一个更长的数据包,其中数据包的具体内容、长度、地址等信息都包含在flat_seq中,在生成item的过程中,通过将自身的随机变量作为constraint来限定item的变量随机内容,这是flat sequence的大致处理方法。在上面例码中没有给出例如`uvm_do/`uvm_do_with/`uvm_create等宏是为了让读者首先认清sequence与item之间的关系。因此上面的例子也只给出了在flat_seq::body()任务中创建和随机item,而省略了发送item。关于完整的过程,我们将在稍后的《sequencer与sequence》中具体阐述常见的方法和宏。

而读者看到这里,可能会觉得,实际上bus_trans理应可以容纳更多的时序内容,而不应该只是一次数据传输。没错!作为数据传送的最小粒度,用户们有权利将它们扩展到更大的数据和时间范围,从而间接减小数据通信和处理的成本,提高整体的运行效率。因此,我们可以通过下面的这段例码来对之前的例码进行改建,从而起到一样的效果:

输出结果:

从这段修改后的例码可以看到,我们可以将一段完整发生在数据传输中的,更长的数据都“收编”在一个bus_trans中,增加这个item粒度的层次,让它变得更有“气质”。而一旦拥有了更成熟的、更切割得合适的item,在上层的flat sequence使用过程中那就更顺手一些了。譬如上面的例子中,flat_seq类不再操本不属于自己的闲心,考虑数据的内容,而只应该考虑这个数据包的长度、地址等信息,因为扩充随机数据的责任一般由item负责就足够了,而使用flat_seq的用户也无需考虑多余的constraint。

Hierarchical Sequence

Hierarchical sequence区别于flat sequence的地方在于,它可以使用其他的sequence,当然还有item,这么做是为了创建更丰富的激励场景。通过层次嵌套的关系,可以使得hierarchical sequence可以同时使用其它hierarchical sequence、flat sequence和sequence item,这也就意味着,如果底层的sequence item和flat sequence的粒度得当,那么就可以充分利用这些sequence/item来构成形式各样的hierarchical sequence。接下来,我们就着之前定义的bus_trans和flat_seq来给出一个简单的hier_seq,帮助读者们理解这些类之间的联系:

从hier_seq::body()来看,它其中包含有bus_trans t1,t2和flat_seq s1,s2。而它的层次关系就体现在了对于各个sequence/item的协调上面。例码中使用了`uvm_do_with宏,这个宏完成了三个步骤:

  • sequence或者item的创建

  • sequence或者item的随机化

  • sequence或者item的传送

区别于之前例码,这个例码通过`uvm_do_with宏帮助读者理解,所谓的sequence的复用也就是通过高层的sequence来嵌套底层的sequence/item,最后来创建期望的场景。上面的例子中,既有串行的激励关系,也有并行的激励关系,而在更复杂的场景中,用户还可以考虑加入事件同步(通过uvm_event、uvm_barrier或者interface上的信号变化),或者一定的延迟关系(最好基于时钟)来完成sequence/item之间的时序关系。

猜你喜欢

转载自blog.csdn.net/qq_41394155/article/details/82112449