Example #1
0
def test_ncsim_continue():
    files = [get_file_path("ncsim/test.sv"), get_file_path("ncsim/test_tb.sv")]
    with NCSimTester(*files) as tester:
        tester.run()
        debugger = DebuggerMock()
        debugger.connect()
        assert debugger.is_paused()
        debugger.continue_()
        debugger.wait_till_finish()
Example #2
0
def test_verilator_continue():
    file = get_file_path("verilator/test.sv")
    tb_file = get_file_path("verilator/test.cc")
    with VerilatorTester(tb_file, file) as tester:
        tester.run()
        debugger = DebuggerMock()
        debugger.connect()
        assert debugger.is_paused()
        debugger.continue_()
        debugger.wait_till_finish()
Example #3
0
def mock_debugger(fn):
    # run it in a separate process to fake a debugger-simulator interaction
    p = multiprocessing.Process(target=fn)
    p.start()
    # send an CONTINUE request to the runtime to check if it's working
    from kratos_runtime import DebuggerMock
    mock = DebuggerMock()
    time.sleep(1)
    mock.connect()
    mock.continue_()
    mock.wait_till_finish()
    p.join()
Example #4
0
def test_state_dump():

    mod = CorrectDesign0()
    # insert verilator directives
    kratos.passes.insert_verilator_public(mod.internal_generator)
    filename = get_file_path("test_state_dump/mod.sv")
    kratos.verilog(mod,
                   filename=filename,
                   insert_debug_info=True,
                   insert_break_on_edge=True)
    tb_file = get_file_path("test_state_dump/test.cc.in")
    with tempfile.TemporaryDirectory() as temp:
        tb = os.path.join(temp, "test.cc")
        template_file(tb_file, tb, values=[1, 2, 3, 4])

        with VerilatorTester(tb, filename, cwd=temp) as tester:
            tester.run()
            # verilator uses TOP
            debugger = DebuggerMock(design=mod, prefix_top="TOP")
            debugger.connect()
            assert debugger.is_paused()
            # records the states
            states = debugger.record_state()
            assert len(states) == 4
            s = 0
            for i in range(4):
                s += i
                in_, regs, out_ = states[i]
                assert len(regs) == 1
                assert "mod.b" in regs
                assert regs
                assert out_["mod.b"] == s
                assert in_["mod.a"] == i + 1
Example #5
0
def test_fault_design_coverage():
    import kratos.passes

    mod = WrongDesign0()
    # insert verilator directives
    kratos.passes.insert_verilator_public(mod.internal_generator)
    filename = get_file_path("test_state_dump/mod.sv")
    kratos.verilog(mod,
                   filename=filename,
                   insert_debug_info=True,
                   insert_break_on_edge=True)
    tb_file = get_file_path("test_state_dump/test.cc.in")
    input_correct = [1, 2, 2, 1]
    input_wrong = [1, 2, 3, 4]
    with tempfile.TemporaryDirectory() as temp:
        correct_tb_file = os.path.join(temp, "correct.cc")
        wrong_tb_file = os.path.join(temp, "wrong.cc")
        template_file(tb_file, correct_tb_file, input_correct)
        template_file(tb_file, wrong_tb_file, input_wrong)
        tb_files = [correct_tb_file, wrong_tb_file]
        run_states = []
        for tb_file in tb_files:
            with VerilatorTester(tb_file, filename, cwd=temp) as tester:
                tester.run()
                # verilator uses TOP
                debugger = DebuggerMock(design=mod, prefix_top="TOP")
                debugger.connect()
                assert debugger.is_paused()
                # records the states
                states = debugger.record_state(reg_only=False)
                assert len(states) == 4
                run_states.append(states)

        assert len(run_states) == 2

        # coverage based fault localization
        from _kratos.fault import FaultAnalyzer, SimulationRun
        correct_run = SimulationRun(mod.internal_generator)
        for state in run_states[0]:
            correct_run.add_simulation_state(state)
        wrong_run = SimulationRun(mod.internal_generator)
        for state in run_states[1]:
            wrong_run.add_simulation_state(state)
        wrong_run.mark_wrong_value("mod.b")
        fault = FaultAnalyzer(mod.internal_generator)
        fault.add_simulation_run(correct_run)
        fault.add_simulation_run(wrong_run)
        stmts = fault.compute_fault_stmts_from_coverage()
        # there is only one wrong assignment here
        assert len(stmts) == 1
        # print out the faulty logic
        _kratos.util.print_stmts(stmts)
Example #6
0
def test_fault_design_state_dump():
    from kratos import always_ff, Generator, posedge
    import kratos.passes

    mod = Generator("mod")
    a = mod.input("a", 4)
    b = mod.output("b", 4)
    rst = mod.reset("rst")
    clk = mod.clock("clk")

    @always_ff((posedge, "clk"), (posedge, "rst"))
    def code():
        if rst:
            b = 0
        else:
            if a > 2:
                b = a + b + 1
            else:
                b = a + b

    mod.add_code(code)
    # insert verilator directives
    kratos.passes.insert_verilator_public(mod.internal_generator)
    filename = get_file_path("test_state_dump/mod.sv")
    kratos.verilog(mod, filename=filename, insert_debug_info=True,
                   insert_break_on_edge=True)
    tb_file = get_file_path("test_state_dump/test.cc")
    with VerilatorTester(tb_file, filename) as tester:
        tester.run()
        # verilator uses TOP
        debugger = DebuggerMock(design=mod, prefix_top="TOP")
        debugger.connect()
        assert debugger.is_paused()
        # records the states
        states = debugger.record_state()
    assert len(states) == 4
    with tempfile.TemporaryDirectory() as temp:
        filename = os.path.join(temp, "states.json")
        debugger.dump_state(states, filename)
        assert os.path.isfile(filename)
Example #7
0
def test_state_dump():
    from kratos import always_ff, Generator, posedge
    import kratos.passes

    mod = Generator("mod")
    a = mod.input("a", 4)
    b = mod.output("b", 4)
    rst = mod.reset("rst")
    clk = mod.clock("clk")

    @always_ff((posedge, "clk"), (posedge, "rst"))
    def code():
        if rst:
            b = 0
        else:
            b = a + b

    mod.add_code(code)
    # insert verilator directives
    kratos.passes.insert_verilator_public(mod.internal_generator)
    filename = get_file_path("test_state_dump/mod.sv")
    kratos.verilog(mod, filename=filename, insert_debug_info=True,
                   insert_break_on_edge=True)
    tb_file = get_file_path("test_state_dump/test.cc")
    with VerilatorTester(tb_file, filename) as tester:
        tester.run()
        # verilator uses TOP
        debugger = DebuggerMock(design=mod, prefix_top="TOP")
        debugger.connect()
        assert debugger.is_paused()
        # records the states
        states = debugger.record_state()
        assert len(states) == 4
        s = 0
        for i in range(4):
            s += i
            in_, regs, out_ = states[i]
            assert len(regs) == 1
            assert "mod.b" in regs
            assert regs
            assert out_["mod.b"] == s
            assert in_["mod.a"] == i + 1