Ejemplo n.º 1
0
def RAM_M_TB(numUnits):
    f = open('RAM_Mux_TB.v', 'w')
    f.write('`timescale 1ns / 1ps\n')
    f.write(unit_generation.header('MultiSum Test Fixture', ' '))
#	
    f.write('module RAM_Mux_TB();\n')
    f.write('reg [31:0] ram_out;\n')
    f.write('reg ['+str(int(math.ceil(math.log(numUnits)/math.log(2.0))))+':0] unit_sel;\n')
    f.write('reg write;\n')
    f.write('reg CLOCK;\n')

    
    #output declaration
    for i in range(0, numUnits):
        f.write('wire [31:0] weight'+str(i)+';')
        f.write(' wire write'+str(i)+';\n')
    f.write('\n\n')

    f.write('RAMMux_py UUT(')
    f.write('ram_out,unit_sel,write,CLOCK')
    for i in range (0,numUnits):
        f.write(',weight'+str(i)+',write'+str(i))
    f.write(');\n\n')

    f.write('initial begin\n')
    ram = 1
    f.write('\tCLOCK=0; write=0;ram_out='+str(ram)+'; unit_sel=0; #5\n')
    for i in range(0, numUnits):
        f.write('\tunit_sel='+str(i)+'; write=1; ram_out='+str(ram)+';#5;\n')
        f.write('\twrite=0; #5;\n')
        ram*=2
        
    f.write('end\n')
    f.write('always #1 CLOCK = ~CLOCK;\n\n')
    f.write('endmodule')
Ejemplo n.º 2
0
def MassAnd(numUnits):
    f = open('MassAnd_py.v', 'w')
    f.write('`timescale 1ns / 1ps\n')
    f.write(unit_generation.header('RAMMux_py', ' '))
    
    #module declaration
    f.write('module MassAnd_py(\n')

    #inputs
    f.write('input CLOCK,\n')
    for i in range(0,numUnits):
        f.write('input in'+str(i)+',\n')

    #outputs
    f.write('output done\n')
    f.write(');\n\n')

    #main block
    f.write('and A0(done,')
    for i in range(0, numUnits):
        f.write('in'+str(i))
        if (i != numUnits-1):
            f.write(',')
    f.write(');\n\n')
    f.write('ClockedOneShot shot(andDone, done, reset, CLOCK) ;\n\n')
    f.write('endmodule\n')
Ejemplo n.º 3
0
def DataRegBankTB(numUnits):
    f = open('Data_Reg_Bank_TB.v', 'w')
    f.write('`timescale 1ns / 1ps\n')
    f.write(unit_generation.header('DataRegBank Test Fixture', ' '))
    
    f.write('module Data_Reg_Bank_TB();\n')
    f.write('reg [31:0] ')
    for i in range(numUnits):
        f.write('in{}, '.format(i))
    f.write('dataIn;\n')
    addressSize = int(math.ceil(math.log(numUnits)/math.log(2)))-1
    f.write('reg [{}:0] address;\n'.format(addressSize))
    f.write('reg writeAddress, writeAll, clk;\n')
    
    f.write('wire [31:0] out0')
    for i in range(1,numUnits):
        f.write(', out{}'.format(i))
    f.write(';\n\n')
    
    f.write('DataRegBank UUT(')
    for i in range(numUnits):
        f.write('in{}, '.format(i))
    f.write('dataIn, address, writeAddress, writeAll, clk')
    for i in range(numUnits):
        f.write(', out{}'.format(i))
    f.write(');\n\n')
    
    f.write('initial begin\n')
    f.write('clk = 0; dataIn = 0; address = 0; writeAddress = 0;\n')
    for i in range(numUnits):
        f.write('in{} = 0; '.format(i))
    f.write('writeAll = 0; #5;\n')
    for i in range(numUnits):
        f.write('in{} = 0; '.format(i))
    f.write('writeAll = 1; #5;\n')
    for i in range(numUnits):
        f.write('in{} = 0; '.format(i))
    f.write('writeAll = 0; #5;\n\n')
    for i in range(numUnits):
        f.write('dataIn = {0}; address = {0}; writeAddress = 0; #5;\n'.format(i))
        f.write('dataIn = {0}; address = {0}; writeAddress = 1; #5;\n'.format(i))
        f.write('dataIn = {0}; address = {0}; writeAddress = 0; #5;\n\n'.format(i))
    for i in range(numUnits):
        f.write('in{} = {}; '.format(i,10+i))
    f.write('writeAll = 0; #5;\n')
    for i in range(numUnits):
        f.write('in{} = {}; '.format(i,10+i))
    f.write('writeAll = 1; #5;\n')
    for i in range(numUnits):
        f.write('in{} = {}; '.format(i,10+i))
    f.write('writeAll = 0; #5;\n\n')
    f.write('$stop;\n')
    f.write('end\n\n')
    
    f.write('always #1 clk = ~clk;\n\n')
    
    f.write('endmodule')
