blob: 4362338972de644fa53abc20053285bfef7d65d3 [file] [log] [blame]
//------------------------------------------------------------------------------
// Copyright 2007-2009 Mentor Graphics Corporation
// Copyright 2007-2009 Cadence Design Systems, Inc.
// All Rights Reserved Worldwide
//
// Licensed under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in
// compliance with the License. You may obtain a copy of
// the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in
// writing, software distributed under the License is
// distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
// CONDITIONS OF ANY KIND, either express or implied. See
// the License for the specific language governing
// permissions and limitations under the License.
//------------------------------------------------------------------------------
typedef class ovm_sequence_base;
//------------------------------------------------------------------------------
//
// CLASS: ovm_push_sequencer #(REQ,RSP)
//
//------------------------------------------------------------------------------
class ovm_push_sequencer #(type REQ = ovm_sequence_item,
type RSP = REQ) extends ovm_sequencer_param_base #(REQ, RSP);
typedef ovm_push_sequencer #( REQ , RSP) this_type;
// Port: req_port
//
// The push sequencer requires access to a blocking put interface.
// Continual sequence items, based on the list of available sequences
// loaded into this sequencer, are sent out this port.
ovm_blocking_put_port #(REQ) req_port;
// Function: new
//
// Creates and initializes an instance of this class using the normal
// constructor arguments for <ovm_component>: ~name~ is the name of the
// instance, and ~parent~ is the handle to the hierarchical parent, if any.
function new (string name, ovm_component parent);
super.new(name, parent);
req_port = new ("req_port", this);
endfunction
// Task: run
//
// The push sequencer continuously selects from its list of available
// sequences and sends the next item from the selected sequence out its
// <req_port> using req_port.put(item). Typically, the req_port would be
// connected to the req_export on an instance of an
// <ovm_push_driver #(REQ,RSP)>, which would be responsible for
// executing the item.
task run();
REQ t;
int selected_sequence;
fork
super.run();
forever
begin
do
begin
wait_for_sequences();
selected_sequence = choose_next_request();
if (selected_sequence == -1) begin
wait_for_available_sequence();
end
end while (selected_sequence == -1);
// issue grant
if (selected_sequence >= 0) begin
set_arbitration_completed(arb_sequence_q[selected_sequence].request_id);
arb_sequence_q.delete(selected_sequence);
m_update_lists();
end
m_req_fifo.get(t);
req_port.put(t);
m_wait_for_item_sequence_id = t.get_sequence_id();
m_wait_for_item_transaction_id = t.get_transaction_id();
end // forever begin
join
endtask
protected virtual function int m_find_number_driver_connections();
return(req_port.size());
endfunction
endclass