|

楼主 |
发表于 2025-5-26 16:41:37
|
显示全部楼层
driver中:
function void axi_driver::build_phase(uvm_phase phase);
super.build_phase(phase);
seq_item_port2 = new("seq_item_port2", this);
endfunction
task axi_driver::drive();
fork
while(cfg.vip_en) begin
if(cfg.drv_en) begin
axi_xaction item;
@`AXI_DRV_CB;
`uvm_info("DEBUG", $sformatf("w_addr(), w_done = %0d", w_done), UVM_DEBUG)
if(w_done && (seq_item_port.has_do_available())) begin
w_done = 0;
seq_item_port.get_next_item(req);
if(!$cast(w_trans, req)) begin
`uvm_fatal(get_name(), "req type error")
end
`uvm_info(get_name(), "Write Packet received in master driver", UVM_LOW)
w_trans.print();
fork
send_write_address();
send_write_data();
join
void'($cast(item, w_trans.clone()));
item.set_sequence_id(item.id);
foreach(tx_port_w) begin
tx_port_w.write(item);
end
seq_item_port.put_response(w_trans);
seq_item_port.item_done();
w_done = 1;
end
end else begin
@`AXI_DRV_CB;
end
end
while(cfg.vip_en) begin
if(cfg.drv_en) begin
@`AXI_DRV_CB;
`uvm_info("DEBUG", $sformatf("r_addr(), r_done = %0d", r_done), UVM_DEBUG)
if(r_done) begin
r_done = 0;
seq_item_port2.get_next_item(req);
`uvm_info(get_name(), "Read Packet received in master driver", UVM_LOW)
if(!$cast(r_trans, req)) begin
`uvm_fatal(get_name(), "req type error")
end
r_trans.print();
send_read_address();
seq_item_port2.put_response(r_trans);
seq_item_port2.item_done();
r_done = 1;
end
end else begin
@`AXI_DRV_CB;
end
end
join
endtask
agent中:
function void axi_agent::build_phase(uvm_phase phase);
super.build_phase(phase);
//for read sequencer
r_sqr = uvm_sequencer #(uvm_sequence_item)::type_id::create("r_sqr", this);
endfunction
function void axi_agent::connect_phase(uvm_phase phase);
super.connect_phase(phase);
//for read sequencer
m_drv.seq_item_port2.connect(r_sqr.seq_item_export);
endfunction
|
|