Ejemplo n.º 4
0
def DataRegBank(numUnits):
    f = open('Data_Reg_Bank.v', 'w')
    f.write(unit_generation.header('DataRegBank', 'For '+str(numUnits)+' units'))
    
    #module declaration
    f.write('module DataRegBank(')
    for i in range(numUnits):
        f.write('in{}, '.format(i))
    f.write('dataIn, address, writeAddress, writeAll, reset, clk')
    for i in range(numUnits):
        f.write(', out{}'.format(i))
    f.write(');\n')
    
    #input declaration
    f.write('input [31:0] ')
    for i in range(numUnits):
        f.write('in{}, '.format(i))
    f.write('dataIn;\n')
    addressSize = int(math.ceil(math.log(numUnits)/math.log(2)))-1
    f.write('input [{}:0] address;\n'.format(addressSize))
    f.write('input writeAddress, writeAll, reset, clk;\n')
    
    #output declaration
    f.write('output reg [31:0] out0')
    for i in range(1,numUnits):
        f.write(', out{}'.format(i))
    f.write(';\n\n')
    
    #main block
    f.write('always @ (posedge clk) begin\n')
    f.write('\tif (reset == 1) begin \n')
    for i in range (numUnits):
        f.write('\t\tout{} <= 0;\n'.format(i))
    f.write('\tend\n')
    f.write('   else if(writeAddress == 1) begin\n')
    f.write('       case(address)\n')
    for i in range(numUnits):
        f.write('           {}: begin\n'.format(i))
        for j in range(numUnits):
            if(i==j):
                f.write('               out{} <= dataIn;\n'.format(j))
            else:
                f.write('               out{0} <= out{0};\n'.format(j))
        f.write('               end\n')
    f.write('           default: begin\n')
    for i in range(numUnits):
        f.write('               out{0} <= out{0};\n'.format(i))
    f.write('               end\n')
    f.write('       endcase\n')
    f.write('   end else if (writeAll == 1) begin\n')
    for i in range(numUnits):
        f.write('       out{0} <= in{0};\n'.format(i))
    f.write('   end\n')
    f.write('end\n')
    f.write('endmodule\n')
Ejemplo n.º 5
0
def RamMux(numUnits):
    f = open('RAMMux.v', 'w')
    f.write('`timescale 1ns / 1ps\n')
    f.write(unit_generation.header('RAMMux_py', ' '))
    
    #module declaration
    f.write('module RAMMux_py(\n')

    #input declaration
    f.write('input [31:0] ram_out,\n')
    f.write('input ['+str(int(math.ceil(math.log(numUnits)/math.log(2.0))))+':0] unit_sel,\n')
    f.write('input write,\n')
    f.write('input CLOCK,\n')
#   for i in range(1, numUnits):
#       f.write(', in{}'.format(i))
#   f.write(';\ninput start, clk;\n')
    
    #output declaration
    for i in range(0, numUnits):
        f.write('output reg [31:0] weight'+str(i)+',')
        f.write('output reg write'+str(i))
        if (i != numUnits-1):
            f.write(',\n')
    f.write('\n);\n\n')

    
    #main block
    f.write('always@(posedge CLOCK)')
    f.write('\tbegin\n \tcase(unit_sel)\n')
    for i in range (0, numUnits):
        f.write('\t'+str(i)+': begin\n')
        for j in range (0, numUnits):
            if (i != j):
                f.write('\t\tweight'+str(j)+ '<=0;\n')
                f.write('\t\twrite'+str(j)+'<=0;\n')
            else:
                f.write('\t\tweight'+str(j)+ '<=ram_out;\n')
                f.write('\t\twrite'+str(j)+'<=write;\n')
        f.write('\t\tend\n')
    f.write('\tdefault: begin\n')
    for i in range(0,numUnits):
        f.write('\t\tweight'+str(i)+ '<=0;\n')
        f.write('\t\twrite'+str(i)+'<=0;\n')
    f.write('\t\tend\n')
    f.write('\tendcase\n\tend\n')

    f.write('endmodule\n')
