本实验的目的是将generator重构成sequencer和sequence,其中,sequence是用来生成相应的sequence_item,sequencer用于发送sequence_item。
首先修改的是driver和generator之间的通信mailbox,我们不再使用mailbox进行transaction的传输。采用tlm端口进行,即在agent的connect_phase()方法中将agent的seq_item_port与sequencer的seq_item_export进行连接(由于chnl_package,reg_package以及fmt_package中generator是一致的,所以采用reg_package举例)。
driver.seq_item_port.connect(sequencer.seq_item_export);
这里之前报错,后来发现是因为参数化的类这个问题,我给driver声明的时候添加了#(reg_trans),但是sequener并没有添加#(reg_trans),这导致接口的类型不同,因此报错。
driver在run_phase()阶段调用get_next_item()方法获取sequencer上挂载的sequence产生的sequence_item。
seq_item_port.get_next_item(req);
driver在接收到sequence_item之后,对其进行克隆,调用核心基类的核心方法,产生的对象类型是uvm_object,需要通过cast将其转化为reg_trans这种sequence_item类型。之后通过调用item_done返回,在此之前,我们需要获得该Item所述的sequence的id,保证传输给相应的sequence。
rsp.set_sequence_id(req.get_sequence_id());
seq_item_port.item_done(rsp);
之后是对generator实现到sequence/sequencer的转化。首先是sequencer的声明,比较简单,就是利用`uvm_component_utils()完成sequencer的注册,并且声明new()函数。
class reg_sequencer extends uvm_sequencer #(reg_trans);
`uvm_component_utils(reg_sequencer)
function new