1.sequence和item,sequencer和driver之间的关系
transaction在sequence中传输,到达driver
创建了组件和顶层环境,完成组件之间的TLM端口(道路,桥梁,河道)
物流-sequence(run_phase 之中)
sequence就是道路,sequence item是道路上行驶的货车,sequencer是目的地的关卡,driver是最终卸货的地方
driver对到站的货物,经过扫描处理,将它们分解为更小的信息量,提供给DUT
sequence产生目标数量的sequence item
sequence是driver和dut交互的最小粒度
假如DUT是一个slave端,driver扮演master去访问DUT的寄存器,那么sequence item需要定义的数据信息至少包括访问地址,命令码,数据和状态值,在driver获得这些信息后,会通过时序方式在interface一侧发起激励送至DUT
sequence和driver是component组件,它们之间的通信也是通过TLM端口来实现的
sequence item从sequence经过sequencer和driver,它的类型必须是保持一致的uvm_sequence_item和uvm_seqence都是基于uvm_object,不同于uvm_component只应当在build阶段进行创建和配置,可以在任何阶段创建
无法判断环境在run阶段数目时间点会创建sequence和将其挂载(attach)到sequencer上面,无法通过UVM环境结构或者phase机制来识别sequence的运行阶段
由于uvm_object独立于build阶段之外,使得用户可以有选择地,动态地的在合适时间点挂载所需要的sequence和item
如果sequence一旦活动起来,必须挂载到一个sequencer上
sequencer作用:
sequencer作为一个组件,可以通过TLM端口与driver传送item对象
sequencer在面向多个并行sequence时,有充分的仲裁机制来合理分配和传送item
driver从sequencer获取item,数据传输是get模式
选择get模式的原因
get模式,item从sequence中产生,穿过sequencer到达driver,就可以结束该传输。put模式,则必须是sequencer从item传送到driver,同时收到返回值才可以发起下一次的传输。
sequencer具有仲裁特性,可以使得多个sequence同时挂载到sequencer上面,get模式更符合“工学设计”。driver作为initiator, 一旦发出get请求,他会先通过sequencer,继而获得仲裁后的item。
2.sequence和item
sequence指代的是uvm_sequence类,item指代的是uvm_sequence_item类。激励的生成和场景由sequence来控制,激励所需要的具体数据和要求则需要item的成员数据提供的。
item是基于uvm_object类,具备uvm核心基类所必要的数据操作方法,copy(),clone(),compare(),record()
item的数据成员:
控制类:譬如总线协议上的读写类型,数据长度,传送模式
负载类:数据总线上的数据包
配置类:用来控制driver的驱动行为,例如命令driver的发送间隔
调试类:用来标记一些额外信息方便调试,例如该对象的实例序号,创建时间
class bus_trans extends uvm_sequence_item;
rand bit write;
rand int data;
rand