Ejemplo n.º 6
0
def MultiSumTB(numUnits):
	f = open('MultiSum_TB_PY.v', 'w')
	f.write('`timescale 1ns / 1ps\n')
	f.write(unit_generation.header('MultiSum Test Fixture', ' '))
	
	f.write('module MultiSum_TB();\n')
	f.write('reg [31:0] in0')
	for i in range(1,numUnits):
		f.write(', in{}'.format(i))
	f.write(';\nreg start, clk;\n')
	f.write('wire [31:0] sum;\n')
	f.write('wire done;\n\n')
	
	f.write('reg [5:0] count = 0;\n\n')
	
	f.write('MultiSum UUT(')
	for i in range(numUnits):
		f.write('in{}, '.format(i))
	f.write('start, clk, sum, done);\n\n')
	
	f.write('initial begin\n')
	f.write('\tclk=0;\n')
	f.write('\t')
	for i in range(numUnits):
		f.write('in{}=0; '.format(i))
	f.write('start=0; #5;\n')
	f.write('\tstart=1; #2;\n')
	f.write('\tstart=0;\n')
	f.write('end\n\n')
	
	f.write('always @ (posedge done) begin\n')
	f.write('\tif(count==3) begin #5; $stop; end\n\t')
	for i in range(numUnits):
		f.write('in{}=count*{}+1; '.format(i,i+1))
	f.write('start=0; #5;\n')
	f.write('\tstart=1; #2;\n')
	f.write('\tstart=0;\n')
	f.write('\tcount=count+1;\n')
	f.write('end\n\n')
	
	f.write('always #1 clk = ~clk;\n\n')
	f.write('endmodule\n')
Ejemplo n.º 7
0
def MultiSum(numUnits):
	f = open('Multi_Sum_PY.v', 'w')
	f.write('`timescale 1ns / 1ps\n')
	f.write(unit_generation.header('MultiSum', ' '))
	
	#module declaration
	f.write('module MultiSum(')
	for i in range(numUnits):
		f.write('in{}, '.format(i))
	f.write('start, clk, reset, sum, done);\n')

	#input declaration
	f.write('input [31:0] in0')
	for i in range(1, numUnits):
		f.write(', in{}'.format(i))
	f.write(';\ninput start, clk, reset;\n')
	
	#output declaration
	f.write('output reg [31:0] sum;\n')
	f.write('output reg done;\n\n')
	addressSize = int(math.ceil(math.log(numUnits+1)/math.log(2)))-1
	f.write('reg [{}:0] state;\n'.format(addressSize))
	f.write('reg [{}:0] nextstate;\n\n'.format(addressSize))
	
	#main block
	f.write('always @ (posedge clk) begin\n')
	f.write('\tif(reset == 1) state <= 0;\n')
	f.write('\telse state <= nextstate;\n')
	f.write('end\n\n')
	
	f.write('always @ (state or start) begin\n')
	f.write('\tcase(state)\n')
	
	f.write('\t\t0: begin\n')
	f.write('\t\t\tif(start == 1) nextstate <= 1;\n')
	f.write('\t\t\telse nextstate <= 0;\n')
	f.write('\t\tend\n')
	
	for i in range(1,numUnits+1):
		f.write('\t\t{}: begin\n'.format(i))
		f.write('\t\t\tnextstate <= {};\n'.format(i+1))
		f.write('\t\tend\n')
		
	f.write('\t\t{}: begin\n'.format(numUnits+1))
	f.write('\t\t\tnextstate <= 0;\n')
	f.write('\t\tend\n')
	
	f.write('\t\tdefault: begin\n')
	f.write('\t\t\tnextstate <= 0;\n')
	f.write('\t\tend\n')
	f.write('\tendcase\n')
	f.write('end\n\n')
	
	f.write('always @ (posedge clk) begin\n')
	f.write('\tif(reset==1) begin\n')
	f.write('\t\tsum <= 0;\n')
	f.write('\t\tdone <= 0;\n')
	f.write('\tend\n')
	
	f.write('\telse case(state)\n')
	f.write('\t\t0: begin\n')
	f.write('\t\t\tsum<=sum;\n')
	f.write('\t\t\tdone<=0;\n')
	f.write('\t\tend\n')
	
	for i in range(1,numUnits+1):
		f.write('\t\t{}: begin\n'.format(i))
		if(i==1):
			f.write('\t\t\tsum <= in{};\n'.format(i-1))
		else:
			f.write('\t\t\tsum <= sum + in{};\n'.format(i-1))
		f.write('\t\t\tdone <= 0;\n')
		f.write('\t\tend\n')
		
	f.write('\t\t{}: begin\n'.format(numUnits+1))
	f.write('\t\t\tsum <= sum;\n')
	f.write('\t\t\tdone <= 1;\n')
	f.write('\t\tend\n')
	
	f.write('\t\tdefault: begin\n')
	f.write('\t\t\tsum <= 0;\n')
	f.write('\t\t\tdone <= 0;\n')
	f.write('\t\tend\n')
	f.write('\tendcase\n')
	f.write('end\n')
	f.write('endmodule\n')
