Esempio n. 1
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",
                             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)

        cr = CoverpointCrossModel("aXb", CoverageOptionsModel())
        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(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()
            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))
Esempio n. 2
0
    def test_smoke(self):
        obj = FieldCompositeModel("obj")
        a = obj.add_field(FieldScalarModel("a", 8, False, True))
        b = obj.add_field(FieldScalarModel("a", 8, False, True))
        obj.add_constraint(
            ConstraintBlockModel("c", [
                ConstraintExprModel(
                    ExprBinModel(a.expr(), BinExprType.Lt, b.expr()))
            ]))

        rand = Randomizer(RandState(0))
        randstate = RandState(0)

        rand.do_randomize(randstate, SourceInfo("", -1), [obj])

        self.assertLess(a.val, b.val)
Esempio n. 3
0
def randomize(*args, **kwargs):
    """Randomize a list of variables"""
    frame = inspect.stack()[1]
    fields = []
    for v in args:
        if hasattr(v, "get_model"):
            fields.append(v.get_model())
        else:
            raise Exception("Parameter \"" + str(v) +
                            " to randomize is not a vsc object")

    debug = 0
    if "debug" in kwargs.keys():
        debug = kwargs["debug"]

    solve_fail_debug = False
    if "solve_fail_debug" in kwargs:
        solve_fail_debug = kwargs["solve_fail_debug"]

    randstate = None
    if "randstate" in kwargs:
        randstate = kwargs["randstate"]
    else:
        randstate = RandState(random.randint(0, 0xFFFFFFFF))

    Randomizer.do_randomize(randstate,
                            SourceInfo(frame.filename, frame.lineno),
                            fields,
                            solve_fail_debug=solve_fail_debug,
                            debug=debug)
Esempio n. 4
0
    def test_incr(self):
        obj = FieldCompositeModel("obj")
        arr = obj.add_field(
            FieldArrayModel(
                "arr",
                None,  # type_t
                True,  # is_scalar
                None,  # not an enum-type list
                32,
                False,
                True,
                False))
        for i in range(10):
            arr.add_field()
        obj.add_constraint(
            ConstraintBlockModel("XX", [
                ConstraintExprModel(
                    ExprBinModel(ExprFieldRefModel(arr.size), BinExprType.Eq,
                                 ExprLiteralModel(10, False, 32)))
            ]))
        foreach = ConstraintForeachModel(ExprFieldRefModel(arr))
        foreach.addConstraint(
            ConstraintImpliesModel(
                ExprBinModel(ExprFieldRefModel(foreach.index), BinExprType.Gt,
                             ExprLiteralModel(0, False, 32)),
                [
                    ConstraintExprModel(
                        ExprBinModel(
                            ExprArraySubscriptModel(
                                ExprFieldRefModel(arr),
                                ExprFieldRefModel(foreach.index)),
                            BinExprType.Eq,
                            ExprBinModel(
                                ExprArraySubscriptModel(
                                    ExprFieldRefModel(arr),
                                    ExprBinModel(
                                        ExprFieldRefModel(foreach.index),
                                        BinExprType.Sub,
                                        ExprLiteralModel(1, False, 32))),
                                BinExprType.Add, ExprLiteralModel(
                                    1, False, 32))))
                ]))

        obj.add_constraint(ConstraintBlockModel("c", [foreach]))

        #         print("Object: " + ModelPrettyPrinter.print(obj))
        #
        #         constraints = ArrayConstraintBuilder.build(obj)
        #         for c in constraints:
        #             print("Constraint: " + ModelPrettyPrinter.print(c))
        #         print("Object(1): " + ModelPrettyPrinter.print(obj))
        #
        #         ConstraintOverrideRollbackVisitor.rollback(obj)
        #         print("Object(2): " + ModelPrettyPrinter.print(obj))
        randstate = RandState(0)
        Randomizer.do_randomize(randstate, SourceInfo("", -1), [obj])

        for f in arr.field_l:
            print("" + f.name + ": " + str(int(f.get_val())))
Esempio n. 5
0
    def get_randstate(self) -> RandState:
        if self.randstate is None:
            # Construct state
            self.randstate = RandState.mk()

        # Note: this is returned by reference. The
        # caller must clone as needed if saving
        # a copy or mutating the state
        return self.randstate
Esempio n. 6
0
def randomize_with(*args, **kwargs):
    """Randomize a list of variables with an inline constraint"""
    field_l = []
    for v in args:
        if not hasattr(v, "get_model"):
            raise Exception("Parameter \"" + str(v) +
                            " to randomize is not a vsc object")
        field_l.append(v.get_model())

    debug = 0
    if "debug" in kwargs.keys():
        debug = kwargs["debug"]

    solve_fail_debug = False
    if "solve_fail_debug" in kwargs:
        solve_fail_debug = kwargs["solve_fail_debug"]

    randstate = None
    if "randstate" in kwargs:
        randstate = kwargs["randstate"]
    else:
        randstate = RandState(random.randint(0, 0xFFFFFFFF))

    class inline_constraint_collector(object):
        def __init__(self, randstate, field_l, solve_fail_debug):
            self.randstate = randstate
            self.field_l = field_l
            self.solve_fail_debug = solve_fail_debug

        def __enter__(self):
            # Go into 'expression' mode
            enter_expr_mode()
            push_constraint_scope(ConstraintBlockModel("inline"))
            return self

        def __exit__(self, t, v, tb):
            frame = inspect.stack()[1]
            c = pop_constraint_scope()
            leave_expr_mode()

            try:
                Randomizer.do_randomize(self.randstate,
                                        SourceInfo(frame.filename,
                                                   frame.lineno),
                                        self.field_l, [c],
                                        debug=debug)
            except SolveFailure as e:
                if _solve_fail_debug or self.solve_fail_debug:
                    print("Solve Failure")
                raise e

    return inline_constraint_collector(randstate, field_l, solve_fail_debug)
