Race condition between write() in UVM scoreboard

In reply to chr_sue:

Sorry… Your solution is not clear to me. How do i control my drivers here?

Lets say I have 2 drivers/monitors and they are named as: rd_drv, wr_drv, rd_mon, wr_mon

rd_mon:

task run_phase();
  ...
  if(vif.rd_en) begin
    item.rd_addr = vif.rd_addr;
    ap.write(item);                //Writing sampled rd item to the scoreboard
  end
endtask

wr_mon:

task run_phase();
  ...
  if(vif.wr_en) begin
    item.wr_addr = vif.wr_addr;
    item.wr_data = vif.wr_data;
    ap.write(item);              //Writing sampled wr item to the scoreboard
  end
endtask

wr_drv:

task run_phase();
  ...
  seq_item_port.get_next_item(item);
  drive_if(item);
  seq_item_port.done();
endtask

task drive_if(wr_item item);
  @vif.cb;
  vif.wr_en <= 1'b1;
  vif.wr_data <= item.wr_data;
  vif.wr_addr <= item.wr_addr;
endtask

rd_drv:

task run_phase();
  ...
  seq_item_port.get_next_item(item);
  drive_if(item);
  seq_item_port.done();
endtask

task drive_if(rd_item item);
  @vif.cb;
  vif.rd_en <= 1'b1;
  vif.rd_addr <= item.rd_addr;
endtask

Lets say there is a virtual sequence which runs read sequences and writes sequences in parallel. When both drivers drive their corresponding pkts at the same time, my monitors sample them and send it to a single scoreboard which has a memory model.
The connection from monitors to scoreboard is like below:
rd_mon → ap1 → scbd
wr_mon → ap2 → scbd
My scoreboard implements 2 different write() implementations and acts accordingly.
How do i ensure correct order here? ie. When both write/read happens at the same time, the write operation should happen first and then the read operation.

Feel free to alter the driver/monitor code. And let me know if you need more code if my question is unclear.