Compare commits
4 Commits
0d7b82a0dd
...
af2c6c665d
Author | SHA1 | Date | |
---|---|---|---|
|
af2c6c665d | ||
|
03851e19b7 | ||
|
1586adc0e1 | ||
|
f3a9f2f44c |
@ -540,6 +540,232 @@ defproc texel_dualcore (bd<N_IN> in, out;
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
export template<pint N_IN, // Size of input data from outside world
|
||||||
|
N_NRN_X, N_NRN_Y, N_SYN_X, N_SYN_Y, // Number of neurons / synapses
|
||||||
|
NC_NRN_X, NC_NRN_Y, NC_SYN_X, NC_SYN_Y,
|
||||||
|
N_SYN_DLY_CFG,
|
||||||
|
N_NRN_MON_X, N_NRN_MON_Y, N_SYN_MON_X, N_SYN_MON_Y,
|
||||||
|
N_MON_AMZO_PER_SYN, N_MON_AMZO_PER_NRN, // Number of signals that each synapse outputs to be monitored.
|
||||||
|
N_FLAGS_PER_SYN, N_FLAGS_PER_NRN, // Number of signals that each nrn/syn recieves from the register.
|
||||||
|
N_BUFFERS,
|
||||||
|
N_LINE_PD_DLY, // Number of dummy delays to add line pull down
|
||||||
|
N_BD_DLY_CFG, N_BD_DLY_CFG2,
|
||||||
|
REG_NCA, REG_NCW, REG_M>
|
||||||
|
defproc texel_dualcore_mapper (bd<N_IN> in, out;
|
||||||
|
|
||||||
|
Mx1of2<REG_NCW> c1_reg_data[REG_M];
|
||||||
|
|
||||||
|
bool! c1_dec_req_x[N_SYN_X], c1_dec_req_y[N_SYN_Y];
|
||||||
|
bool? c1_dec_ackB[N_SYN_X];
|
||||||
|
a1of1 c1_syn_pu[N_SYN_X];
|
||||||
|
|
||||||
|
a1of1 c1_enc_inx[N_NRN_X], c1_enc_iny[N_NRN_Y];
|
||||||
|
a1of1 c1_nrn_pd_x[N_NRN_X], c1_nrn_pd_y[N_NRN_Y];
|
||||||
|
|
||||||
|
bool! c1_nrn_mon_x[N_NRN_MON_X], c1_nrn_mon_y[N_NRN_MON_Y];
|
||||||
|
bool! c1_syn_mon_x[N_SYN_MON_X], c1_syn_mon_y[N_SYN_MON_Y];
|
||||||
|
bool? c1_syn_mon_AMZI[N_SYN_X * N_MON_AMZO_PER_SYN], c1_nrn_mon_AMZI[N_NRN_X * N_MON_AMZO_PER_NRN];
|
||||||
|
bool! c1_syn_mon_AMZO[N_MON_AMZO_PER_SYN], c1_nrn_mon_AMZO[N_MON_AMZO_PER_NRN];
|
||||||
|
bool! c1_syn_flags_EFO[N_FLAGS_PER_SYN], c1_nrn_flags_EFO[N_FLAGS_PER_NRN];
|
||||||
|
|
||||||
|
bool! c1_reset_nrn_hs_BO[N_NRN_X], c1_reset_syn_hs_BO[N_SYN_X],
|
||||||
|
c1_reset_nrn_stge_BO[N_NRN_X], c1_reset_syn_stge_BO[N_SYN_X];
|
||||||
|
|
||||||
|
Mx1of2<REG_NCW> c2_reg_data[REG_M];
|
||||||
|
|
||||||
|
bool! c2_dec_req_x[N_SYN_X], c2_dec_req_y[N_SYN_Y];
|
||||||
|
bool? c2_dec_ackB[N_SYN_X];
|
||||||
|
a1of1 c2_syn_pu[N_SYN_X];
|
||||||
|
|
||||||
|
a1of1 c2_enc_inx[N_NRN_X], c2_enc_iny[N_NRN_Y];
|
||||||
|
a1of1 c2_nrn_pd_x[N_NRN_X], c2_nrn_pd_y[N_NRN_Y];
|
||||||
|
|
||||||
|
bool! c2_nrn_mon_x[N_NRN_MON_X], c2_nrn_mon_y[N_NRN_MON_Y];
|
||||||
|
bool! c2_syn_mon_x[N_SYN_MON_X], c2_syn_mon_y[N_SYN_MON_Y];
|
||||||
|
bool? c2_syn_mon_AMZI[N_SYN_X * N_MON_AMZO_PER_SYN], c2_nrn_mon_AMZI[N_NRN_X * N_MON_AMZO_PER_NRN];
|
||||||
|
bool! c2_syn_mon_AMZO[N_MON_AMZO_PER_SYN], c2_nrn_mon_AMZO[N_MON_AMZO_PER_NRN];
|
||||||
|
bool! c2_syn_flags_EFO[N_FLAGS_PER_SYN], c2_nrn_flags_EFO[N_FLAGS_PER_NRN];
|
||||||
|
|
||||||
|
bool! c2_reset_nrn_hs_BO[N_NRN_X], c2_reset_syn_hs_BO[N_SYN_X],
|
||||||
|
c2_reset_nrn_stge_BO[N_NRN_X], c2_reset_syn_stge_BO[N_SYN_X];
|
||||||
|
|
||||||
|
bool? bd_dly_cfg[N_BD_DLY_CFG], bd_dly_cfg2[N_BD_DLY_CFG2];
|
||||||
|
bool? loopback_en;
|
||||||
|
power supply;
|
||||||
|
bool? reset_B, reset_reg_B, reset_syn_stge_BI;
|
||||||
|
|
||||||
|
// MAPPER STUFF
|
||||||
|
|
||||||
|
bool? mapper_en;
|
||||||
|
avMx1of2<30> out_sram_wr; // Input packets to go to SRAM (rw word addr)
|
||||||
|
avMx1of2<8> out_sram_spk; // Spike packets from enc to go to SRAM (core-nrn addr)
|
||||||
|
avMx1of2<15> in_sram_r; // Readout packets from SRAM (data only)
|
||||||
|
avMx1of2<14> in_sram_spk // Spike packets from SRAM (core-syn addr)
|
||||||
|
|
||||||
|
){
|
||||||
|
|
||||||
|
// Reset buffers
|
||||||
|
bool _reset_BX;
|
||||||
|
BUF_X12 reset_buf(.a = reset_B, .y = _reset_BX, .vdd = supply.vdd, .vss = supply.vss);
|
||||||
|
|
||||||
|
bd2qdi<N_IN, N_BD_DLY_CFG, N_BD_DLY_CFG2> _bd2qdi(.in = in, .dly_cfg = bd_dly_cfg, .dly_cfg2 = bd_dly_cfg2,
|
||||||
|
.reset_B = _reset_BX, .supply = supply);
|
||||||
|
fifo<N_IN,N_BUFFERS> fifo_in2fork(.in = _bd2qdi.out, .reset_B = _reset_BX, .supply = supply);
|
||||||
|
|
||||||
|
fork<N_IN> _fork(.in = fifo_in2fork.out, .reset_B = _reset_BX, .supply = supply);
|
||||||
|
|
||||||
|
// Loopback
|
||||||
|
fifo<N_IN,N_BUFFERS> fifo_fork2drop(.in = _fork.out1, .reset_B = _reset_BX, .supply = supply);
|
||||||
|
dropper_static<N_IN, false> _loopback_dropper(.in = fifo_fork2drop.out, .cond = loopback_en,
|
||||||
|
.supply = supply);
|
||||||
|
fifo<N_IN,N_BUFFERS> fifo_drop2mrg(.in = _loopback_dropper.out, .reset_B = _reset_BX, .supply = supply);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// dmx to SRAM
|
||||||
|
bool is_to_sram, is_to_cores;
|
||||||
|
demux<32> sram_dmx(.in = _fork.out2, .supply = supply, .reset_B = _reset_BX);
|
||||||
|
sram_dmx.cond.d.d[0].t = is_to_sram;
|
||||||
|
sram_dmx.cond.d.d[0].f = is_to_cores;
|
||||||
|
AND2_X1 sram_dmx_and(.a = sram_dmx.in.d.d[30].f, .b = sram_dmx.in.d.d[29].t,
|
||||||
|
.y = is_to_sram,
|
||||||
|
.vdd = supply.vdd, .vss = supply.vss);
|
||||||
|
OR3_X1 sram_dmx_or(.a = sram_dmx.in.d.d[30].t, .b = sram_dmx.in.d.d[30].t, .c = sram_dmx.in.d.d[29].f,
|
||||||
|
.y = is_to_cores,
|
||||||
|
.vdd = supply.vdd, .vss = supply.vss);
|
||||||
|
slice_data<32, 0, 29> pre_sram_slice(.in = sram_dmx.out2, .supply = supply);
|
||||||
|
out_sram_wr.a = pre_sram_slice.out.a;
|
||||||
|
out_sram_wr.v = pre_sram_slice.out.v;
|
||||||
|
(i:29:out_sram_wr.d.d[i] = pre_sram_slice.out.d.d[i];)
|
||||||
|
out_sram_wr.d.d[29] = pre_sram_slice.in.d.d[31];
|
||||||
|
|
||||||
|
// spikes from sram
|
||||||
|
// requires weird merging because [core, syny, synx] needs to go to [core, ZEROES, syny, synx]
|
||||||
|
append<14,32,0> sram_spk_in_append(.in = in_sram_spk, .supply = supply);
|
||||||
|
merge<32> merge_dmx8spk(.in1 = sram_dmx.out1, .reset_B = _reset_BX, .supply = supply);
|
||||||
|
merge_dmx8spk.in2.a = sram_spk_in_append.out.a;
|
||||||
|
merge_dmx8spk.in2.v = sram_spk_in_append.out.v;
|
||||||
|
(i:13: merge_dmx8spk.in2.d.d[i] = sram_spk_in_append.out.d.d[i];)
|
||||||
|
merge_dmx8spk.in2.d.d[31] = sram_spk_in_append.out.d.d[13];
|
||||||
|
(i:13..30: merge_dmx8spk.in2.d.d[i] = sram_spk_in_append.out.d.d[i+1];)
|
||||||
|
|
||||||
|
// Onwards to core demux
|
||||||
|
fifo<N_IN,N_BUFFERS> fifo_fork2dmx(.in = merge_dmx8spk.out, .reset_B = _reset_BX, .supply = supply);
|
||||||
|
demux_bit_msb<N_IN-1> core_dmx(.in = fifo_fork2dmx.out, .reset_B = _reset_BX, .supply = supply);
|
||||||
|
fifo<N_IN-1,N_BUFFERS> fifo_dmx2core1(.in = core_dmx.out1, .reset_B = _reset_BX, .supply = supply);
|
||||||
|
fifo<N_IN-1,N_BUFFERS> fifo_dmx2core2(.in = core_dmx.out2, .reset_B = _reset_BX, .supply = supply);
|
||||||
|
|
||||||
|
// Cores
|
||||||
|
texel_core<N_IN-1,N_NRN_X, N_NRN_Y, N_SYN_X, N_SYN_Y,NC_NRN_X, NC_NRN_Y, NC_SYN_X, NC_SYN_Y,N_SYN_DLY_CFG,N_NRN_MON_X, N_NRN_MON_Y, N_SYN_MON_X, N_SYN_MON_Y,N_MON_AMZO_PER_SYN, N_MON_AMZO_PER_NRN,N_FLAGS_PER_SYN, N_FLAGS_PER_NRN,N_BUFFERS,N_LINE_PD_DLY, REG_NCA, REG_NCW, REG_M>
|
||||||
|
core1(.in = fifo_dmx2core1.out,
|
||||||
|
|
||||||
|
.reg_data = c1_reg_data,
|
||||||
|
// .synapses = c1_synapses,
|
||||||
|
// .neurons = c1_neurons,
|
||||||
|
|
||||||
|
.dec_req_x = c1_dec_req_x, .dec_req_y = c1_dec_req_y,
|
||||||
|
.dec_ackB = c1_dec_ackB,
|
||||||
|
.syn_pu = c1_syn_pu,
|
||||||
|
|
||||||
|
.enc_inx = c1_enc_inx, .enc_iny = c1_enc_iny,
|
||||||
|
.nrn_pd_x = c1_nrn_pd_x, .nrn_pd_y = c1_nrn_pd_y,
|
||||||
|
|
||||||
|
.nrn_mon_x = c1_nrn_mon_x, .nrn_mon_y = c1_nrn_mon_y,
|
||||||
|
.syn_mon_x = c1_syn_mon_x, .syn_mon_y = c1_syn_mon_y,
|
||||||
|
.syn_mon_AMZI = c1_syn_mon_AMZI, .nrn_mon_AMZI = c1_nrn_mon_AMZI,
|
||||||
|
.syn_mon_AMZO = c1_syn_mon_AMZO, .nrn_mon_AMZO = c1_nrn_mon_AMZO,
|
||||||
|
.syn_flags_EFO = c1_syn_flags_EFO, .nrn_flags_EFO = c1_nrn_flags_EFO,
|
||||||
|
|
||||||
|
.reset_B = _reset_BX, .reset_reg_B = reset_reg_B, .reset_syn_stge_BI = reset_syn_stge_BI,
|
||||||
|
.reset_syn_hs_BO = c1_reset_syn_hs_BO, .reset_syn_stge_BO = c1_reset_syn_stge_BO,
|
||||||
|
.reset_nrn_hs_BO = c1_reset_nrn_hs_BO, .reset_nrn_stge_BO = c1_reset_nrn_stge_BO,
|
||||||
|
|
||||||
|
.supply = supply
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
texel_core<N_IN-1,N_NRN_X, N_NRN_Y, N_SYN_X, N_SYN_Y,NC_NRN_X, NC_NRN_Y, NC_SYN_X, NC_SYN_Y,N_SYN_DLY_CFG,N_NRN_MON_X, N_NRN_MON_Y, N_SYN_MON_X, N_SYN_MON_Y,N_MON_AMZO_PER_SYN, N_MON_AMZO_PER_NRN,N_FLAGS_PER_SYN, N_FLAGS_PER_NRN,N_BUFFERS,N_LINE_PD_DLY, REG_NCA, REG_NCW, REG_M>
|
||||||
|
core2(.in = fifo_dmx2core2.out,
|
||||||
|
|
||||||
|
.reg_data = c2_reg_data,
|
||||||
|
// .synapses = c2_synapses,
|
||||||
|
// .neurons = c2_neurons,
|
||||||
|
|
||||||
|
.dec_req_x = c2_dec_req_x, .dec_req_y = c2_dec_req_y,
|
||||||
|
.dec_ackB = c2_dec_ackB,
|
||||||
|
.syn_pu = c2_syn_pu,
|
||||||
|
|
||||||
|
.enc_inx = c2_enc_inx, .enc_iny = c2_enc_iny,
|
||||||
|
.nrn_pd_x = c2_nrn_pd_x, .nrn_pd_y = c2_nrn_pd_y,
|
||||||
|
|
||||||
|
.nrn_mon_x = c2_nrn_mon_x, .nrn_mon_y = c2_nrn_mon_y,
|
||||||
|
.syn_mon_x = c2_syn_mon_x, .syn_mon_y = c2_syn_mon_y,
|
||||||
|
.syn_mon_AMZI = c2_syn_mon_AMZI, .nrn_mon_AMZI = c2_nrn_mon_AMZI,
|
||||||
|
.syn_mon_AMZO = c2_syn_mon_AMZO, .nrn_mon_AMZO = c2_nrn_mon_AMZO,
|
||||||
|
.syn_flags_EFO = c2_syn_flags_EFO, .nrn_flags_EFO = c2_nrn_flags_EFO,
|
||||||
|
|
||||||
|
.reset_B = _reset_BX, .reset_reg_B = reset_reg_B, .reset_syn_stge_BI = reset_syn_stge_BI,
|
||||||
|
.reset_syn_hs_BO = c2_reset_syn_hs_BO, .reset_syn_stge_BO = c2_reset_syn_stge_BO,
|
||||||
|
.reset_nrn_hs_BO = c2_reset_nrn_hs_BO, .reset_nrn_stge_BO = c2_reset_nrn_stge_BO,
|
||||||
|
|
||||||
|
.supply = supply
|
||||||
|
);
|
||||||
|
|
||||||
|
fifo<N_IN-1,N_BUFFERS> fifo_core1out(.in = core1.out, .reset_B = _reset_BX, .supply = supply);
|
||||||
|
fifo<N_IN-1,N_BUFFERS> fifo_core2out(.in = core2.out, .reset_B = _reset_BX, .supply = supply);
|
||||||
|
|
||||||
|
// Merge cores
|
||||||
|
append<N_IN-1, 1, 0> append_core1(.in = fifo_core1out.out, .supply = supply);
|
||||||
|
append<N_IN-1, 1, 1> append_core2(.in = fifo_core2out.out, .supply = supply);
|
||||||
|
merge<N_IN> merge_core1x2(.in1 = append_core1.out, .in2 = append_core2.out,
|
||||||
|
.supply = supply, .reset_B = _reset_BX);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// fork after core merge then go to mapper if its a spike
|
||||||
|
fork<32> postcore_fork(.in = merge_core1x2.out, .reset_B = _reset_BX, .supply = supply);
|
||||||
|
dropper_static<32, false> sram_dropper(.in = postcore_fork.out1, .cond = mapper_en, .supply = supply);
|
||||||
|
// Need to have it then drop the spike if its from a register.
|
||||||
|
// to do: go into a self-acknowledging dmx_td, with the cond being on the register bit.
|
||||||
|
demux_td<32, false> drop_if_reg(.in = sram_dropper.out, .reset_B = _reset_BX, .supply = supply); // if cond true, go out on data
|
||||||
|
drop_if_reg.cond.d.d[0] = sram_dropper.out.d.d[30];
|
||||||
|
drop_if_reg.token.r = drop_if_reg.token.a;
|
||||||
|
slice_data<32,0,8> slice_to_sram(.in = drop_if_reg.out, .out = out_sram_spk, .supply = supply);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Merge cores and loopback
|
||||||
|
merge<N_IN> merge_drop8core(.in1 = postcore_fork.out2, .in2 = fifo_drop2mrg.out,
|
||||||
|
.reset_B = _reset_BX, .supply = supply);
|
||||||
|
|
||||||
|
// qdi2bd
|
||||||
|
fifo<N_IN, N_BUFFERS> fifo_mrg2bd(.in = merge_drop8core.out,
|
||||||
|
.reset_B = _reset_BX, .supply = supply);
|
||||||
|
qdi2bd<N_IN, N_BD_DLY_CFG> _qdi2bd(.in = fifo_mrg2bd.out, .out = out, .dly_cfg = bd_dly_cfg,
|
||||||
|
.reset_B = _reset_BX, .supply = supply);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -64,6 +64,8 @@ defproc dummy_neuron_block (a1of1 synapses[N_SYN], neuron; power supply){
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Create an array of neuron dummy blocks.
|
* Create an array of neuron dummy blocks.
|
||||||
|
* Note that this is custom made for the indexing on the texel chip.
|
||||||
|
* And so should be reused *with care*.
|
||||||
*/
|
*/
|
||||||
export template<pint N_SYN_PER_NRN, N_NRN, N_NRN_X>
|
export template<pint N_SYN_PER_NRN, N_NRN, N_NRN_X>
|
||||||
defproc dummy_neuron_core (a1of1 synapses[N_SYN_PER_NRN * N_NRN], neurons[N_NRN]; power supply){
|
defproc dummy_neuron_core (a1of1 synapses[N_SYN_PER_NRN * N_NRN], neurons[N_NRN]; power supply){
|
||||||
|
7229
test/unit_tests/texel_dualcore_glue_mapper/run/prsim.in
Normal file
7229
test/unit_tests/texel_dualcore_glue_mapper/run/prsim.in
Normal file
File diff suppressed because it is too large
Load Diff
922
test/unit_tests/texel_dualcore_glue_mapper/run/prsim.out
Normal file
922
test/unit_tests/texel_dualcore_glue_mapper/run/prsim.out
Normal file
File diff suppressed because one or more lines are too long
1966691
test/unit_tests/texel_dualcore_glue_mapper/run/test.prs
Normal file
1966691
test/unit_tests/texel_dualcore_glue_mapper/run/test.prs
Normal file
File diff suppressed because it is too large
Load Diff
201
test/unit_tests/texel_dualcore_glue_mapper/test.act
Normal file
201
test/unit_tests/texel_dualcore_glue_mapper/test.act
Normal file
@ -0,0 +1,201 @@
|
|||||||
|
/*************************************************************************
|
||||||
|
*
|
||||||
|
* This file is part of ACT dataflow neuro library.
|
||||||
|
* It's the testing facility for cell_lib_std.act
|
||||||
|
*
|
||||||
|
* Copyright (c) 2022 University of Groningen - Ole Richter
|
||||||
|
* Copyright (c) 2022 University of Groningen - Hugh Greatorex
|
||||||
|
* Copyright (c) 2022 University of Groningen - Michele Mastella
|
||||||
|
* Copyright (c) 2022 University of Groningen - Madison Cotteret
|
||||||
|
*
|
||||||
|
* This source describes Open Hardware and is licensed under the CERN-OHL-W v2 or later
|
||||||
|
*
|
||||||
|
* You may redistribute and modify this documentation and make products
|
||||||
|
* using it under the terms of the CERN-OHL-W v2 (https:/cern.ch/cern-ohl).
|
||||||
|
* This documentation is distributed WITHOUT ANY EXPRESS OR IMPLIED
|
||||||
|
* WARRANTY, INCLUDING OF MERCHANTABILITY, SATISFACTORY QUALITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE. Please see the CERN-OHL-W v2
|
||||||
|
* for applicable conditions.
|
||||||
|
*
|
||||||
|
* Source location: https://git.web.rug.nl/bics/actlib_dataflow_neuro
|
||||||
|
*
|
||||||
|
* As per CERN-OHL-W v2 section 4.1, should You produce hardware based on
|
||||||
|
* these sources, You must maintain the Source Location visible in its
|
||||||
|
* documentation.
|
||||||
|
*
|
||||||
|
**************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
import "../../dataflow_neuro/coders.act";
|
||||||
|
import "../../dataflow_neuro/primitives.act";
|
||||||
|
import "../../dataflow_neuro/chips.act";
|
||||||
|
import "../../dataflow_neuro/dummy.act";
|
||||||
|
|
||||||
|
import globals;
|
||||||
|
import std::data;
|
||||||
|
|
||||||
|
open std::data;
|
||||||
|
|
||||||
|
|
||||||
|
open tmpl::dataflow_neuro;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
pint N_IN = 32;
|
||||||
|
|
||||||
|
pint N_NRN_X = 15;
|
||||||
|
pint N_NRN_Y = 6;
|
||||||
|
pint NC_NRN_X = 4;
|
||||||
|
pint NC_NRN_Y = 3;
|
||||||
|
|
||||||
|
pint N_SYN_X = 15;
|
||||||
|
pint N_SYN_Y = 348;
|
||||||
|
pint NC_SYN_X = 4;
|
||||||
|
pint NC_SYN_Y = 9;
|
||||||
|
|
||||||
|
pint N_SYN_DLY_CFG = 4;
|
||||||
|
pint N_BD_DLY_CFG = 4;
|
||||||
|
pint N_BD_DLY_CFG2 = 2;
|
||||||
|
|
||||||
|
pint N_NRN_MON_X = N_NRN_X*2; // [mon,kill]*N
|
||||||
|
pint N_NRN_MON_Y = N_NRN_Y; // [mon]*N
|
||||||
|
|
||||||
|
pint N_SYN_MON_X = N_SYN_X*4; // [mon, dev_mon, set, reset]*N
|
||||||
|
pint N_SYN_MON_Y = N_SYN_Y; // [mon]*N
|
||||||
|
|
||||||
|
pint N_MON_AMZO_PER_SYN = 5;
|
||||||
|
pint N_MON_AMZO_PER_NRN = 3;
|
||||||
|
|
||||||
|
pint N_FLAGS_PER_SYN = 5; // Syn: Must be at least 3 (since those ones have special safety)
|
||||||
|
pint N_FLAGS_PER_NRN = 3; // and leq than the number of bits in a reg, since have presumed only needs one.
|
||||||
|
|
||||||
|
pint N_BUFFERS = 3;
|
||||||
|
|
||||||
|
pint N_LINE_PD_DLY = 3;
|
||||||
|
|
||||||
|
pint REG_NCA = 6;
|
||||||
|
pint REG_M = 1<<REG_NCA;
|
||||||
|
pint REG_NCW = 23;
|
||||||
|
|
||||||
|
|
||||||
|
defproc chip_texel_dualcore (bd<N_IN> in, out;
|
||||||
|
|
||||||
|
Mx1of2<REG_NCW> c1_reg_data[REG_M];
|
||||||
|
|
||||||
|
a1of1 c1_synapses[N_SYN_X * N_SYN_Y];
|
||||||
|
a1of1 c1_neurons[N_NRN_X * N_NRN_Y];
|
||||||
|
|
||||||
|
bool! c1_dec_req_x[N_SYN_X], c1_dec_req_y[N_SYN_Y];
|
||||||
|
bool? c1_dec_ackB[N_SYN_X];
|
||||||
|
a1of1 c1_syn_pu[N_SYN_X];
|
||||||
|
|
||||||
|
a1of1 c1_enc_inx[N_NRN_X], c1_enc_iny[N_NRN_Y];
|
||||||
|
a1of1 c1_nrn_pd_x[N_NRN_X], c1_nrn_pd_y[N_NRN_Y];
|
||||||
|
|
||||||
|
bool! c1_nrn_mon_x[N_NRN_MON_X], c1_nrn_mon_y[N_NRN_MON_Y];
|
||||||
|
bool! c1_syn_mon_x[N_SYN_MON_X], c1_syn_mon_y[N_SYN_MON_Y];
|
||||||
|
bool? c1_syn_mon_AMZI[N_SYN_X * N_MON_AMZO_PER_SYN], c1_nrn_mon_AMZI[N_NRN_X * N_MON_AMZO_PER_NRN];
|
||||||
|
bool! c1_syn_mon_AMZO[N_MON_AMZO_PER_SYN], c1_nrn_mon_AMZO[N_MON_AMZO_PER_NRN];
|
||||||
|
bool! c1_syn_flags_EFO[N_FLAGS_PER_SYN], c1_nrn_flags_EFO[N_FLAGS_PER_NRN];
|
||||||
|
|
||||||
|
bool! c1_reset_nrn_hs_BO[N_NRN_X], c1_reset_syn_hs_BO[N_SYN_X],
|
||||||
|
c1_reset_nrn_stge_BO[N_NRN_X], c1_reset_syn_stge_BO[N_SYN_X];
|
||||||
|
|
||||||
|
Mx1of2<REG_NCW> c2_reg_data[REG_M];
|
||||||
|
|
||||||
|
a1of1 c2_synapses[N_SYN_X * N_SYN_Y];
|
||||||
|
a1of1 c2_neurons[N_NRN_X * N_NRN_Y];
|
||||||
|
|
||||||
|
bool! c2_dec_req_x[N_SYN_X], c2_dec_req_y[N_SYN_Y];
|
||||||
|
bool? c2_dec_ackB[N_SYN_X];
|
||||||
|
a1of1 c2_syn_pu[N_SYN_X];
|
||||||
|
|
||||||
|
a1of1 c2_enc_inx[N_NRN_X], c2_enc_iny[N_NRN_Y];
|
||||||
|
a1of1 c2_nrn_pd_x[N_NRN_X], c2_nrn_pd_y[N_NRN_Y];
|
||||||
|
|
||||||
|
bool! c2_nrn_mon_x[N_NRN_MON_X], c2_nrn_mon_y[N_NRN_MON_Y];
|
||||||
|
bool! c2_syn_mon_x[N_SYN_MON_X], c2_syn_mon_y[N_SYN_MON_Y];
|
||||||
|
bool? c2_syn_mon_AMZI[N_SYN_X * N_MON_AMZO_PER_SYN], c2_nrn_mon_AMZI[N_NRN_X * N_MON_AMZO_PER_NRN];
|
||||||
|
bool! c2_syn_mon_AMZO[N_MON_AMZO_PER_SYN], c2_nrn_mon_AMZO[N_MON_AMZO_PER_NRN];
|
||||||
|
bool! c2_syn_flags_EFO[N_FLAGS_PER_SYN], c2_nrn_flags_EFO[N_FLAGS_PER_NRN];
|
||||||
|
|
||||||
|
bool! c2_reset_nrn_hs_BO[N_NRN_X], c2_reset_syn_hs_BO[N_SYN_X],
|
||||||
|
c2_reset_nrn_stge_BO[N_NRN_X], c2_reset_syn_stge_BO[N_SYN_X];
|
||||||
|
|
||||||
|
bool! reset_B, reset_reg_B, reset_syn_stge_BI;
|
||||||
|
|
||||||
|
bool? bd_dly_cfg[N_BD_DLY_CFG], bd_dly_cfg2[N_BD_DLY_CFG2];
|
||||||
|
bool? loopback_en;
|
||||||
|
|
||||||
|
avMx1of2<30> out_sram_wr; // Input packets to go to SRAM (rw word addr)
|
||||||
|
avMx1of2<8> out_sram_spk; // Spike packets from enc to go to SRAM (core-nrn addr)
|
||||||
|
avMx1of2<15> in_sram_r; // Readout packets from SRAM (data only)
|
||||||
|
avMx1of2<14> in_sram_spk // Spike packets from SRAM (core-syn addr)
|
||||||
|
|
||||||
|
|
||||||
|
){
|
||||||
|
|
||||||
|
bool _reset_B;
|
||||||
|
prs {
|
||||||
|
Reset => _reset_B-
|
||||||
|
}
|
||||||
|
power supply;
|
||||||
|
supply.vdd = Vdd;
|
||||||
|
supply.vss = GND;
|
||||||
|
|
||||||
|
texel_dualcore_mapper<N_IN,
|
||||||
|
N_NRN_X, N_NRN_Y, N_SYN_X, N_SYN_Y,
|
||||||
|
NC_NRN_X, NC_NRN_Y, NC_SYN_X, NC_SYN_Y,
|
||||||
|
N_SYN_DLY_CFG,
|
||||||
|
N_NRN_MON_X, N_NRN_MON_Y, N_SYN_MON_X, N_SYN_MON_Y,
|
||||||
|
N_MON_AMZO_PER_SYN, N_MON_AMZO_PER_NRN,
|
||||||
|
N_FLAGS_PER_SYN, N_FLAGS_PER_NRN,
|
||||||
|
N_BUFFERS,
|
||||||
|
N_LINE_PD_DLY,
|
||||||
|
N_BD_DLY_CFG, N_BD_DLY_CFG2,
|
||||||
|
REG_NCA, REG_NCW, REG_M> c(.in = in, .out = out,
|
||||||
|
.c1_reg_data = c1_reg_data, .c1_dec_req_x = c1_dec_req_x, .c1_dec_req_y = c1_dec_req_y, .c1_dec_ackB = c1_dec_ackB, .c1_syn_pu = c1_syn_pu, .c1_enc_inx = c1_enc_inx, .c1_enc_iny = c1_enc_iny, .c1_nrn_pd_x = c1_nrn_pd_x, .c1_nrn_pd_y = c1_nrn_pd_y, .c1_nrn_mon_x = c1_nrn_mon_x, .c1_nrn_mon_y = c1_nrn_mon_y, .c1_syn_mon_x = c1_syn_mon_x, .c1_syn_mon_y = c1_syn_mon_y, .c1_syn_mon_AMZI = c1_syn_mon_AMZI, .c1_nrn_mon_AMZI = c1_nrn_mon_AMZI, .c1_syn_mon_AMZO = c1_syn_mon_AMZO, .c1_nrn_mon_AMZO = c1_nrn_mon_AMZO, .c1_syn_flags_EFO = c1_syn_flags_EFO, .c1_nrn_flags_EFO = c1_nrn_flags_EFO, .c1_reset_nrn_hs_BO = c1_reset_nrn_hs_BO, .c1_reset_syn_hs_BO = c1_reset_syn_hs_BO, .c1_reset_nrn_stge_BO = c1_reset_nrn_stge_BO, .c1_reset_syn_stge_BO = c1_reset_syn_stge_BO, .c2_reg_data = c2_reg_data, .c2_dec_req_x = c2_dec_req_x, .c2_dec_req_y = c2_dec_req_y, .c2_dec_ackB = c2_dec_ackB, .c2_syn_pu = c2_syn_pu, .c2_enc_inx = c2_enc_inx, .c2_enc_iny = c2_enc_iny, .c2_nrn_pd_x = c2_nrn_pd_x, .c2_nrn_pd_y = c2_nrn_pd_y, .c2_nrn_mon_x = c2_nrn_mon_x, .c2_nrn_mon_y = c2_nrn_mon_y, .c2_syn_mon_x = c2_syn_mon_x, .c2_syn_mon_y = c2_syn_mon_y, .c2_syn_mon_AMZI = c2_syn_mon_AMZI, .c2_nrn_mon_AMZI = c2_nrn_mon_AMZI, .c2_syn_mon_AMZO = c2_syn_mon_AMZO, .c2_nrn_mon_AMZO = c2_nrn_mon_AMZO, .c2_syn_flags_EFO = c2_syn_flags_EFO, .c2_nrn_flags_EFO = c2_nrn_flags_EFO, .c2_reset_nrn_hs_BO = c2_reset_nrn_hs_BO, .c2_reset_syn_hs_BO = c2_reset_syn_hs_BO, .c2_reset_nrn_stge_BO = c2_reset_nrn_stge_BO, .c2_reset_syn_stge_BO = c2_reset_syn_stge_BO,
|
||||||
|
.bd_dly_cfg = bd_dly_cfg, .bd_dly_cfg2 = bd_dly_cfg2,
|
||||||
|
.loopback_en = loopback_en,
|
||||||
|
.out_sram_wr = out_sram_wr, .out_sram_spk = out_sram_spk,
|
||||||
|
.in_sram_r = in_sram_r, .in_sram_spk = in_sram_spk,
|
||||||
|
.reset_B = reset_B, .reset_reg_B = reset_reg_B, .reset_syn_stge_BI = reset_syn_stge_BI,
|
||||||
|
.supply = supply);
|
||||||
|
|
||||||
|
pint N_NRN = N_NRN_X * N_NRN_Y;
|
||||||
|
pint N_SYN_PER_NRN = (N_SYN_X * N_SYN_Y)/N_NRN;
|
||||||
|
dummy_neuron_core<N_SYN_PER_NRN, N_NRN, N_NRN_X> c1_dummy_neuron_core(.synapses = c1_synapses, .neurons = c1_neurons,
|
||||||
|
.supply = supply);
|
||||||
|
dummy_neuron_core<N_SYN_PER_NRN, N_NRN, N_NRN_X> c2_dummy_neuron_core(.synapses = c2_synapses, .neurons = c2_neurons,
|
||||||
|
.supply = supply);
|
||||||
|
|
||||||
|
decoder_2d_synapse_hs<N_SYN_X, N_SYN_Y> c1_syn_grid(
|
||||||
|
.synapses = c1_synapses,
|
||||||
|
.in_req_x = c1_dec_req_x, .in_req_y = c1_dec_req_y,
|
||||||
|
.to_pu = c1_syn_pu,
|
||||||
|
.out_ackB_decoder = c1_dec_ackB,
|
||||||
|
.supply = supply);
|
||||||
|
|
||||||
|
nrn_hs_2d_array<N_NRN_X,N_NRN_Y> c1_nrn_grid(.in = c1_neurons,
|
||||||
|
.outx = c1_enc_inx, .outy = c1_enc_iny,
|
||||||
|
.to_pd_x = c1_nrn_pd_x, .to_pd_y = c1_nrn_pd_y,
|
||||||
|
.supply = supply, .reset_B = _reset_B);
|
||||||
|
|
||||||
|
decoder_2d_synapse_hs<N_SYN_X, N_SYN_Y> c2_syn_grid(
|
||||||
|
.synapses = c2_synapses,
|
||||||
|
.in_req_x = c2_dec_req_x, .in_req_y = c2_dec_req_y,
|
||||||
|
.to_pu = c2_syn_pu,
|
||||||
|
.out_ackB_decoder = c2_dec_ackB,
|
||||||
|
.supply = supply);
|
||||||
|
|
||||||
|
nrn_hs_2d_array<N_NRN_X,N_NRN_Y> c2_nrn_grid(.in = c2_neurons,
|
||||||
|
.outx = c2_enc_inx, .outy = c2_enc_iny,
|
||||||
|
.to_pd_x = c2_nrn_pd_x, .to_pd_y = c2_nrn_pd_y,
|
||||||
|
.supply = supply, .reset_B = _reset_B);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// fifo_decoder_neurons_encoder_fifo e;
|
||||||
|
chip_texel_dualcore c;
|
7219
test/unit_tests/texel_dualcore_glue_mapper/test.prsim
Normal file
7219
test/unit_tests/texel_dualcore_glue_mapper/test.prsim
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user