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

% if is_cip:
class ${name}_env extends cip_base_env #(
% else:
class ${name}_env extends dv_base_env #(
% endif
    .CFG_T              (${name}_env_cfg),
    .COV_T              (${name}_env_cov),
    .VIRTUAL_SEQUENCER_T(${name}_virtual_sequencer),
    .SCOREBOARD_T       (${name}_scoreboard)
  );
  `uvm_component_utils(${name}_env)
% if env_agents != []:

% for agent in env_agents:
  ${agent}_agent m_${agent}_agent;
% endfor
% endif

  `uvm_component_new

  function void build_phase(uvm_phase phase);
    super.build_phase(phase);
% for agent in env_agents:
    // create components
    m_${agent}_agent = ${agent}_agent::type_id::create("m_${agent}_agent", this);
    uvm_config_db#(${agent}_agent_cfg)::set(this, "m_${agent}_agent*", "cfg", cfg.m_${agent}_agent_cfg);
% endfor
  endfunction

  function void connect_phase(uvm_phase phase);
    super.connect_phase(phase);
% if env_agents != []:
    if (cfg.en_scb) begin
% endif
% for agent in env_agents:
      m_${agent}_agent.monitor.analysis_port.connect(scoreboard.${agent}_fifo.analysis_export);
% endfor
% if env_agents != []:
    end
% endif
% for agent in env_agents:
    if (cfg.is_active && cfg.m_${agent}_agent_cfg.is_active) begin
      virtual_sequencer.${agent}_sequencer_h = m_${agent}_agent.sequencer;
    end
% endfor
  endfunction

endclass
