예제 #1
0
    def register_cg(self, cg: CovergroupModel):
        cg_t: CovergroupModel = None

        # First, see if there's an existing entry
        if cg.name in self.covergroup_type_m.keys():
            # Okay, now we need to do some detailed comparison
            for cg_c in self.covergroup_type_m[cg.name]:
                if cg_c.equals(cg):
                    cg_t = cg_c
                    break

            if cg_t is None:
                # Okay, create a clone of the instance and give it a new name
                cg_t = cg.clone()
                cg_t.srcinfo_inst = None  # Types do not have instance information
                cg_t.finalize()
                self.covergroup_type_m[cg.name].append(cg_t)
                n_cg = len(self.covergroup_type_m[cg.name])

                # Base covergroup type is called 'name', while derivatives
                # are labeled _1, _2, _3
                cg_t.name = cg_t.name + "_" + str(n_cg)

        else:
            # No, nothing here yet
            cg_t = cg.clone()
            cg_t.srcinfo_inst = None  # Types do not have instance information
            cg_t.finalize()
            self.covergroup_type_m[cg.name] = [cg_t]

        # Hook up the instance to the relevant type covergroup
        cg.type_cg = cg_t
        cg_t.cg_inst_l.append(cg)
예제 #2
0
    def test_coverpoint_array_bin(self):

        cg = CovergroupModel("cg")

        a = 0
        a_cp = CoverpointModel(ExprRefModel(lambda: a, 32, False), "a_cp",
                               CoverageOptionsModel())
        cg.add_coverpoint(a_cp)

        bins = a_cp.add_bin_model(CoverpointBinArrayModel("a", 0, 15))

        cg.finalize()

        for i in range(8):
            a = i
            cg.sample()

        for i in range(16):
            if (i < 8):
                self.assertEqual(a_cp.get_bin_hits(i), 1)
            else:
                self.assertEqual(a_cp.get_bin_hits(i), 0)

        self.assertEqual(a_cp.get_coverage(), 50.0)
        self.assertEqual(cg.get_coverage(), 50.0)
예제 #3
0
    def register_cg(self, cg : CovergroupModel):
        cg_t : CovergroupModel = None
        
        # First, see if there's an existing entry
        if cg.name in self.covergroup_type_m.keys():
            # Okay, now we need to do some detailed comparison
            # Covergroups with the same base typename can have different
            # content if constructor parameters are used to customize content.
            for cg_c in self.covergroup_type_m[cg.name]:
                if cg_c.equals(cg):
                    cg_t = cg_c
                    break
                
            if cg_t is None:
                # The new type does not have 
                # Okay, create a clone of the instance and give it a new name
                cg_t = cg.clone()
                # Type covergroups have their coverage data directly provided
                # Clear out the 'target' fields of coverpoints to ensure this happens
                for cp in cg_t.coverpoint_l:
                    cp.target = None
                    
                cg_t.srcinfo_inst = None # Types do not have instance information
                cg_t.finalize()
                self.covergroup_type_m[cg.name].append(cg_t)
                n_cg = len(self.covergroup_type_m[cg.name])

                # Base covergroup type is called 'name', while derivatives
                # are labeled _1, _2, _3                
                cg_t.name = cg_t.name + "_" + str(n_cg)
                
        else:
            # No, nothing here yet. Create a clone of this instance
            # covergroup to use as a covergroup type
            cg_t = cg.clone()
            
            # Type covergroups have their coverage data directly provided
            # Clear out the 'target' fields of coverpoints to ensure this happens
            for cp in cg_t.coverpoint_l:
                cp.target = None

            cg_t.srcinfo_inst = None # Types do not have instance information
            cg_t.finalize()
            self.covergroup_type_m[cg.name] = [cg_t]
            
        # Hook up the instance to the relevant type covergroup
        cg.type_cg = cg_t
        cg_t.cg_inst_l.append(cg)
