In reply to chr_sue:
Yes, i use seq.start() in run_phase in uvm_test.Now, the task body() works.
But , the driver seems has some problems.
here is my modified driver and interface 's code. there is compiler error related to @(posedge `DRIV_IF);
I am still finding the reason
interface mem_if(input logic clk,reset);
logic [1:0] addr;
logic wr_en;
logic rd_en;
logic [7:0] wdata;
logic [7:0] rdata;
//---------------------------------------
//driver clocking block
//---------------------------------------
clocking driver_cb @(posedge clk);
default input #1 output #1;
output addr;
output wr_en;
output rd_en;
output wdata;
input rdata;
endclocking
//---------------------------------------
//driver modport
//---------------------------------------
//modport DRIVER (clocking driver_cb,input clk,reset);
endinterface
`define DRIV_IF pointer_to_interface.driver_cb
class mem_driver extends uvm_driver #(mem_seq_item);
`uvm_component_utils(mem_driver);
virtual mem_if pointer_to_interface;
function new (string name, uvm_component parent);
super.new(name,parent);
endfunction : new
virtual function void build_phase(uvm_phase phase);
super.build_phase(phase);
if(!uvm_config_db #(virtual mem_if)::get(null, "*","pointer_to_interface", pointer_to_interface))
$fatal("Failed to get BFM");
endfunction : build_phase
task run_phase(uvm_phase phase);
phase.raise_objection(this);
forever begin
seq_item_port.get_next_item(req);
drive();
seq_item_port.item_done();
end
phase.drop_objection(this);
endtask : run_phase
virtual task drive();
`DRIV_IF.wr_en <= 0;
`DRIV_IF.rd_en <= 0;
@(posedge `DRIV_IF);
`DRIV_IF.addr <= req.addr;
if(req.wr_en) begin
`DRIV_IF.wr_en <= req.wr_en;
`DRIV_IF.wdata <= req.wdata;
end
@(posedge `DRIV_IF);
if(req.rd_en) begin
`DRIV_IF.rd_en <= req.rd_en;
@(posedge `DRIV_IF);
`DRIV_IF.rd_en <= 0;
@(posedge `DRIV_IF);
req.rdata = `DRIV_IF.rdata;
end
endtask : drive
endclass