Esempio n. 7
0
    def test_same_seed_str(self):
        @vsc.randobj
        class item_c(object):
            def __init__(self):
                self.a = vsc.rand_uint8_t()
                self.b = vsc.rand_uint8_t()

            @vsc.constraint
            def ab_c(self):
                self.a < self.b

        ci = item_c()

        v1 = []
        v2 = []

        print("Iteration 1")
        rs1 = RandState.mkFromSeed(10, "abc")
        ci.set_randstate(rs1)
        for _ in range(10):
            ci.randomize()
            v1.append((ci.a, ci.b))

        print("Iteration 2")
        rs2 = RandState.mkFromSeed(10, "abc")
        ci.set_randstate(rs2)
        for _ in range(10):
            ci.randomize()
            v2.append((ci.a, ci.b))

        # Check that two lists are not exactly equal
        all_equal = True
        for i in range(len(v1)):
            print("[%d] v1=(%d,%d) v2=(%d,%d)" %
                  (i, v1[i][0], v1[i][1], v2[i][0], v2[i][1]))
            if v1[i][0] != v2[i][0] or v1[i][1] != v2[i][1]:
                all_equal = False
#                break
        self.assertTrue(all_equal)
Esempio n. 8
0
    def test_init_state(self):
        @vsc.randobj
        class item_c(object):
            def __init__(self):
                self.a = vsc.rand_uint8_t()
                self.b = vsc.rand_uint8_t()

            @vsc.constraint
            def ab_c(self):
                self.a < self.b

        ci = item_c()

        v1 = []
        v2 = []

        rs1 = RandState(0)
        ci.set_randstate(rs1)
        for _ in range(100):
            ci.randomize()
            v1.append((ci.a, ci.b))

        rs2 = RandState(100)
        ci.set_randstate(rs2)

        for _ in range(100):
            ci.randomize()
            v2.append((ci.a, ci.b))

        # Check that two lists are not exactly equal
        all_equal = True
        for i in range(len(v1)):
            if v1[i][0] != v2[i][0] or v1[i][1] != v2[i][1]:
                all_equal = False
                break
        self.assertFalse(all_equal)
Esempio n. 9
0
    def test_wide_var(self):
        obj = FieldCompositeModel("obj")
        a = obj.add_field(FieldScalarModel("a", 1024, False, True))
        obj.add_constraint(
            ConstraintBlockModel("c", [
                ConstraintExprModel(
                    ExprBinModel(
                        a.expr(), BinExprType.Gt,
                        ExprLiteralModel(0x80000000000000000, False, 72)))
            ]))

        randstate = RandState(0)
        rand = Randomizer(randstate)

        rand.do_randomize(randstate, SourceInfo("", -1), [obj])

        print("a=" + hex(int(a.val)))
        self.assertGreater(a.val, ValueScalar(0x80000000000000000))
Esempio n. 10
0
    def test_diff_seed(self):
        @vsc.randobj
        class item_c(object):
            def __init__(self):
                self.a = vsc.rand_uint8_t()
                self.b = vsc.rand_uint8_t()

            @vsc.constraint
            def ab_c(self):
                self.a < self.b

        ci = item_c()

        v1 = []
        v2_1 = []
        v2_2 = []

        print("Iteration 1")
        rs1 = RandState.mkFromSeed(0)

        ci.set_randstate(rs1)
        for _ in range(10):
            ci.randomize()
            v1.append((ci.a, ci.b))

        rand_s = rs1.randint(0, 1000000)

        rs2_1 = RandState.mkFromSeed(rand_s)
        rs2_2 = RandState.mkFromSeed(rand_s)

        print("Iteration 2_1")
        ci.set_randstate(rs2_1)
        for _ in range(10):
            ci.randomize()
            v2_1.append((ci.a, ci.b))

        print("Iteration 2_2")
        ci.set_randstate(rs2_2)
        for _ in range(10):
            ci.randomize()
            v2_2.append((ci.a, ci.b))

        # Check that two lists are not exactly equal
        all_equal = True
        for i in range(len(v1)):
            print("[%d] v2_1=(%d,%d) v2_2=(%d,%d)" %
                  (i, v2_1[i][0], v2_1[i][1], v2_2[i][0], v2_2[i][1]))
            if v2_1[i][0] != v2_2[i][0] or v2_1[i][1] != v2_2[i][1]:
                all_equal = False
                break
        self.assertTrue(all_equal)

        # Check that we have differences from the first set
        all_equal = True
        for i in range(len(v1)):
            print("[%d] v1=(%d,%d) v2_2=(%d,%d)" %
                  (i, v1[i][0], v1[i][1], v2_2[i][0], v2_2[i][1]))
            if v1[i][0] != v2_2[i][0] or v1[i][1] != v2_2[i][1]:
                all_equal = False
                break
        self.assertFalse(all_equal)