예제 #4
0
    def test_coverpoint_bins(self):
        stim = FieldCompositeModel("stim", True)
        f = FieldScalarModel("a", 16, False, True)
        stim.add_field(f)
        f2 = FieldScalarModel("b", 16, False, True)
        stim.add_field(f2)
        
        cg = CovergroupModel("cg")
        
        cp = CoverpointModel(ExprFieldRefModel(f), "cp1",
                             CoverageOptionsModel())
        cg.add_coverpoint(cp)
        cp.add_bin_model(CoverpointBinArrayModel("bn1", 0, 1, 16))
        cp.add_bin_model(CoverpointBinCollectionModel.mk_collection("bn2", RangelistModel([
            [17,65535-16-1]
            ]), 16))
        cp.add_bin_model(CoverpointBinArrayModel("bn3", 0, 65535-16, 65535))
        
        cp2 = CoverpointModel(ExprFieldRefModel(f2), "cp2",
                              CoverageOptionsModel())
        cg.add_coverpoint(cp2)
        bn = CoverpointBinArrayModel("cp", 0, 1, 16)
        cp2.add_bin_model(bn)
        
        gen = GeneratorModel("top")
        gen.add_field(stim)
        gen.add_covergroup(cg)
        
        gen.finalize()

        # Need a special randomizer to deal with generators        
        r = Randomizer()

        count = 0        
        for i in range(1000):
            r.do_randomize([gen])
            cg.sample()
            count += 1
            cov = cg.get_coverage()
            if cov == 100:
                break
            
        self.assertEqual(cg.get_coverage(), 100)
        # Ensure that we converge relatively quickly
        self.assertLessEqual(count, 64)
예제 #5
0
    def test_smoke(self):
        stim = FieldCompositeModel("stim", True)
        f = FieldScalarModel("a", 16, False, True)
        stim.add_field(f)
        f2 = FieldScalarModel("b", 16, False, True)
        stim.add_field(f2)

        cg = CovergroupModel("cg")

        cp = CoverpointModel(ExprFieldRefModel(f), "cp1",
                             CoverageOptionsModel())
        cg.add_coverpoint(cp)
        bn = CoverpointBinArrayModel("cp", 1, 16)
        cp.add_bin_model(bn)

        cp2 = CoverpointModel(ExprFieldRefModel(f2), "cp2",
                              CoverageOptionsModel())
        cg.add_coverpoint(cp2)
        bn = CoverpointBinArrayModel("cp", 1, 16)
        cp2.add_bin_model(bn)

        gen = GeneratorModel("top")
        gen.add_field(stim)
        gen.add_covergroup(cg)

        gen.finalize()

        # Need a special randomizer to deal with generators
        r = Randomizer(RandState(0))
        randstate = RandState(0)

        count = 0
        for i in range(1000):
            r.do_randomize(randstate, SourceInfo("", -1), [gen])
            cg.sample()
            count += 1
            cov = cg.get_coverage()
            if cov == 100:
                break

        self.assertEqual(cg.get_coverage(), 100)
        # Ensure that we converge relatively quickly
        self.assertLessEqual(count, 32)
예제 #6
0
    def test_cross(self):
        stim = FieldCompositeModel("stim", True)
        f = FieldScalarModel("a", 16, False, True)
        stim.add_field(f)
        f2 = FieldScalarModel("b", 16, False, True)
        stim.add_field(f2)

        cg = CovergroupModel("cg")

        cp = CoverpointModel(ExprFieldRefModel(f), "cp1")
        cg.add_coverpoint(cp)
        bn = CoverpointBinArrayModel("cp", 1, 16)
        cp.add_bin_model(bn)

        cp2 = CoverpointModel(ExprFieldRefModel(f2), "cp2")
        cg.add_coverpoint(cp2)
        bn = CoverpointBinArrayModel("cp", 1, 16)
        cp2.add_bin_model(bn)

        cr = CoverpointCrossModel("aXb")
        cr.add_coverpoint(cp)
        cr.add_coverpoint(cp2)
        cg.add_coverpoint(cr)

        gen = GeneratorModel("top")
        gen.add_field(stim)
        gen.add_covergroup(cg)

        gen.finalize()

        # Need a special randomizer to deal with generators
        r = Randomizer()

        count = 0
        for i in range(1000):
            r.do_randomize([gen])
            cg.sample()
            count += 1
            cov = cg.get_coverage()
            print("Coverage: (" + str(i) + ") " + str(cov))
            if cov == 100:
                break

        self.assertEqual(cg.get_coverage(), 100)
        # Ensure that we converge relatively quickly
        self.assertLessEqual(count, (256 + 16 + 16))