Beispiel #1
0
def generate_test(Circuit, func):
    #nfuncargs = check(circuit, func)
    sig = signature(func)
    nfuncargs = len(sig.parameters)
    assert nfuncargs + 1 < 8

    rom = testvectors(func)

    romb = ROMB(rom)
    counter = Counter(9)
    wire(1, romb.RE)
    wire(1, romb.RCLKE)
    wire(counter.O, romb.RADDR)

    circuit = Circuit(nfuncargs)

    circuit(*[romb.RDATA[i] for i in range(nfuncargs)])

    orr = Or(2)
    finished = DFF()
    f = finished(orr(counter.COUT, finished.O))

    xor = XOr(2)
    xor(circuit.O, romb.RDATA[nfuncargs])
    orr = Or(2)
    error = DFF()
    e = error(orr(xor.O, error.O))

    return f, e
Beispiel #2
0
def makepico(prog, inputs, outputs, ADDRN, DATAN):

    mem = assemble(prog, 1 << ADDRN)

    romb = ROMB(mem) # this should have a width=16
    #print(repr(romb))
    #print('ADDRN',len(romb.RADDR))
    #print('INSTN',len(romb.RDATA))
    assert len(romb.RDATA) == 16
    wire( 1, romb.RE)

    pico = Pico(ADDRN, DATAN)
    #print('ADDRN',len(pico.addr))
    #print('INSTN',len(pico.data))

    wire(pico.addr, romb.RADDR)
    wire(romb.RDATA, pico.data)

    input = Input(DATAN, inputs)
    wire(pico.port, input.A)
    wire(input.O, pico.I)

    output = Output(DATAN, outputs)

    wire(pico.port, output.A)
    wire(pico.we, output.WE)
    wire(pico.O, output.I)

    return pico, romb
Beispiel #3
0
def makepico(prog, input, output, ADDRN, DATAN, debug):

    mem = assemble(prog, 1 << ADDRN)

    romb = ROMB(len(mem), 16, mem)  # this should have a width=16
    #print(repr(romb))
    #print('ADDRN',len(romb.RADDR))
    #print('INSTN',len(romb.RDATA))
    assert len(romb.RDATA) == 16
    wire(1, romb.RE)

    pico = Pico(ADDRN, DATAN, debug)
    #print('ADDRN',len(pico.addr))
    #print('INSTN',len(pico.data))

    wire(pico.addr, romb.RADDR)
    wire(romb.RDATA, pico.data)

    #input = Input(DATAN, inputs)
    #wire(pico.port, input.A)
    #wire(input.O, pico.I)
    wire(input, pico.I)

    if debug is None:
        #output = Output(DATAN, outputs)
        #wire(pico.port, output.A)
        reg = Register(DATAN, has_ce=True)
        reg(pico.O, ce=pico.we)
        wire(reg.O, output)
    else:
        wire(pico.O, output)

    return pico, romb
Beispiel #4
0
 def definition(io):
     weigths_rom = ROMB(weights_list)
     # using 16 LUTs to store the image, each LUT contributes 1 bit per cycle
     lut_list = []
     for i in range(N):
         lut_list.append(SB_LUT4(LUT_INIT=imgs_list[N * image_id + i]))
     wire(io.CYCLE, weigths_rom.RADDR[:n])
     wire(io.IDX, weigths_rom.RADDR[n:n + b])
     if n+b < 8:
         wire(bits(0, 8-n-b), weigths_rom.RADDR[n+b:])
     wire(1, weigths_rom.RE)
     wire(weigths_rom.RDATA, io.WEIGHT)
     wire(io.CLK, weigths_rom.RCLK)
     for i in range(N):
         wire(io.CYCLE, bits([lut_list[i].I0, lut_list[i].I1, lut_list[i].I2, lut_list[i].I3]))
         wire(lut_list[i].O, io.IMAGE[i])
Beispiel #5
0
 def definition(io):
     weights_list = [1] + [2**16-1]*15 + [3] + [2**16-1]*15 + ([0] + [2**16-1]*15)*((256-32)//16)
     weigths_rom = ROMB(weights_list)
     lut_list = []
     for i in range(N):
         lut_list.append(SB_LUT4(LUT_INIT=1))
     wire(io.CYCLE, weigths_rom.RADDR[:n])
     wire(io.IDX, weigths_rom.RADDR[n:n+b])
     if n + b < 8:
         wire(bits(0, 8-n-b), weigths_rom.RADDR[n+b:])
     wire(1, weigths_rom.RE)
     wire(weigths_rom.RDATA, io.WEIGHT)
     wire(io.CLK, weigths_rom.RCLK)
     for i in range(N):
         wire(io.CYCLE, bits([lut_list[i].I0, lut_list[i].I1, lut_list[i].I2, lut_list[i].I3]))
         wire(lut_list[i].O, io.IMAGE[i])
Beispiel #6
0
    def definition(io):
        # save the weights to memory (ROM)
        weights_rom = ROMB(len(weights_list), 16, weights_list)
        wire(io.CYCLE, weights_rom.RADDR[:n])
        wire(io.IDX, weights_rom.RADDR[n:n + b])
        if n + b < 8:
            wire(bits(0, 8 - n - b), weights_rom.RADDR[n + b:])
        wire(1, weights_rom.RE)
        wire(weights_rom.RDATA, io.WEIGHT)
        wire(io.CLK, weights_rom.RCLK)

        # save the image to RAM, 16 bits at a time
        image_ram = mantle.RAM(4, 16)
        wire(io.WE, image_ram.WE)
        wire(io.CLK, image_ram.CLK)
        wire(io.CYCLE, image_ram.RADDR)
        wire(io.WADDR, image_ram.WADDR)
        wire(io.DATA, image_ram.WDATA)
        wire(image_ram.RDATA, io.IMAGE)
Beispiel #7
0
    for i in range(7):
        nop()
    jmp(0)


mem = assemble(prog, 1 << ADDRN)

icestick = IceStick()
icestick.Clock.on()
for i in range(DATAN):
    icestick.J3[i].output().on()

main = icestick.main()

# program memory
romb = ROMB(len(mem), 16, mem)
wire(1, romb.RE)

inst = romb.RDATA
addr = inst[0:ADDRN]
jump = inst[15]

# 2 phases: read inst, execute inst
tff = TFF()
tff(1)

seq = Sequencer(DATAN)

pc = seq(addr, jump, tff)
wire(pc, romb.RADDR)