I have the following code for the sequencer:
class ahb_sequencer extends uvm_sequencer #(ahb_burst_item_s);
`uvm_component_utils(ahb_sequencer)
function new(string name = "ahb_sequencer", uvm_component parent = null);
super.new(name, parent);
endfunction // new
bit write = 0,read = 0,is_master;
ahb_burst_item_s cur_item;
endclass // ahb_sequencer
The relevant sequence code:
class ahb_master_sequence extends ahb_base_sequence;
`uvm_object_utils(ahb_master_sequence)
`uvm_declare_p_sequencer(ahb_sequencer)
function new(string name = "ahb_master_sequence");
super.new(name);
endfunction
ahb_burst_item_s my_req;
rand byte unsigned my_data[$];
int my_size;
constraint queue_val {
my_data.size() == my_size;
//foreach (my_data[ii]) my_data[ii] == ((ii+1)&8'hff);
}
virtual task body();
for (int i =0;i < 10 ; i++ ) begin
req = ahb_burst_item_s::type_id::create("req"); //create the req (seq item)
//req.max_asize = 2; //(need to get this from agent gonfig)
assert(req.randomize());
my_size = 2**(req.size);
assert(randomize(my_data));
req.fill_ahb_transaction_with_data(my_data);
wait_for_grant(); //wait for grant
$display("after wait for grant");
send_request(req); //send req to driver
wait_for_item_done(); //wait for item done from driver
// get_response(rsp);
end // for (int i =0;i < 10 ; i++ )
endtask // bosy
endclass // ahb_main_sequence
The relevant code in the driver:
virtual task driver_operation;
int delay_num, i;
bit hwrite;
bit [`AHB_ADDR_WIDTH - 1:0] addr;
forever begin
if (!ahb_vif.hresetn) begin
init_signals();
wait(ahb_vif.hresetn);
end
seq_item_port.get_next_item(cur_item);
@(posedge ahb_vif.hclk);
Trying to debug it, and it seems that the sequence task get stuck in wait_for_grant(), and I don’t know why