Ejemplo n.º 8
0
def NetworkUnit(numUnits):
        f= open('Network.v', 'w')
        f.write(unit_generation.header('Network', 'For '+str(numUnits)+' units'))

        #inputs 
        f.write('module Network(\n')
        f.write('\tinput start,\n')
        f.write('\tinput reset,\n')
        f.write('\tinput sysclk,\n')

        #outputs
        f.write('\toutput done,\n')
        f.write('\toutput rez\n\t);\n\n')
        

        #wires
        #1-bit
        f.write('wire clk, layer_sel, RAM_controll_start,write0,write1,write2,write3,layerDone0,layerDone1,layerDone2,layerDone3, sumTrigger,start_network_controller,lock,writeData;\n')
        #log2(numUnits bits)
        f.write('wire ['+str(int(math.log(numUnits)/math.log(2)-1))+':0] layer,unit_addr,rom_address,unit_sel,unit_address;\n\n')
        #8 bits
        f.write('wire [7:0] weight0,weight1,weight2,weight3;\n')
        #10 bits
        f.write('wire [9:0] ram_addr,RAM_address;\n')
        #32 bits
        f.write('wire [31:0] ram_out,input0n0,input1n0,input2n0,input3n0,layerOutn0,out0,out1,out2,out3,layerOutn1,layerOutn2,layerOutn3,rom_output;\n')
        
        #clock
        f.write('clk_wiz_0 clock\n\t(\n\t.clk_in1(sysclk),\n\t.clk_out1(clk),\n\t.reset(reset),\n\t.locked(lock));\n\n')

        #network controller
        f.write('Network_Controller cont(start_network_controller,done,reset,clk,layer_sel,layer,RAM_controll_Start);\n\n')
        
        #data reg bank	
        f.write('DataRegBank bank(');
        for i in range(0,numUnits):
            f.write('layerOutn'+str(i)+',')
        f.write('rom_output, rom_address, writeData, done, clk')
        for i in range(0,numUnits):
            f.write(',out'+str(i));
        f.write(');\n\n')

        #neural units
        for i in range(0,numUnits):
            f.write('NeuralUnit n'+str(i)+'(')
            for j in range(0,numUnits):
                f.write('out'+str(j)+',')
            f.write('weight'+str(i)+'[7:0],unit_address,write'+str(i)+',sumTrigger,layer_sel,clk,layerOutn'+str(i)+',layerDone'+str(i)+');\n\n')
            
        #and unit
        f.write('MassAnd a0(clk')
        for i in range(0,numUnits):
            f.write(',layerDone'+str(i))
        f.write(',done);\n\n')

        #ram multiplexer
        f.write('RAMMux mux(ram_out,unit_sel,ram_write,clk')
        for i in range (0,numUnits):
            f.write(',weight'+str(i)+',write'+str(i))
        f.write(');\n\n')

        #ram read driver
        f.write('RAM_Read_Driver reader(RAM_controll_Start,layer,reset,clk,RAM_address,unit_sel,unit_address,ram_write,sumTrigger);\n\n')
        
        #ram
        f.write('ram_access ram(RAM_address,clk,1\'b0,0,ram_out);\n\n')

        #ROM controller
        f.write('ROM_Controller rom(start,clk,reset,rom_output,rom_address,writeData,start_network_controller);\n\n')

        #black magic and
        f.write('and A0(rez')
        for i in range(0,numUnits):
            f.write(',out'+str(i))
        f.write(');\n\n')

        f.write('endmodule')
