文章目录
简介
发送item的过程:
- sequence是产生sequence item对象的地方,也可以产生sequence对象来实现sequence层次化;
- 产生sequence item经过sequencer流向driver;
- driver得到sequence item后,将数据按照与DUT的物理接口协议写入到接口上,对DUT形成有效激励;如果DUT与driver要进行互动,需要driver返回一个sequence item,经过sequencer到达sequence;
基本概念:
- sequence item是driver与DUT互动的最小粒度内容;
- 通过SV的随机化和sequence item对随机化的支持,产生的每个sequence item对象中的数据内容都不同;
- driver和sequencer的通信时通过TLM端口实现;
- driver 和 sequencer 是component ;uvm_sequence_item 和 uvm_sequence 是object;
- uvm_sequence 和 uvm_sequence_item并不处于UVM树结构中,所以顶层无法直接做配置。sequence活动起来,会挂载在sequencer上,这样sequence就可以依赖于sequencer的结构关系,通过sequencer来获取顶层配置;
- 数据传送机制采取的get模式,而不是put模式;
sequencer存在的意义?
- sequencer是一个组件,可以通过TLM端口与driver传输item对象;
- 当有多个sequence挂载在sequencer上时,sequencer有充分的仲裁机制来合理分配和传送item,继而实现并行item数据传送至driver的测试场景;
- 由于sequence是一个object,而uvm_object是独立于build阶段的,这就使得用户可以有选择地、动态地在合适时间点挂载所需的sequence和item;
选取get()模式的原因?
- 如果是get模式,那么当item从sequence产生,穿过sequencer到达driver时,我们就可以结束该传输。而如果是put模式,则必须是sequencer将item传送至driver,同时必须收到返回值才可以发起下一次的传输。从效率上看,是由差别的。
- 如果需要让sequencer具有仲裁的特性,使得多个sequencer同时挂载sequencer上,那么get模式更符合“工学设计”。这是因为driver作为initiator,一旦发出get请求,会先通过sequencer,继而获得仲裁后的item。
1.sequence 和 item
item的使用:
- 如果数据域使用来做驱动,应该定义为rand,同时按照驱动协议给出合适的constraint
- 通过宏`uvm_field_xxx声明必要的数据成员,以便日后使用uvm_object的基本数据方法的自动实现,例如print( );
- UVM要求item的创建和随机化都发生在sequence的body()任务中;
- item对象的声明周期始于sequence中的body方法中的create_item(),直到被driver消化后,item生命周期结束;如果要对item做操作,可以合理利用copy()或clone()等数据方法。
sequence的分类:
- flat sequence只产生和发送item ;
- hierarchical sequence,