skootamota
03-13-2008, 05:57 PM
Just a question about the Xbus example. From the Xbus specification, section A.2.3 regarding Reset, it states that reset may be asserted at any time.
Looking at the following code snippet from the xbus_master_driver.sv file, if reset was ever asserted more than once, then this driver continues to get sequence items (it's still in the get_and drive() forever loop), tries to process them, all the while it may be in reset. I think there is an issue here, and if so, is there a proper method to deal with reset?
// run phase
virtual task run();
fork
get_and_drive();
reset_signals();
join
endtask : run
// get_and_drive
virtual protected task get_and_drive();
ovm_sequence_item item;
xbus_transfer this_trans;
@(negedge xmi.sig_reset);
`message(OVM_MEDIUM,("Reset dropped"))
forever begin
@(posedge xmi.sig_clock);
seq_item_prod_if.get_next_item(item);
$cast(this_trans, item);
drive_transfer(this_trans);
seq_item_prod_if.item_done();
end
endtask : get_and_drive
// reset_signals
virtual protected task reset_signals();
forever begin
@(posedge xmi.sig_reset);
`message(OVM_MEDIUM, ("Reset observed"))
xmi.sig_request[master_id] <= 0;
xmi.rw <= 'h0;
xmi.sig_addr <= 'hz;
xmi.sig_data_out <= 'hz;
xmi.sig_size <= 'bz;
xmi.sig_read <= 'bz;
xmi.sig_write <= 'bz;
xmi.sig_bip <= 'bz;
end
endtask : reset_signals
Looking at the following code snippet from the xbus_master_driver.sv file, if reset was ever asserted more than once, then this driver continues to get sequence items (it's still in the get_and drive() forever loop), tries to process them, all the while it may be in reset. I think there is an issue here, and if so, is there a proper method to deal with reset?
// run phase
virtual task run();
fork
get_and_drive();
reset_signals();
join
endtask : run
// get_and_drive
virtual protected task get_and_drive();
ovm_sequence_item item;
xbus_transfer this_trans;
@(negedge xmi.sig_reset);
`message(OVM_MEDIUM,("Reset dropped"))
forever begin
@(posedge xmi.sig_clock);
seq_item_prod_if.get_next_item(item);
$cast(this_trans, item);
drive_transfer(this_trans);
seq_item_prod_if.item_done();
end
endtask : get_and_drive
// reset_signals
virtual protected task reset_signals();
forever begin
@(posedge xmi.sig_reset);
`message(OVM_MEDIUM, ("Reset observed"))
xmi.sig_request[master_id] <= 0;
xmi.rw <= 'h0;
xmi.sig_addr <= 'hz;
xmi.sig_data_out <= 'hz;
xmi.sig_size <= 'bz;
xmi.sig_read <= 'bz;
xmi.sig_write <= 'bz;
xmi.sig_bip <= 'bz;
end
endtask : reset_signals