之前介绍了VIP部分,现在来看怎么用,之前的传送门:
【UVM 参数化的VIP】- Agent_dajiao_zi的博客-CSDN博客
【UVM 参数化的VIP】- Driver_dajiao_zi的博客-CSDN博客
首先是seq_item都需要继承至base的seq_item:
其他两个CHANEL的seq_item也是类似,需要extend comm_xx_item.这里省略。
class my_seq_item extend comm_seq_item;
//register to factory
rand my_req_seq_item m_req;
rand my_resp_seq_item m_resp;
//function new
virtual function void field_assign();
//override the function
//for user
endfunction
endclass
然后是agent的例化。
class my_env extends uvm_env;
//register
comm_agent #(my_seq_item,my_req_seq_item,my_resp_seq_item) my_agent;
comm_config my_config;
//function new
function build_phase(uvm_phase phase);
my_agent = comm_agent #(my_seq_item,my_req_seq_item,my_resp_seq_item)::type_id::creat("my_agent",this);
endfunction
//connect phase
endclass
然后是seq的使用方式,需要主要指定p_sequencer的时候需要传入自己的seq_item。
class my_seq extends uvm_sequence #(my_seq_item);
`uvm_object_utils(my_seq)
`uvm_declare_p_sequncer(comm_sequencer #(my_seq_item,my_req_seq_item,my_resp_seq_item))
//function new
task body();
use_response_handler(1);
for(int i=0;i<send_pkt_num;i++) begin
`uvm_creat(req);
//rand seq_item
`uvm_send(req);
end
endtask
endclass
到这所有使用的关键点都有提到了,最后总结一下这套vip带来的好处以及和普通vip的区别:
1.思想当然也是vip的思想,只是一般vip的seq_item和protocol都是统一的,或者说是完全一模一样的,像AMBA vip,笔者介绍的这套比较适合用在大量使用同一套自定义的protocol的地方,不同的module,类似的protocol,类似的transaction.
2. 最明显的好处就是充当普通vip的角色,以免不同的user都自己写一套。
完结,后面打算重新开一个专栏,总结一下笔者工作期间遇到的一些典型场景,主要介绍tb的处理方式和用到或者看到的好的方式方法。