Ejemplo n.º 9
0
def RAMReadDriver(numUnits):
	address = int(math.ceil(math.log(numUnits)/math.log(2)))
	f = open('RAM_Read_Driver.v', 'w')
	f.write('`timescale 1ns / 1ps\n')
	f.write(unit_generation.header('RAMReadDriver', 'For '+str(numUnits)+' units'))
	f.write('module RAM_Read_Driver(start,layer,reset,clk,RAM_address,unit_sel,unit_address,write,sum_trigger);\n')
	f.write('input start,reset,clk;\n')
	f.write('input [1:0] layer;\n')
	f.write('output reg [9:0] RAM_address;\n')
	f.write('output reg [{}:0] unit_sel,unit_address;\n'.format(address-1))
	f.write('output reg write, sum_trigger;\n\n')
	
	f.write('reg [3:0] state, nextstate;\n')
	f.write('reg [{}:0] count, unitcount;\n\n'.format(address))
	
	f.write('always @ (posedge clk) begin\n')
	f.write('\tstate <= nextstate;\n')
	f.write('\tif(reset==1)\n')
	f.write('\t\tstate <= 0;\n')
	f.write('end\n\n')
	
	f.write('always @ (state or start or count or unitcount) begin\n')
	f.write('\tcase(state)\n')
	
	#state 0
	f.write('\t\t0: begin\n')
	f.write('\t\t\tif(start==1)\n')
	f.write('\t\t\t\tnextstate <= 1;\n')
	f.write('\t\t\telse\n')
	f.write('\t\t\t\tnextstate <= 0;\n')
	f.write('\t\t\tend\n')
	
	#state 1
	f.write('\t\t1: begin //stall one cycle for ram latency\n')
	f.write('\t\t\tnextstate <= 2;\n')
	f.write('\t\t\tend\n')
	
	#state 2
	f.write('\t\t2: begin //stall two cycles for ram latency\n')
	f.write('\t\t\tnextstate <= 3;\n')
	f.write('\t\t\tend\n')
	
	#state 3
	f.write('\t\t3: begin\n')
	f.write('\t\t\tnextstate <= 4;\n')
	f.write('\t\t\tend\n')
	
	#state 4
	f.write('\t\t4: begin\n')
	f.write('\t\t\tnextstate <= 5;\n')
	f.write('\t\t\tend\n')
	
	#state 5
	f.write('\t\t5: begin //stall one cycle for ram latency\n')
	f.write('\t\t\tif(count == {}) nextstate <= 7;\n'.format(numUnits))
	f.write('\t\t\telse nextstate <= 6;\n')
	f.write('\t\t\tend\n')
	
	#state 6
	f.write('\t\t6: begin //stall second cycle for ram latency\n')
	f.write('\t\t\tnextstate <= 3;\n')
	f.write('\t\t\tend\n')
	
	#state 7
	f.write('\t\t7: begin //update unit while stalling for ram latency\n')
	f.write('\t\t\tnextstate <= 8;\n')
	f.write('\t\t\tend\n')
	
	#state 8
	f.write('\t\t8: begin //check unit count\n')
	f.write('\t\t\tif(unitcount == {}) nextstate <= 9;\n'.format(numUnits))
	f.write('\t\t\telse nextstate <= 3;\n')
	f.write('\t\t\tend\n')
	
	#state 9
	f.write('\t\t9: begin\n')
	f.write('\t\t\tnextstate <= 10;\n')
	f.write('\t\t\tend\n')
	
	#state 10
	f.write('\t\t10: begin\n')
	f.write('\t\t\tnextstate <= 0;\n')
	f.write('\t\t\tend\n')
	
	#default
	f.write('\t\tdefault: begin\n')
	f.write('\t\t\tnextstate <= 0;\n')
	f.write('\t\t\tend\n')
	
	f.write('\tendcase\n')
	f.write('end\n\n')
	
	f.write('always @ (posedge clk) begin\n')
	f.write('\tif(reset == 1) begin\n')
	f.write('\t\tRAM_address <= 0;\n')
	f.write('\t\tunit_sel <= 0;\n')
	f.write('\t\tunit_address <= 0;\n')
	f.write('\t\twrite <= 0;\n')
	f.write('\t\tsum_trigger <= 0;\n')
	f.write('\t\tcount <= 0;\n')
	f.write('\t\tunitcount <= 0;\n')
	f.write('\t\tend\n')
	f.write('\telse case(state)\n')

	#state 0
	f.write('\t\t0: begin\n')
	f.write('\t\t\tif(layer == 0)\n')
	f.write('\t\t\t\tRAM_address <= 0;\n')
	f.write('\t\t\telse if(layer == 1)\n')
	f.write('\t\t\t\tRAM_address <= {};\n'.format(numUnits*numUnits))
	f.write('\t\t\telse if(layer == 2)\n')
	f.write('\t\t\t\tRAM_address <= {};\n'.format(numUnits*numUnits*2))
	f.write('\t\t\tunit_sel <= 0;\n')
	f.write('\t\t\tunit_address <= 0;\n')
	f.write('\t\t\twrite <= 0;\n')
	f.write('\t\t\tsum_trigger <= 0;\n')
	f.write('\t\t\tcount <= 0;\n')
	f.write('\t\t\tunitcount <= 0;\n')
	f.write('\t\t\tend\n')
	
	#state 1
	f.write('\t\t1: begin //stall one cycle for ram latency\n')
	f.write('\t\t\tRAM_address <= RAM_address;\n')
	f.write('\t\t\tunit_sel <= unit_sel;\n')
	f.write('\t\t\tunit_address <= unit_address;\n')
	f.write('\t\t\twrite <= 0;\n')
	f.write('\t\t\tsum_trigger <= 0;\n')
	f.write('\t\t\tcount <= count;\n')
	f.write('\t\t\tunitcount <= unitcount;\n')
	f.write('\t\t\tend\n')
	
	#state 2
	f.write('\t\t2: begin //stall two cycles for ram latency\n')
	f.write('\t\t\tRAM_address <= RAM_address;\n')
	f.write('\t\t\tunit_sel <= unit_sel;\n')
	f.write('\t\t\tunit_address <= unit_address;\n')
	f.write('\t\t\twrite <= 0;\n')
	f.write('\t\t\tsum_trigger <= 0;\n')
	f.write('\t\t\tcount <= count;\n')
	f.write('\t\t\tunitcount <= unitcount;\n')
	f.write('\t\t\tend\n')
	
	#state 3
	f.write('\t\t3: begin\n')
	f.write('\t\t\tRAM_address <= RAM_address;\n')
	f.write('\t\t\tunit_sel <= unit_sel;\n')
	f.write('\t\t\tunit_address <= unit_address;\n')
	f.write('\t\t\twrite <= 1;\n')
	f.write('\t\t\tsum_trigger <= 0;\n')
	f.write('\t\t\tcount <= count + 1;\n')
	f.write('\t\t\tunitcount <= unitcount;\n')
	f.write('\t\t\tend\n')
	
	#state 4
	f.write('\t\t4: begin\n')
	f.write('\t\t\tRAM_address <= RAM_address + 1;\n')
	f.write('\t\t\tunit_sel <= unit_sel;\n')
	f.write('\t\t\tunit_address <= unit_address + 1;\n')
	f.write('\t\t\twrite <= 0;\n')
	f.write('\t\t\tsum_trigger <= 0;\n')
	f.write('\t\t\tcount <= count;\n')
	f.write('\t\t\tunitcount <= unitcount;\n')
	f.write('\t\t\tend\n')
	
	#state 5
	f.write('\t\t5: begin //stall one cycle for ram latency\n')
	f.write('\t\t\tRAM_address <= RAM_address;\n')
	f.write('\t\t\tunit_sel <= unit_sel;\n')
	f.write('\t\t\tunit_address <= unit_address;\n')
	f.write('\t\t\twrite <= 0;\n')
	f.write('\t\t\tsum_trigger <= 0;\n')
	f.write('\t\t\tcount <= count;\n')
	f.write('\t\t\tunitcount <= unitcount;\n')
	f.write('\t\t\tend\n')
	
	#state 6
	f.write('\t\t6: begin //stall two cycles for ram latency\n')
	f.write('\t\t\tRAM_address <= RAM_address;\n')
	f.write('\t\t\tunit_sel <= unit_sel;\n')
	f.write('\t\t\tunit_address <= unit_address;\n')
	f.write('\t\t\twrite <= 0;\n')
	f.write('\t\t\tsum_trigger <= 0;\n')
	f.write('\t\t\tcount <= count;\n')
	f.write('\t\t\tunitcount <= unitcount;\n')
	f.write('\t\t\tend\n')
	
	#state 7
	f.write('\t\t7: begin //update unit while stalling for ram latency\n')
	f.write('\t\t\tRAM_address <= RAM_address;\n')
	f.write('\t\t\tunit_sel <= unit_sel + 1;\n')
	f.write('\t\t\tunit_address <= 0;\n')
	f.write('\t\t\twrite <= 0;\n')
	f.write('\t\t\tsum_trigger <= 0;\n')
	f.write('\t\t\tcount <= 0;\n')
	f.write('\t\t\tunitcount <= unitcount + 1;\n')
	f.write('\t\t\tend\n')
	
	#state 8
	f.write('\t\t8: begin //check unit count\n')
	f.write('\t\t\tRAM_address <= RAM_address;\n')
	f.write('\t\t\tunit_sel <= unit_sel;\n')
	f.write('\t\t\tunit_address <= unit_address;\n')
	f.write('\t\t\twrite <= 0;\n')
	f.write('\t\t\tsum_trigger <= 0;\n')
	f.write('\t\t\tcount <= count;\n')
	f.write('\t\t\tunitcount <= unitcount;\n')
	f.write('\t\t\tend\n')
	
	#state 9
	f.write('\t\t9: begin\n')
	f.write('\t\t\tRAM_address <= RAM_address;\n')
	f.write('\t\t\tunit_sel <= unit_sel;\n')
	f.write('\t\t\tunit_address <= unit_address;\n')
	f.write('\t\t\twrite <= 0;\n')
	f.write('\t\t\tsum_trigger <= 1;\n')
	f.write('\t\t\tcount <= count;\n')
	f.write('\t\t\tunitcount <= unitcount;\n')
	f.write('\t\t\tend\n')
	
	#state 10
	f.write('\t\t10: begin\n')
	f.write('\t\t\tRAM_address <= RAM_address;\n')
	f.write('\t\t\tunit_sel <= unit_sel;\n')
	f.write('\t\t\tunit_address <= unit_address;\n')
	f.write('\t\t\twrite <= 0;\n')
	f.write('\t\t\tsum_trigger <= 0;\n')
	f.write('\t\t\tcount <= count;\n')
	f.write('\t\t\tunitcount <= unitcount;\n')
	f.write('\t\t\tend\n')
	
	#default
	f.write('\t\tdefault: begin\n')
	f.write('\t\t\tRAM_address <= 0;\n')
	f.write('\t\t\tunit_sel <= 0;\n')
	f.write('\t\t\tunit_address <= 0;\n')
	f.write('\t\t\twrite <= 0;\n')
	f.write('\t\t\tsum_trigger <= 0;\n')
	f.write('\t\t\tcount <= 0;\n')
	f.write('\t\t\tunitcount <= 0;\n')
	f.write('\t\t\tend\n')
	
	f.write('\tendcase\n')
	f.write('end\n\n')
	
	f.write('endmodule\n')
	f.close()

	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
