一、序列组件的互动
sequence
对象会产生目标数量的sequence item
对象。借助于SV的随机化和sequence item
对随机化的支持,使得产生的每个sequence item
对象中的数据内容都不相同。- 产生的
sequence item
会经过sequencer
再流向driver
。 driver
陆续得到每一个sequence item
,经过数据解析,将数据按照与DUT的物理接口协议写入到接口上,对DUT形成有效激励。- 当有必要时,
driver
在每解析并消化完一个sequence item
后,它会将最后的状态信息写会sequence item
对象再返回给sequencer
,最终抵达sequence
对象一侧。这样做的目的是,有时sequence
需要得知driver
与DUT互动的状态,这就需要driver
有一个回路将更新过的sequence item
对象写回至sequence
一侧。 sequence item
是driver
与DUT每一次互动的最小粒度内容。例如DUT如果是一个slave
端,driver
扮演master
去访问DUT的寄存器,那么sequence item
需要定义的数据信息至少包括访问地址、命令码、数据和状态值,这样的信息在driver
取得后,会通过时序方式在interface
一侧发起激励送至DUT。按照一般总线做寄存器访问的习惯,这种访问在时序上大致会保持几个时钟周期,直至数据传送完毕,而由driver
再准备发起下一次操作。- 除了可以在声明
sequence item
时添加必要的成员变量,也可以添加对这些成员变量进行操作的成员方法。要注意添加的成员变量是否需要随机化。 - 对于一个
sequence
而言,它会产生多个sequence item
,也可以产生多个sequence
。从产生层次来看,sequence item
是最小粒度,它可以由sequence
生成,而相关sequence
也可以进一步组织继而实现层次化,最终由更上层的sequence
进行调度,所以sequence
可以看做是产生激励内容的载体。 - 在
sequence
与driver
之间起到桥梁作用的sequencer
,由于sequencer
与driver
都是component
组件,它们之间的通信也是通过TLM端口实现的。之间的TLM通信参数即sequence item
类,由于这一限制,使得sequencer
到driver
的传输数据类型不能改变,同时与sequencer
挂接的sequence
创建的sequence item
类型也应为指定类型。 - 激励驱动链的最后一道关卡是
driver
。对于常见用法,driver
往往是一个sequence item
消化完,报告给sequencer
和sequence
,同时再请求消化下一个sequence item
。driver
看起来永远喂不饱,同时还又对食物很挑剔。在消化每一个sequence item
之前,该item
中的数据是已经随机化好的,所以每个item
内容一般都是各不相同的。driver
自己并不会轻易修改item
中的值,它会把item
中的数据按照与DUT的物理协议时序关系驱动到接口上面。例如对于一个标准的写操作,driver
不但需要按照时序依次驱动地址总线、命令码总线和数据总线,还应该等待从端的返回信号和状态值,这样才算完成了一次数据写传输。
二、继承关系
uvm_sequence_item
和uvm_sequence
都是基于uvm_object
,它们不同于uvm_component
只应当在build
阶段作为UVM环境的“不动产”进行创建和配置,而是可以在任何阶段创建。这种类的继承带来的UVM应用区别在于:
- 由于无法判定环境在
run
阶段什么时间点会创建sequence
和将其挂载(attach)到sequencer
上面,所以无法通过UVM环境结构或者phase机制来识别sequence
的运行阶段。 - 由于
uvm_object
独立于build
阶段之外,这使得可以有选择地、动态地在合适时间点挂载所需要的sequence
和item
。 - 由于
uvm_sequence
和uvm_sequencer_item
并不处于UVM结构当中,所以顶层在做配置时,无法按照层次关系直接配置到sequence
中。 - 如果
sequence
一旦活动起来,它必须挂载到一个sequencer
上,这样sequence
可以依赖于sequencer
的结构关系,间接通过sequencer
来获取顶层的配置和更多信息。
一般情况下,可能会将时序控制的权利赋予sequence,这种从sequence产生item,继而将item通过sequencer推送给driver的职责划分方式有点不太合适。如果明确划分责任的话,sequence应该只负责生成item的内容,而不应该控制item消化的方式和时序,而驱动激励时序的任务应当由driver来完成。
item的生成和传送,并不表示最终的接口驱动时序,决定这一点的还包括sequencer和driver。sequencer之所以作为一个“路由”管道,设立在sequence和driver之间,主要有两个原因:
- sequence作为一个组件,它可以通过TLM端口与driver传送item对象。
- sequencer在面向多个并行sequence时,它
---------------------
作者:煎丶包
来源:CSDN
原文:https://blog.csdn.net/qq_39794062/article/details/114259842
版权声明:本文为作者原创文章,转载请附上博文链接!
内容解析By:CSDN,CNBLOG博客文章一键转载插件