module test_pmp_coverage import cvw::*; #(parameter cvw_t P) (input clk);

// Ensure the covergroup is defined correctly
covergroup cg_priv_mode @(posedge clk);
    coverpoint dut.core.ifu.PrivilegeModeW {
        bins user   = {2'b00};
        bins superv = {2'b01};
        bins hyperv = {2'b10};
        bins mach   = {2'b11};
    }
endgroup

covergroup cg_PMPConfig @(posedge clk);
    coverpoint dut.core.ifu.PMPCFG_ARRAY_REGW[0][0] {
        bins ones    = {1};
        bins zeros = {0};
    }
endgroup


function bit [1:0] getPMPConfigSlice(int index);
    return dut.core.ifu.immu.immu.PMPCFG_ARRAY_REGW[index][4:3];
endfunction

//if (P.PMP_ENTRIES > 0) begin : pmp
    covergroup cg_pmpcfg_mode @(posedge clk);
            coverpoint dut.core.ifu.immu.immu.PMPCFG_ARRAY_REGW[0][4:3] {
                bins off   = {2'b00};
                bins tor   = {2'b01};
                bins na4   = {2'b10};
                bins napot = {2'b11};
            }


            coverpoint dut.core.ifu.immu.immu.PMPCFG_ARRAY_REGW[1][4:3] {
                bins off   = {2'b00};
                bins tor   = {2'b01};
                bins na4   = {2'b10};
                bins napot = {2'b11};
            }

            coverpoint dut.core.ifu.immu.immu.PMPCFG_ARRAY_REGW[2][4:3] {
                bins off   = {2'b00};
                bins tor   = {2'b01};
                bins na4   = {2'b10};
                bins napot = {2'b11};
            }

            coverpoint dut.core.ifu.immu.immu.PMPCFG_ARRAY_REGW[3][4:3] {
                bins off   = {2'b00};
                bins tor   = {2'b01};
                bins na4   = {2'b10};
                bins napot = {2'b11};
            }

            coverpoint dut.core.ifu.immu.immu.PMPCFG_ARRAY_REGW[4][4:3] {
                bins off   = {2'b00};
                bins tor   = {2'b01};
                bins na4   = {2'b10};
                bins napot = {2'b11};
            }

            coverpoint dut.core.ifu.immu.immu.PMPCFG_ARRAY_REGW[5][4:3] {
                bins off   = {2'b00};
                bins tor   = {2'b01};
                bins na4   = {2'b10};
                bins napot = {2'b11};
            }

            coverpoint dut.core.ifu.immu.immu.PMPCFG_ARRAY_REGW[6][4:3] {
                bins off   = {2'b00};
                bins tor   = {2'b01};
                bins na4   = {2'b10};
                bins napot = {2'b11};
            }

            coverpoint dut.core.ifu.immu.immu.PMPCFG_ARRAY_REGW[7][4:3] {
                bins off   = {2'b00};
                bins tor   = {2'b01};
                bins na4   = {2'b10};
                bins napot = {2'b11};
            }
    endgroup
//end


// Ensure that the instantiation and sampling of covergroups are within the correct procedural context
initial begin
    cg_priv_mode privmodeCG = new();  // Instantiate the privilege mode covergroup
    cg_PMPConfig pmpconfigCG = new(); // Instantiate the PMP config covergroup
    cg_pmpcfg_mode pmpcfgmodeCG = new();

    forever begin
        @(posedge clk) begin
            privmodeCG.sample();  // Sample the privilege mode covergroup
            pmpconfigCG.sample(); // Sample the PMP config covergroupi
	    pmpcfgmodeCG.sample();
        end
    end
end


endmodule