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)
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)
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)
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)
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)
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))