可以使用uvm_sequence_base类中的预定义方法调用将随机序列项驱动到driver。有两种方法使用一组uvm_sequence_base方法,sequence可以通过这些方法发送sequence items并从driver检索响应(如果适用)。
A: Using wait_for_grant(), send_request(), wait_for_item_done() etc
以下方法在派生自uvm_sequence_item类的uvm_setquence_base类中定义。
Steps:
- Create a seq_item using create() method.
- wait_for_grant
- Randomize seq_item
- send_request(req)
- wait_for_item_done()
- get_response (rsp)
class my_sequence extends uvm_sequence #(seq_item);
`uvm_object_utils(my_sequence)
function new (string name = "my_sequence")
super.new(name);
endfunction
task body();
req = seq_item::type_id::create("req");
wait_for_grant();
assert(req.randomize());
send_request(req);
wait_for_item_done();
get_respose(rsp);
endtask
endclass
B: Using start_item/finish_item methods
start_item和finish_item任务也在uvm_sequence_base类中定义。这两种方法都会启动sequence item的操作。
注:start_item和finish_item调用之间不应消耗仿真时间。
Steps:
- Create a seq_item using create() method.
- start_item(req)
- Randomize seq_item
- finish_item(req)
class my_sequence extends uvm_sequence #(seq_item);
`uvm_object_utils(my_sequence)
function new (string name = "my_sequence")
super.new(name);
endfunction
task body();
req = seq_item::type_id::create("req");
start_item(req);
assert(req.randomize());
finish_item(req);
endtask
endclass
重要提示:
方法B与方法A相同。start_item(req)方法在内部调用wait_for_grant()方法以从sequencer获取grant。finish_item(req)方法在内部调用send_request()和wait_for_item_done()方法。因此,start_item和finish_item方法是它们的wrapper 方法。