// Copyright lowRISC contributors.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0

class ${name}_monitor extends dv_base_monitor #(
    .ITEM_T (${name}_item),
    .CFG_T  (${name}_agent_cfg),
    .COV_T  (${name}_agent_cov)
  );
  `uvm_component_utils(${name}_monitor)

  // the base class provides the following handles for use:
  // ${name}_agent_cfg: cfg
  // ${name}_agent_cov: cov
  // uvm_analysis_port #(${name}_item): analysis_port

  `uvm_component_new

  function void build_phase(uvm_phase phase);
    super.build_phase(phase);
  endfunction

  task run_phase(uvm_phase phase);
    super.run_phase(phase);
  endtask

  // collect transactions forever - already forked in dv_base_monitor::run_phase
  virtual protected task collect_trans(uvm_phase phase);
    forever begin
      // TODO: detect event

      // TODO: sample the interface

      // TODO: sample the covergroups

      // TODO: write trans to analysis_port

      // TODO: remove the line below: it is added to prevent zero delay loop in template code
      #1us;
    end
  endtask

endclass
