iRisc / Scan_in / Python / sc_gen.py
sc_gen.py
Raw
import os
import sys

top_level = "scan_chain"
addr = 0

file1 = open('demo_main.vhx', 'r')
Lines_inst = file1.readlines()

path = './'
# filename = '{}.io'.format(top_level)
filename = '{}.csv'.format(top_level)
with open(os.path.join(path, 'scan_bitstream.csv'), 'w') as f:

    # scan_out
    i_imem_rdata = '00000000000000000000000000000000'
    i_dmem_rdata = '00000000000000000000000000000000'

    # scan_in
    sc_en_cnt = '0'
    sc_clkgen_fc = '00000'  # 5
    sc_clkgen_div = '0000'  # 4

    sc_imem_ctrl = '0'
    sc_imem_req = '0'
    sc_imem_addr = '00000000000000000000000000000000'  # 32
    sc_imem_wen = '0'
    sc_imem_wdata = '00000000000000000000000000000000'  # 32
    sc_imem_clk = '0'

    sc_dmem_ctrl = '0'
    sc_dmem_req = '0'
    sc_dmem_addr = '00000000000000000000000000000000'  # 32
    sc_dmem_wen = '0'
    sc_dmem_ben = '0000'
    sc_dmem_wdata = '00000000000000000000000000000000'  # 32
    sc_dmem_clk = '0'

    sc_fsm_mode = '0'
    sc_fsm_indef = '0'
    sc_fsm_cycle = '00000000000000000000000000000000'

    def write_output(move_scanchain, scan_i0o1, load, scan_in, clk_int, clk_ext, resetn, num_cycles):
        if move_scanchain:
            f.write('100' + str(scan_in) + '\n')
            f.write('000' + str(scan_in) + '\n')
            f.write('010' + str(scan_in) + '\n')
            f.write('000' + str(scan_in) + '\n')
        elif not move_scanchain and not clk_ext:
            f.write('00'+ str(load) + '0' + '\n')
            f.write('00'+ str(load) + '0' + '\n')
            f.write('00'+ str(load) + '0' + '\n')
            f.write('00'+ str(load) + '0' + '\n')
        elif clk_ext:
            for i in range(num_cycles):
                f.write('0000' + '\n')
                f.write('0000' + '\n')

    def refresh_combine():
        global combine
        combine = (
            str(sc_fsm_cycle) +
            str(sc_fsm_indef) +
            str(sc_fsm_mode) +
            str(sc_dmem_clk) +
            str(sc_dmem_wdata) +
            str(sc_dmem_ben) +
            str(sc_dmem_wen) +
            str(sc_dmem_addr) +
            str(sc_dmem_req) +
            str(sc_dmem_ctrl) +
            str(sc_imem_clk) +
            str(sc_imem_wdata) +
            str(sc_imem_wen) +
            str(sc_imem_addr) +
            str(sc_imem_req) +
            str(sc_imem_ctrl) +
            str(sc_clkgen_div) +
            str(sc_clkgen_fc) +
            str(sc_en_cnt) +
            str(i_dmem_rdata) +
            str(i_imem_rdata)
        )

    ##########################
    #    scan_instruction
    ##########################
    for i in range(len(Lines_inst)):
        sc_imem_ctrl = '1'
        sc_dmem_ctrl = '1'
        sc_imem_cen = '0'
        sc_imem_wen = '0'
        sc_imem_addr = "{:032b}".format(i * 4)
        sc_imem_wdata = str(bin(int(Lines_inst[i].strip(), 16))[2:].zfill(32))
        #print(sc_imem_wdata)

        sc_imem_clk = '0'
        sc_dmem_clk = '0'

        refresh_combine()
        #reversed_combine = combine[::-1]
        #print(len(combine))

        for char in combine:
        # phi, phib, scan_i0o1, load, scan_in, clk_int, clk_ext, rstn
            write_output(move_scanchain=True, scan_i0o1=0, load=0, scan_in=char, clk_int=0, clk_ext=0, resetn=0, num_cycles=0)

        # load data
        write_output(move_scanchain=False, scan_i0o1=0, load=1, scan_in=0, clk_int=0, clk_ext=0, resetn=0, num_cycles=0)

        sc_imem_clk = '1'
        sc_dmem_clk = '1'
        refresh_combine()

        for char in combine:
            # phi, phib, scan_i0o1, load, scan_in, clk_int, clk_ext, rstn
            write_output(move_scanchain=True, scan_i0o1=0, load=0, scan_in=char, clk_int=0, clk_ext=0, resetn=0, num_cycles=0)

        # load data
        write_output(move_scanchain=False, scan_i0o1=0, load=1, scan_in=0, clk_int=0, clk_ext=0, resetn=0, num_cycles=0)

    ##########################
    #    scan_clk_config
    ##########################

    sc_en_cnt = '1'
    sc_clkgen_fc = '00101'
    sc_clkgen_div = '0100'

    sc_imem_clk = '0'
    sc_dmem_clk = '0'

    sc_imem_ctrl = '0'
    sc_dmem_ctrl = '0'

    ########################
    refresh_combine()

    for char in combine:
        # phi, phib, scan_i0o1, load, scan_in, clk_int, clk_ext, rstn
        write_output(move_scanchain=True, scan_i0o1=0, load=0, scan_in=char, clk_int=0, clk_ext=0, resetn=0, num_cycles=0)

    # load data
    write_output(move_scanchain=False, scan_i0o1=0, load=1, scan_in=0, clk_int=0, clk_ext=0, resetn=0, num_cycles=0)

    ################################
    #    scan_enable_fsm_config
    ################################

    sc_fsm_mode = '1'
    sc_fsm_indef = '1'
    sc_fsm_cycle = '00000000000000000000000000000000'

    sc_imem_addr = '00000000000000000000000000000000'
    sc_imem_wdata = '00000000000000000000000000000000'
    ########################
    refresh_combine()

    for char in combine:
        # phi, phib, scan_i0o1, load, scan_in, clk_int, clk_ext, rstn
        write_output(move_scanchain=True, scan_i0o1=0, load=0, scan_in=char, clk_int=1, clk_ext=0, resetn=1, num_cycles=0)

    # load data
    write_output(move_scanchain=False, scan_i0o1=0, load=1, scan_in=0, clk_int=1, clk_ext=0, resetn=1, num_cycles=0)
    
    write_output(move_scanchain=False, scan_i0o1=0, load=0, scan_in=0, clk_int=1, clk_ext=0, resetn=0, num_cycles=0)
    write_output(move_scanchain=False, scan_i0o1=0, load=0, scan_in=0, clk_int=1, clk_ext=0, resetn=0, num_cycles=0)
    write_output(move_scanchain=False, scan_i0o1=0, load=0, scan_in=0, clk_int=1, clk_ext=0, resetn=0, num_cycles=0)
    write_output(move_scanchain=False, scan_i0o1=0, load=0, scan_in=0, clk_int=1, clk_ext=0, resetn=0, num_cycles=0)
    write_output(move_scanchain=False, scan_i0o1=0, load=0, scan_in=0, clk_int=1, clk_ext=0, resetn=0, num_cycles=0)

    write_output(move_scanchain=False, clk_ext=True, num_cycles=100, scan_i0o1=0, load=0, scan_in=0, clk_int=1, resetn=1)

    # ##########################
    # #    scan_out_DMEM
    # ##########################
    # sc_imem_ctrl = '1'
    # sc_imem_req = '1'
    # sc_imem_wen = '1'
    # sc_imem_clk = '1'
    # sc_imem_wdata = '00000000000000000000000000000000'
    # refresh_combine()

    # for char in combine:
    #     # phi, phib, scan_i0o1, load, scan_in, clk_int, clk_ext, rstn
    #     write_output(move_scanchain=True, scan_i0o1=0, load=0, scan_in=char, clk_int=0, clk_ext=0, resetn=0, num_cycles=0)

    # # scan out data
    # write_output(move_scanchain=False, scan_i0o1=1, load=0, scan_in=0, clk_int=0, clk_ext=0, resetn=0, num_cycles=0)


    # for char in combine:
    #     # phi, phib, scan_i0o1, load, scan_in, clk_int, clk_ext, rstn
    #     write_output(move_scanchain=True, scan_i0o1=0, load=0, scan_in=0, clk_int=0, clk_ext=0, resetn=0, num_cycles=0)

    # # f.write(header + iopin.format(right))
f.close()