fvutils / pyvsc

Python packages providing a library for Verification Stimulus and Coverage
https://fvutils.github.io/pyvsc
Apache License 2.0
113 stars 26 forks source link

cross coverage using enum classes #57

Closed Divya2030 closed 3 years ago

Divya2030 commented 3 years ago

Hi @mballance, I am writing small program to generate cross coverage using Coverage enum classes, but no bin is hitting in cross coverage while sampling.

from enum import IntEnum, IntFlag, Flag, auto, Enum
import vsc
from vsc_test_case import VscTestCase
import numpy as g 

def test_bin_names_int_enum():

        class my_e_1(IntEnum):
            A = auto()
            B = auto()

        class my_e_2(IntEnum):
            C = auto()
            D = auto()

        @vsc.covergroup
        class my_cg(object):

            def __init__(self, v1,v2):

                self.cp1 = vsc.coverpoint(v1, cp_t=vsc.enum_t(my_e_1))
                self.cp2 = vsc.coverpoint(v2, cp_t=vsc.enum_t(my_e_2))
                self.cp1X2 = vsc.cross([self.cp1, self.cp2])

        for i in range(16):
            A=g.random.rand(2)
            B=g.random.rand(2)
            C=g.random.rand(2)
            D=g.random.rand(2)
            v1 = my_e_1.A                
            v2 = my_e_2.C                
            cg = my_cg(lambda:v1,lambda:v2)
            cg.sample()
            v1 = my_e_1.B
            v2 = my_e_2.D                
            cg.sample()

          #  self.assertEqual(cg.cp1.get_model().get_bin_name(0), "my_e_1.A")
          #  self.assertEqual(cg.cp2.get_model().get_bin_name(0), "my_e_2.C")
           # self.assertEqual(cg.cp1.get_model().get_bin_name(1), "my_e_1.B")
           # self.assertEqual(cg.cp2.get_model().get_bin_name(1), "my_e_2.D")
            print(">================== Text Report ======================")
            print("Report:\n" + vsc.get_coverage_report(True))
            vsc.write_coverage_db("cov.xml")

test_bin_names_int_enum()

CROSS coverage is always zero:

TYPE my_cg : 66.670000%
    CVP cp1 : 100.000000%
    Bins:
        my_e_1.A : 16
        my_e_1.B : 16
    CVP cp2 : 100.000000%
    Bins:
        my_e_2.C : 16
        my_e_2.D : 16
    CROSS cp1X2 : 0.000000%
    Bins:
        <my_e_1.A,my_e_2.C> : 0
        <my_e_1.A,my_e_2.D> : 0
        <my_e_1.B,my_e_2.C> : 0
        <my_e_1.B,my_e_2.D> : 0
    INST my_cg : 66.670000%
        CVP cp1 : 100.000000%
        Bins:
            my_e_1.A : 1
            my_e_1.B : 1
        CVP cp2 : 100.000000%
        Bins:
            my_e_2.C : 1
            my_e_2.D : 1
        CROSS cp1X2 : 0.000000%
        Bins:
            <my_e_1.A,my_e_2.C> : 0
            <my_e_1.A,my_e_2.D> : 0
            <my_e_1.B,my_e_2.C> : 0
            <my_e_1.B,my_e_2.D> : 0
    INST my_cg_1 : 66.670000%
        CVP cp1 : 100.000000%
        Bins:
            my_e_1.A : 1
            my_e_1.B : 1
        CVP cp2 : 100.000000%
        Bins:
            my_e_2.C : 1
            my_e_2.D : 1
        CROSS cp1X2 : 0.000000%
        Bins:
            <my_e_1.A,my_e_2.C> : 0
            <my_e_1.A,my_e_2.D> : 0
            <my_e_1.B,my_e_2.C> : 0
            <my_e_1.B,my_e_2.D> : 0
    INST my_cg_2 : 66.670000%
        CVP cp1 : 100.000000%
        Bins:
            my_e_1.A : 1
            my_e_1.B : 1
        CVP cp2 : 100.000000%
        Bins:
            my_e_2.C : 1
            my_e_2.D : 1
        CROSS cp1X2 : 0.000000%
        Bins:
            <my_e_1.A,my_e_2.C> : 0
            <my_e_1.A,my_e_2.D> : 0
            <my_e_1.B,my_e_2.C> : 0
            <my_e_1.B,my_e_2.D> : 0

Screenshot from 2021-03-09 10-45-07

mballance commented 3 years ago

Hi @Divyanirankari, Thank you for the testcase. Made tracking the issue down much easier. Turns out there was an issue with enum bins specifically. I've corrected that in the 0.3.0 release, and cross coverage is now being recorded. I'll leave this open until you're able to confirm.

Best Regards, Matthew

Divya2030 commented 3 years ago

Thanks it works