Ejemplo n.º 10
0
def NeuralUnit_tb(numUnits):
	f = open('NeuralUnit_tb.v', 'w')
	f.write('`timescale 1ns / 1ps\n')
	f.write(unit_generation.header('NeuralUnit Test Fixture', ' '))
	
	f.write('module NeuralUnit_tb();\n')
	for i in range(numUnits):
		f.write('reg [31:0] input{};\n'.format(i))
	f.write('reg [7:0] weight;\n')
	addressSize = int(math.ceil(math.log(numUnits)/math.log(2)))-1
	f.write('reg [{}:0] address;\n'.format(addressSize))
	f.write('reg write;\n')
	f.write('reg sumTrigger;\n')
	f.write('reg layer_Sel;\n')
	f.write('reg clk;\n')
	
	f.write('wire [31:0] layerOut;\n')
	f.write('wire layerDone;\n')
	
	f.write('NeuralUnit UUT(')
	for i in range(numUnits):
		f.write('input{}, '.format(i))
	f.write('weight, address, write, sumTrigger, layer_Sel, clk, layerOut, layerDone);\n\n')
	
	for i in range(numUnits):
		f.write('\twire [7:0] internalWeight{0} = UUT.weightWire{0};\n'.format(i))
		f.write('\twire [31:0] shifter{0} = UUT.shiftwire{0};\n'.format(i))
		
	
	f.write("""
	wire [31:0] sum = UUT.sumWire;
	wire sumEnd = UUT.sum_end_signal;
	wire [31:0] elliot = UUT.elliotWire;
	wire elliotEnd = UUT.elliot_end_signal;
	reg [4:0] count=0;""")
	
	f.write('\ninitial begin\n')
	f.write('\tclk=0;\n\t')
	
	for i in range(numUnits):
		f.write('input{0}={0}; '.format(i))
	f.write('\n')
	
	for i in range(numUnits):
		f.write('\tweight={0}; address={0}; write=1; sumTrigger=0; layer_Sel=0; #5;\n'.format(i))
		f.write('\twrite=0; #5;\n')
	f.write('end\n\n')
	
	f.write('always @ (posedge layerDone) begin\n')
	f.write('\tcount = count+1;\n')
	f.write('\tif(count == 3) begin #5; $finish; end\n')
	f.write('\tif(count == 2) layer_sel=0;\n\t')
	for i in range(numUnits):
		f.write('input{0} = count+{0}; '.format(i))
	f.write('\n')
	
	for i in range(numUnits):
		f.write('\tweight= count*{0}+1; address={1}; write=1; #5;\n'.format(i+1, i))
		f.write('\twrite=0; #5;\n')
	f.write('\tsumTrigger=1; #5;\n')
	f.write('\tsumTrigger=0; #5;\n')
	f.write('end\n\n')
	
	f.write('always #1 clk= ~clk;\n\n')
	f.write('endmodule\n')
