start_item和finish_item
·uvm_do可以分解为start_item和finish_item,它们又可以如下分解:
sequencer.wait_for_grant(prior) (task) \ //等待driver同意发送item,对应driver里面get_next_item(req)
start_item \
parent_req.pre_do(1) (task) / \
`uvm_do* macros
parent_req.mid_do(item) (func) \ /
sequencer.send_request(item) (func) \ /
finish_item /
sequencer.wait_for_item_done() (task) / //等待driveri tem发送完成,对应driver里面item_done();
parent_req.post_do(item) (func) /
response机制概述
通常情况下,UVM sequence机制可以只提供一种sequence->sequencer->driver单项传输机制。同时,sequence机制可以提供一种反馈机制——response机制,反馈路径为driver->sequencer->sequence。
get_response和put_response
如果需要使用rosponse机制就需要在sequence内使用get_response任务;在driver内使用put_response任务。
在调用put_response前需要调用set_id_info函数,其将sequence发送的transaction id等相关信息复制到rsp内,以让sequencer知道将response返回给其哪个sequence(一个sequencer内可以有几个sequence)。
使用response的注意事项
get_response和put_response一一对应,当sequencer启动get_response后就会阻塞进程,直到response_queue被放入新的记录,即driver将response通过put_response返回给sequence。
若希望get_response在driver返回前sequence继续发送transaction,则需要使用response_handler。
实例分析
class case_seq extends uvm_sequence#(case_seq_item);
virtual task body();
repeat(10) begin
item = new();
item.randomize();
start_item(item); //等待get_next_item
finsh_item(item); //等待item_done
get_response(rsp); //获取reponse
end
endtask
`uvm_object_utils(case_seq)
endclass
class case_driver extends uvm_driver;
task main_phase(uvm_phase phase);
while(1) begin
seq_item_port.get_next_item(req); //等待start_item,获取req
driver_one_pkt(req);
rsp = new("rsp");
rsp.set_id_info(req);
seq_item_port.put_response(rsp); //发送reponse
seq_item_port.item_done(); //发送完毕
end
endtask
endclass