| // Copyright lowRISC contributors. | 
 | // Licensed under the Apache License, Version 2.0, see LICENSE for details. | 
 | // SPDX-License-Identifier: Apache-2.0 | 
 |  | 
 | /** | 
 |  * Covergoups that are dependent on run-time parameters that may be available | 
 |  * only in build_phase can be defined here | 
 |  * Covergroups may also be wrapped inside helper classes if needed. | 
 |  */ | 
 |  | 
 | // Wrapper class for peripheral clock covergroup. | 
 | class clkmgr_peri_cg_wrap; | 
 |   // This covergroup collects signals affecting peripheral clock. | 
 |   covergroup peri_cg(string name) with function sample (bit enable, bit ip_clk_en, bit scanmode); | 
 |     option.name = name; | 
 |     option.per_instance = 1; | 
 |  | 
 |     csr_enable_cp: coverpoint enable; | 
 |     ip_clk_en_cp: coverpoint ip_clk_en; | 
 |     scanmode_cp: coverpoint scanmode; | 
 |  | 
 |     peri_cross: cross csr_enable_cp, ip_clk_en_cp, scanmode_cp; | 
 |   endgroup | 
 |  | 
 |   function new(string name); | 
 |     peri_cg = new(name); | 
 |   endfunction | 
 |  | 
 |   function void sample (bit enable, bit ip_clk_en, bit scanmode); | 
 |     peri_cg.sample(enable, ip_clk_en, scanmode); | 
 |   endfunction | 
 | endclass | 
 |  | 
 | // Wrapper class for transactional unit clock covergroup. | 
 | class clkmgr_trans_cg_wrap; | 
 |   // This covergroup collects signals affecting transactional clock. | 
 |   covergroup trans_cg( | 
 |       string name | 
 |   ) with function sample ( | 
 |       bit hint, bit ip_clk_en, bit scanmode, bit idle | 
 |   ); | 
 |     option.name = name; | 
 |     option.per_instance = 1; | 
 |  | 
 |     csr_hint_cp: coverpoint hint; | 
 |     ip_clk_en_cp: coverpoint ip_clk_en; | 
 |     scanmode_cp: coverpoint scanmode; | 
 |     idle_cp: coverpoint idle; | 
 |  | 
 |     trans_cross: cross csr_hint_cp, ip_clk_en_cp, scanmode_cp, idle_cp{ | 
 |       ignore_bins ignore = trans_cross with (idle_cp == 0 && ip_clk_en_cp == 0); | 
 |     } | 
 |   endgroup | 
 |  | 
 |   function new(string name); | 
 |     trans_cg = new(name); | 
 |   endfunction | 
 |  | 
 |   function void sample (bit hint, bit ip_clk_en, bit scanmode, bit idle); | 
 |     trans_cg.sample(hint, ip_clk_en, scanmode, idle); | 
 |   endfunction | 
 | endclass | 
 |  | 
 | // Wrapper class for frequency measurement covergroup. | 
 | class freq_measure_cg_wrap; | 
 |   // This covergroup collects outcomes of clock frequency measurements. | 
 |   covergroup freq_measure_cg( | 
 |       string name | 
 |   ) with function sample ( | 
 |       bit okay, bit slow, bit fast, bit timeout | 
 |   ); | 
 |     option.name = name; | 
 |     option.per_instance = 1; | 
 |  | 
 |     okay_cp: coverpoint okay; | 
 |     slow_cp: coverpoint slow; | 
 |     fast_cp: coverpoint fast; | 
 |     timeout_cp: coverpoint timeout; | 
 |   endgroup | 
 |  | 
 |   function new(string name); | 
 |     freq_measure_cg = new(name); | 
 |   endfunction | 
 |  | 
 |   function void sample (bit okay, bit slow, bit fast, bit timeout); | 
 |     freq_measure_cg.sample(okay, slow, fast, timeout); | 
 |   endfunction | 
 | endclass | 
 |  | 
 | class clkmgr_env_cov extends cip_base_env_cov #( | 
 |   .CFG_T(clkmgr_env_cfg) | 
 | ); | 
 |   `uvm_component_utils(clkmgr_env_cov) | 
 |  | 
 |   // the base class provides the following handles for use: | 
 |   // clkmgr_env_cfg: cfg | 
 |  | 
 |   // These covergroups collect signals affecting peripheral clocks. | 
 |   clkmgr_peri_cg_wrap  peri_cg_wrap[NUM_PERI]; | 
 |  | 
 |   // These covergroups collect signals affecting transactional clocks. | 
 |   clkmgr_trans_cg_wrap trans_cg_wrap[NUM_TRANS]; | 
 |  | 
 |   // These covergroups collect outcomes of clock frequency measurements. | 
 |   freq_measure_cg_wrap freq_measure_cg_wrap[5]; | 
 |  | 
 |   // This embeded covergroup collects coverage for the external clock functionality. | 
 |   covergroup extclk_cg with function sample ( | 
 |       bit csr_sel, bit csr_low_speed, bit hw_debug_en, bit byp_req, bit scanmode | 
 |   ); | 
 |     csr_sel_cp: coverpoint csr_sel; | 
 |     csr_low_speed_cp: coverpoint csr_low_speed; | 
 |     hw_debug_en_cp: coverpoint hw_debug_en; | 
 |     byp_req_cp: coverpoint byp_req; | 
 |     scanmode_cp: coverpoint scanmode; | 
 |  | 
 |     extclk_cross: cross csr_sel_cp, csr_low_speed_cp, hw_debug_en_cp, byp_req_cp, scanmode_cp; | 
 |   endgroup | 
 |  | 
 |   function new(string name, uvm_component parent); | 
 |     super.new(name, parent); | 
 |     // The peripheral covergoups. | 
 |     foreach (peri_cg_wrap[i]) begin | 
 |       clkmgr_env_pkg::peri_e peri = clkmgr_env_pkg::peri_e'(i); | 
 |       peri_cg_wrap[i] = new(peri.name); | 
 |     end | 
 |     // The transactional covergroups. | 
 |     foreach (trans_cg_wrap[i]) begin | 
 |       clkmgr_env_pkg::trans_e trans = clkmgr_env_pkg::trans_e'(i); | 
 |       trans_cg_wrap[i] = new(trans.name); | 
 |     end | 
 |     foreach (ExpectedCounts[i]) begin | 
 |       clk_mesr_e clk_mesr = clk_mesr_e'(i); | 
 |       freq_measure_cg_wrap[i] = new(clk_mesr.name); | 
 |     end | 
 |     extclk_cg = new(); | 
 |   endfunction : new | 
 |  | 
 |   virtual function void build_phase(uvm_phase phase); | 
 |     super.build_phase(phase); | 
 |     // [or instantiate covergroups here] | 
 |     // Please instantiate sticky_intr_cov array of objects for all interrupts that are sticky | 
 |     // See cip_base_env_cov for details | 
 |   endfunction | 
 |  | 
 | endclass |