简答来说,sequence机制是一个控制和产生事务,并将事务发送给driver的一套机制。
sequence机制是一个过程,需要消耗仿真时间,因此function_phase中是无法使用sequence机制,只能被用在task_phase中,也只有task_phase中需要产生事务。
以testcase中的sequence为例,当sequence收到env中的sequencer的事务请求后,会发送一个新的事务到sequencer中,而sequencer又会传给driver中,driver完成后会发送一个完成信号到sequencer中。同样,sequencer会将完成信号接着传递sequence中,准备下一次的发送,如此循坏,直到所有的事务产生完毕。
使用sequence主要是为了提高平台的可重用性,对于不同的事务可以使用同一个driver驱动。
如何查看sequencer中是否使用sequence机制,看sequencer中是否配置default_sequence指针,或者平台其他组件是否手动实例化sequence并调用它的start()方法。而sequence机制中start()方法主要是使用body()方法,body()方法产生事务items并放在sequencer中(中间会有一个items_fifo过渡),发送后等待driver完成标志。
以如下代码为例:
class my_driver extends uvm_driver # (my_transcation);
...
virtual task run_phase(uvm_phase phase);
logic [7:0] temp;
repeat(15)@(m_vif.driver_cb);
forever begin
seq_item_port.get_next_item(req);// 请求事务和等待获取事务
......
......//Driver the DUT
seq_item_port.item_done();//完成事务后给出的标志
end
endtask
endclass