目录
类比:sequence=道路,seuqence item=货车,sequencer=目的地收费站,driver=卸货地点。item从sequence一端出发经过sequencer最终到达driver。
- driver陆续拿到多个随机化的item,经过数据解析,按照与dut的物理接口协议将数据写入到接口上,对dut形成激励
- 有必要时,driver解析完一个item回返回最后的状态信息给item对象并回到出发点(互动)
继承关系
- item和sequence可以在任何phase创建
- 无法通过uvm环境结构或phase机制来识别sequence的运行阶段
- 顶层配置时无法按照层次关系直接配置到sequence中,因为item和sequence不在uvm结构中
- sequence活动起来必须挂在attach到一个sequencer上,间接通过sequencer来获取顶层的配置和信息
- sequence只负责生成item的内容,driver负责驱动激励时序,最终的接口驱动时序由driver和sequencer共同决定
- sequencer:作为一个组件可以通过tlm端口与driver传送tiem对象;面向多个并行sequence有仲裁机制来合理分配和传送item
- 数据传送机制采用get模式:driver从sequencer获取item
sequence和item
- 分别是uvm_sequence类和uvm_sequence_item类
- sequence编织激励生成和场景控制;对于激励所需要的的具体数据和控制要求,是从itme的成员数据得来的
uvm_sequence_item
- item基于uvm_object类,具备uvm核心基类的数据操作方法:copy,clone, compare,record
- item具备的数据成员:
- 控制类(总线协议上的读写模式、数据长度、传送模式),
- 负载类(数据总线上的数据包),
- 配置类(控制driver的驱动行为)
- 调试类(标记信息以方便调试,id、time)
class bus_trans extends uvm_sequence_item;
rand bit write;
rand int data;
rand int addr;
rand int delay;
static int id_num;
`uvm_object_utils_begin()
`uvm_field_int()
...
`uvm_object_utils_end
...endclass
class test1 extends uvm_test;
`uvm_component_utils()
...
task run_phase(u p);
bus_trans t1, t2;
phase.raise_objection(p);
#100ns;
t1=new("t1");
t1.print();
#200ns;
t2=new("t2");
void'(t2.randomize());
t2.print();
phase.drop_objection(p);
endtask
endclass
- 如果数据域属于需要用来做驱动,应该考虑定义为rand,按照驱动协议给出合适的约束constraint
- 域的自动化不要忘记,便于使用uvm_object的基本数据方法
- uvm要求item的创建和随机化都要发生在sequence的body()任务中
- item生命周期:产生于sequence的body(),经历随机化,