Source code for uvm.seq.uvm_sequence

#//----------------------------------------------------------------------
#//   Copyright 2007-2011 Mentor Graphics Corporation
#//   Copyright 2007-2010 Cadence Design Systems, Inc.
#//   Copyright 2010 Synopsys, Inc.
#//   Copyright 2013 Cisco Systems, Inc.
#//   Copyright 2019-2020 Tuomas Poikela (tpoikela)
#//   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.
#//----------------------------------------------------------------------

from .uvm_sequence_base import UVMSequenceBase
from ..macros.uvm_message_defines import uvm_fatal


[docs]class UVMSequence(UVMSequenceBase): """ The UVMSequence class provides the interfaces necessary in order to create streams of sequence items and/or other sequences. """ def __init__(self, name="uvm_sequence"): """ Variable: req The sequence contains a field of the request type called req. The user can use this field, if desired, or create another field to use. The default `do_print` will print this field. Variable: rsp The sequence contains a field of the response type called rsp. The user can use this field, if desired, or create another field to use. The default `do_print` will print this field. Creates and initializes a new sequence object. Args: name: """ UVMSequenceBase.__init__(self, name) self.req = None self.rsp = None self.param_sequencer = None # // Function: send_request # // # // This method will send the request item to the sequencer, which will forward # // it to the driver. If the rerandomize bit is set, the item will be # // randomized before being sent to the driver. The send_request function may # // only be called after <uvm_sequence_base::wait_for_grant> returns. # # function void send_request(uvm_sequence_item request, bit rerandomize = 0) # REQ m_request # # if (m_sequencer == null) begin # uvm_report_fatal("SSENDREQ", "Null m_sequencer reference", UVM_NONE) # end # if (!$cast(m_request, request)) begin # uvm_report_fatal("SSENDREQ", "Failure to cast uvm_sequence_item to request", UVM_NONE) # end # m_sequencer.send_request(this, m_request, rerandomize) # endfunction # // Function: get_current_item # // # // Returns the request item currently being executed by the sequencer. If the # // sequencer is not currently executing an item, this method will return ~null~. # // # // The sequencer is executing an item from the time that get_next_item or peek # // is called until the time that get or item_done is called. # // # // Note that a driver that only calls get will never show a current item, # // since the item is completed at the same time as it is requested. # # function REQ get_current_item() # if (!$cast(param_sequencer, m_sequencer)) # uvm_report_fatal("SGTCURR", "Failure to cast m_sequencer to the parameterized sequencer", UVM_NONE) # return (param_sequencer.get_current_item()) # endfunction # // Task: get_response # // # // By default, sequences must retrieve responses by calling get_response. # // If no transaction_id is specified, this task will return the next response # // sent to this sequence. If no response is available in the response queue, # // the method will block until a response is received. # // # // If a transaction_id is parameter is specified, the task will block until # // a response with that transaction_id is received in the response queue. # // # // The default size of the response queue is 8. The get_response method must # // be called soon enough to avoid an overflow of the response queue to prevent # // responses from being dropped. # // # // If a response is dropped in the response queue, an error will be reported # // unless the error reporting is disabled via # // set_response_queue_error_report_disabled.
[docs] async def get_response(self, response, transaction_id=-1): """ Args: response: transaction_id: """ if response is None: uvm_fatal("RESP IS NONE", "response arg must be an empty list") rsp = [] await self.get_base_response(rsp, transaction_id) response.append(rsp[0])
[docs] def put_response(self, response_item): """ Internal method. Args: response_item (UVMSequenceItem): Response item """ #response #if (!$cast(response, response_item)) begin # uvm_report_fatal("PUTRSP", "Failure to cast response in put_response", UVM_NONE) self.put_base_response(response_item)
[docs] def do_print(self, printer): """ Function- do_print Args: printer (UVMPrinter): Printer used for printing """ super().do_print(printer) printer.print_object("req", self.req) printer.print_object("rsp", self.rsp)