• uvm_sqr_ifs——TLM1事务级建模方法(四)


      与uvm_tlm_if_base 一样,这个类也没有派生自任何类,定义了如下几个接口:get_next_item, try_next_item, item_done, get, peek, put, put_response. 

    `define UVM_SEQ_ITEM_TASK_ERROR "Sequencer interface task not implemented"
    `define UVM_SEQ_ITEM_FUNCTION_ERROR "Sequencer interface function not implemented"
    
    //------------------------------------------------------------------------------
    //
    // CLASS: uvm_sqr_if_base #(REQ,RSP)
    //
    // This class defines an interface for sequence drivers to communicate with
    // sequencers. The driver requires the interface via a port, and the sequencer
    // implements it and provides it via an export.
    //
    //------------------------------------------------------------------------------
    
    virtual class uvm_sqr_if_base #(type T1=uvm_object, T2=T1);
    
      // Task: get_next_item
      //
      // Retrieves the next available item from a sequence.  The call will block
      // until an item is available.  The following steps occur on this call:
      //
      // 1 - Arbitrate among requesting, unlocked, relevant sequences - choose the
      //     highest priority sequence based on the current sequencer arbitration
      //     mode. If no sequence is available, wait for a requesting unlocked
      //     relevant sequence,  then re-arbitrate.
      // 2 - The chosen sequence will return from wait_for_grant
      // 3 - The chosen sequence <uvm_sequence_base::pre_do> is called
      // 4 - The chosen sequence item is randomized
      // 5 - The chosen sequence <uvm_sequence_base::post_do> is called
      // 6 - Return with a reference to the item
      //
      // Once <get_next_item> is called, <item_done> must be called to indicate the
      // completion of the request to the sequencer.  This will remove the request
      // item from the sequencer FIFO.
    
      virtual task get_next_item(output T1 t);
        uvm_report_error("get_next_item", `UVM_SEQ_ITEM_TASK_ERROR, UVM_NONE);
      endtask
     
    
      // Task: try_next_item
      //
      // Retrieves the next available item from a sequence if one is available.
      // Otherwise, the function returns immediately with request set to ~null~.
      // The following steps occur on this call:
      //
      // 1 - Arbitrate among requesting, unlocked, relevant sequences - choose the
      //     highest priority sequence based on the current sequencer arbitration
      //     mode. If no sequence is available, return ~null~.
      // 2 - The chosen sequence will return from wait_for_grant
      // 3 - The chosen sequence <uvm_sequence_base::pre_do> is called
      // 4 - The chosen sequence item is randomized
      // 5 - The chosen sequence <uvm_sequence_base::post_do> is called
      // 6 - Return with a reference to the item
      //
      // Once <try_next_item> is called, <item_done> must be called to indicate the
      // completion of the request to the sequencer.  This will remove the request
      // item from the sequencer FIFO.
    
      virtual task try_next_item(output T1 t);
        uvm_report_error("try_next_item", `UVM_SEQ_ITEM_TASK_ERROR, UVM_NONE);
      endtask
    
    
      // Function: item_done
      //
      // Indicates that the request is completed to the sequencer.  Any 
      // <uvm_sequence_base::wait_for_item_done>
      // calls made by a sequence for this item will return.
      //
      // The current item is removed from the sequencer FIFO.
      //
      // If a response item is provided, then it will be sent back to the requesting
      // sequence. The response item must have its sequence ID and transaction ID
      // set correctly, using the <uvm_sequence_item::set_id_info> method:
      //
      //|  rsp.set_id_info(req);
      //
      // Before <item_done> is called, any calls to peek will retrieve the current
      // item that was obtained by <get_next_item>.  After <item_done> is called, peek
      // will cause the sequencer to arbitrate for a new item.
    
      virtual function void item_done(input T2 t = null);
        uvm_report_error("item_done", `UVM_SEQ_ITEM_FUNCTION_ERROR, UVM_NONE);
      endfunction
    
      
      // Task: wait_for_sequences
      //
      // Waits for a sequence to have a new item available. The default
      // implementation in the sequencer calls
      //  <uvm_wait_for_nba_region>.
      // User-derived sequencers
      // may override its <wait_for_sequences> implementation to perform some other
      // application-specific implementation.
    
      virtual task wait_for_sequences();
        uvm_report_error("wait_for_sequences", `UVM_SEQ_ITEM_TASK_ERROR, UVM_NONE);
      endtask
    
    
      // Function: has_do_available
      //
      // Indicates whether a sequence item is available for immediate processing.
      // Implementations should return 1 if an item is available, 0 otherwise. 
    
      virtual function bit has_do_available();
        uvm_report_error("has_do_available", `UVM_SEQ_ITEM_FUNCTION_ERROR, UVM_NONE);
        return 0;
      endfunction
    
    
      //-----------------------
      // uvm_tlm_blocking_slave_if
      //-----------------------
    
      // Task: get
      //
      // Retrieves the next available item from a sequence.  The call blocks until
      // an item is available. The following steps occur on this call:
      //
      // 1 - Arbitrate among requesting, unlocked, relevant sequences - choose the
      //     highest priority sequence based on the current sequencer arbitration
      //     mode. If no sequence is available, wait for a requesting unlocked
      //     relevant sequence, then re-arbitrate.
      // 2 - The chosen sequence will return from <uvm_sequence_base::wait_for_grant>
      // 3 - The chosen sequence <uvm_sequence_base::pre_do> is called
      // 4 - The chosen sequence item is randomized
      // 5 - The chosen sequence <uvm_sequence_base::post_do> is called
      // 6 - Indicate <item_done> to the sequencer
      // 7 - Return with a reference to the item
      //
      // When get is called, <item_done> may not be called.  A new item can be
      // obtained by calling get again, or a response may be sent using either
      // <put>, or uvm_driver::rsp_port.write().
    
      virtual task get(output T1 t);
        uvm_report_error("get", `UVM_SEQ_ITEM_TASK_ERROR, UVM_NONE);
      endtask
    
      // Task: peek
      //
      // Returns the current request item if one is in the sequencer FIFO.  If no
      // item is in the FIFO, then the call will block until the sequencer has a new
      // request. The following steps will occur if the sequencer FIFO is empty:
      //
      // 1 - Arbitrate among requesting, unlocked, relevant sequences - choose the
      // highest priority sequence based on the current sequencer arbitration mode.
      // If no sequence is available, wait for a requesting unlocked relevant
      // sequence, then re-arbitrate.
      //
      // 2 - The chosen sequence will return from <uvm_sequence_base::wait_for_grant>
      // 3 - The chosen sequence <uvm_sequence_base::pre_do> is called
      // 4 - The chosen sequence item is randomized
      // 5 - The chosen sequence <uvm_sequence_base::post_do> is called
      //
      // Once a request item has been retrieved and is in the sequencer FIFO,
      // subsequent calls to peek will return the same item.  The item will stay in
      // the FIFO until either get or <item_done> is called.
    
      virtual task peek(output T1 t);
        uvm_report_error("peek", `UVM_SEQ_ITEM_TASK_ERROR, UVM_NONE);
      endtask
    
    
      // Task: put
      //
      // Sends a response back to the sequence that issued the request. Before the
      // response is put, it must have its sequence ID and transaction ID set to
      // match the request.  This can be done using the
      // <uvm_sequence_item::set_id_info> call:
      //
      //   rsp.set_id_info(req);
      //
      // While this is a task, it will not consume time (including delta cycles).
      // The response will be put into the
      // sequence response queue or it will be sent to the
      // sequence response handler.
      //
       
    
      virtual task put(input T2 t);
        uvm_report_error("put", `UVM_SEQ_ITEM_TASK_ERROR, UVM_NONE);
      endtask
    
    
      // Function: put_response
      //
      // Sends a response back to the sequence that issued the request. Before the
      // response is put, it must have its sequence ID and transaction ID set to
      // match the request.  This can be done using the
      // <uvm_sequence_item::set_id_info> call:
      //
      //   rsp.set_id_info(req);
      //
    
      virtual function void put_response(input T2 t);
        uvm_report_error("put_response", `UVM_SEQ_ITEM_FUNCTION_ERROR, UVM_NONE);
      endfunction
    
      // Function: disable_auto_item_recording
      //
      // By default, item recording is performed automatically when
      // get_next_item() and item_done() are called.
      // However, this works only for simple, in-order, blocking transaction
      // execution. For pipelined and out-of-order transaction execution, the
      // driver must turn off this automatic recording and call
      // <uvm_transaction::accept_tr>, <uvm_transaction::begin_tr>
      // and <uvm_transaction::end_tr> explicitly at appropriate points in time.
      //
      // This methods be called at the beginning of the driver's ~run_phase()~ method.
      // Once disabled, automatic recording cannot be re-enabled.
      //
      // For backward-compatibility, automatic item recording can be globally
      // turned off at compile time by defining UVM_DISABLE_AUTO_ITEM_RECORDING
    
      virtual function void disable_auto_item_recording();
        uvm_report_error("disable_auto_item_recording", `UVM_SEQ_ITEM_FUNCTION_ERROR, UVM_NONE);
      endfunction
      
      // Function: is_auto_item_recording_enabled
      //
      // Return TRUE if automatic item recording is enabled for this port instance.
    
      virtual function bit is_auto_item_recording_enabled();
        uvm_report_error("is_auto_item_recording_enabled", `UVM_SEQ_ITEM_FUNCTION_ERROR, UVM_NONE);
        return 0;
      endfunction
    endclass
  • 相关阅读:
    idea 缺失右侧maven窗口
    SpringCloud
    Java面试题——Java基础
    json对象、json字符串的区别和相互转换
    java中的 private Logger log=Logger.getLogger(this.getClass());
    http网络编程
    ansible和helm
    template模板
    http中get和post请求方式
    session和cookie
  • 原文地址:https://www.cnblogs.com/dpc525/p/8078646.html
Copyright © 2020-2023  润新知