Ejemplo n.º 11
0
def NeuralUnit(numUnits):
	f= open('Neural_Unit.v', 'w')
	f.write(unit_generation.header('NeuralUnit', 'For '+str(numUnits)+' units'))
	
	f.write('module NeuralUnit(\n')
	for i in range(numUnits):
		f.write('\tinput [31:0] input'+str(i)+',\n')
	f.write('\tinput [7:0] weight,\n')
	addressSize = int(math.ceil(math.log(numUnits)/math.log(2)))-1
	f.write('\tinput [{}:0] address,\n'.format(addressSize))
	f.write('\tinput write,\n')
	f.write('\tinput sumTrigger,\n')
	f.write('\tinput layer_Sel,\n')
#	f.write('\tinput activate,\n')
	f.write('\tinput clk,\n')
	f.write('\toutput [31:0] layerOut,\n')
	f.write('\toutput layerDone\n')
	f.write('\t);\n\n')
	
	#create outputReg
	#f.write('\t//Reg\n')
	#f.write('\treg [31:0] outReg;\n\n')
	#create wires
	f.write('\t//Wires\n')
	for i in range(numUnits):
		f.write('\twire [7:0] weightWire'+str(i)+';\n')
	for i in range(numUnits):
		f.write('\twire [31:0] shiftWire'+str(i)+';\n')
	f.write('\twire [31:0] sumWire;\n')
	f.write('\twire [31:0] elliotWire;\n')
