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.