1. 从spec中提取要包成transaction的信息。举例来讲对于i2c协议是addr,data,length等等参数。
2.这些信息整合后包成transaction,这便是sequence与driver连接的中介,transaction。因为sequence需要给driver提供多种多样的transaction并且需要不同的sequencer来转发。所以会有第二层结构,针对sequence需要发送的不同transaction,整合成一个个待发的不同的item。
这个层次可称为seuqence的base sequence。
所有的sequence都通过调用此sequence来实现自己想要的item。它的内部主要部分有:
1.不同的所有sequence需要用到的功能可以包成公共的task。如,读,写等操作。记得加上virtual关键字作为基类函数。
2.不同的cmd也可以包成共用的task。同样为了方便继承以及扩展可以加virtual关键字
3.此层在body中实现每种item的准备工作,用start_item(tr); tr.randomize(); finish_item(tr); 的模式来准备item。
4. sequence中参数的传递举例。
class abc extends uvm_sequence_base;
rand bit a;
rand bit[2:0] b;
rand bit[1:0] c;
virtual function send_tr( bit a);
this.a=a;
endfunction
task body();
transaction tr;
tr=transaction::type_id::create("tr");
tr.a=this.a;
endtask
endclass
3.item选定sequencer再发送给driver的过程通过每个sequence来实现。每个sequence中在item发送前都会选择sequencer用。用item.start(sequencer)的方式来启动每个item.每个sequence中对自己需要的参数进行constraint,互不影响。公共的constraint放在basic sequence里面。