#	f.write('\twire [31:0] layerMuxOut;\n')
	f.write('\twire elliot_end_signal;\n')
	f.write('\twire sum_end_signal;\n')
	#f.write('\tparameter unactivated 32\'h00000000;\n')
	
	
	#create the weight reg block
	f.write('\t//Create weight reg block\n')
	f.write('\tWeightRegBank bank(weight, address, write, clk, ')
	for i in range(numUnits):
		f.write('weightWire'+str(i))
		if i != (numUnits-1):
			f.write(', ')
	f.write(');\n\n')
	
	#create Elliot Function
	f.write('\t//Create Elliot Function\n')
	f.write('\tElliot_Activation elliot(sumWire, sum_end_signal, clk, elliotWire, elliot_end_signal);\n\n')
	
	#create summer
	f.write('\t//Create summer\n')
	f.write('\tMultiSum summer(')
	for i in range(numUnits):
		f.write('shiftWire{},'.format(i))
	f.write('sumTrigger, clk, sumWire, sum_end_signal);\n\n')
	
	#create layer mux
	f.write('\t//Create layer mux\n')
	f.write('\tLayerMux layer(sumWire, elliotWire, sum_end_signal, elliot_end_signal, layer_Sel, layerOut, layerDone);\n\n')
	
	#create shifters
	f.write('\t//Create shifters\n')
	for i in range(numUnits):
		f.write('\tShifter shifter'+str(i)+'(input'+str(i)+', weightWire'+str(i)+', clk, shiftWire'+str(i)+');\n')
	
#	f.write('\n\tassign layerOut = outReg;\n')
	
#	f.write('\n\talways @ (activate or layerMuxOut) begin\n')
#	f.write('\t\tcase(activate)\n')
#	f.write('\t\t1\'b0: layerOut <= 0;\n')
#	f.write('\t\t1\'b1: layerOut <= layerMuxOut;\n')
#	f.write('\t\tdefault: layerOut <= 0;\n')
#	f.write('\t\tendcase\n')
#	f.write('\tend\n\n')

	f.write('endmodule')