disentangled neurons and pull downs
This commit is contained in:
parent
351b3ea151
commit
bb63182694
|
@ -116,13 +116,16 @@ defproc texel_core (avMx1of2<N_IN> in, out;
|
||||||
// Neurons + encoder
|
// Neurons + encoder
|
||||||
pint NC_NRN;
|
pint NC_NRN;
|
||||||
NC_NRN = NC_NRN_X + NC_NRN_Y;
|
NC_NRN = NC_NRN_X + NC_NRN_Y;
|
||||||
nrn_hs_2d_array<N_NRN_X,N_NRN_Y,N_LINE_PD_DLY> nrn_grid(.in = neurons,
|
encoder2d_simple<NC_NRN_X, NC_NRN_Y, N_NRN_X, N_NRN_Y, N_LINE_PD_DLY> encoder(
|
||||||
|
.reset_B = _reset_BX, .supply = supply);
|
||||||
|
|
||||||
|
// Neuron handshake circuits, to be removed for innovus
|
||||||
|
nrn_hs_2d_array<N_NRN_X,N_NRN_Y> nrn_grid(.in = neurons,
|
||||||
|
.outx = encoder.inx, .outy = encoder.iny,
|
||||||
|
.to_pd_x = encoder.to_pd_x, .to_pd_y = encoder.to_pd_y,
|
||||||
.supply = supply, .reset_B = _reset_BX);
|
.supply = supply, .reset_B = _reset_BX);
|
||||||
encoder2d_simple<NC_NRN_X, NC_NRN_Y, N_NRN_X, N_NRN_Y> encoder(
|
|
||||||
.inx = nrn_grid.outx,
|
|
||||||
.iny = nrn_grid.outy,
|
|
||||||
.reset_B = _reset_BX, .supply = supply
|
|
||||||
);
|
|
||||||
fifo<NC_NRN, N_BUFFERS> fifo_enc2mrg(.in = encoder.out,
|
fifo<NC_NRN, N_BUFFERS> fifo_enc2mrg(.in = encoder.out,
|
||||||
.reset_B = _reset_BX, .supply = supply);
|
.reset_B = _reset_BX, .supply = supply);
|
||||||
|
|
||||||
|
@ -139,7 +142,6 @@ defproc texel_core (avMx1of2<N_IN> in, out;
|
||||||
.reset_B = _reset_BX, .supply = supply);
|
.reset_B = _reset_BX, .supply = supply);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Neuron/synapse monitor targeters
|
// Neuron/synapse monitor targeters
|
||||||
pint NC_NRN_MON_X = std::ceil_log2(N_NRN_MON_X);
|
pint NC_NRN_MON_X = std::ceil_log2(N_NRN_MON_X);
|
||||||
pint NC_NRN_MON_Y = std::ceil_log2(N_NRN_MON_Y);
|
pint NC_NRN_MON_Y = std::ceil_log2(N_NRN_MON_Y);
|
||||||
|
|
|
@ -752,7 +752,7 @@ defproc decoder_2d_hybrid (avMx1of2<NxC+NyC> in; bool! out_req_x[Nx], out_req_y[
|
||||||
|
|
||||||
|
|
||||||
export template<pint NxC, NyC, Nx, Ny, ACK_STRENGTH>
|
export template<pint NxC, NyC, Nx, Ny, ACK_STRENGTH>
|
||||||
defproc encoder2d(a1of1 inx[Nx]; a1of1 iny[Ny]; avMx1of2<(NxC + NyC)> out; power supply; bool reset_B) {
|
defproc encoder2d(a1of1 inx[Nx]; a1of1 iny[Ny]; avMx1of2<(NxC + NyC)> out; power supply; bool reset_B) {
|
||||||
// Reset buffers
|
// Reset buffers
|
||||||
pint H = 2*(NxC + NyC); //Reset strength? to be investigated
|
pint H = 2*(NxC + NyC); //Reset strength? to be investigated
|
||||||
|
|
||||||
|
@ -882,8 +882,20 @@ defproc decoder_2d_hybrid (avMx1of2<NxC+NyC> in; bool! out_req_x[Nx], out_req_y[
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
export template<pint NxC, NyC, Nx, Ny>
|
export
|
||||||
|
defproc nrn_line_end_pull_down (bool? in; bool? reset_B; power supply; bool! out)
|
||||||
|
{
|
||||||
|
INV_X1 inv(.a = reset_B, .vdd=supply.vdd,.vss =supply.vss);
|
||||||
|
|
||||||
|
A_1N_U_X4 pull_down(.n1=in, .y=out);
|
||||||
|
A_1N_U_X4 pull_downR(.n1=inv.y, .y=out);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
export template<pint NxC, NyC, Nx, Ny, N_dly>
|
||||||
defproc encoder2d_simple(a1of1 inx[Nx]; a1of1 iny[Ny]; avMx1of2<(NxC + NyC)> out;
|
defproc encoder2d_simple(a1of1 inx[Nx]; a1of1 iny[Ny]; avMx1of2<(NxC + NyC)> out;
|
||||||
|
a1of1 to_pd_x[Nx], to_pd_y[Ny]; // Ports for the line end pull downs to tap into
|
||||||
power supply; bool reset_B) {
|
power supply; bool reset_B) {
|
||||||
|
|
||||||
bool _a_x, _a_y;
|
bool _a_x, _a_y;
|
||||||
|
@ -933,6 +945,55 @@ defproc decoder_2d_hybrid (avMx1of2<NxC+NyC> in; bool! out_req_x[Nx], out_req_y[
|
||||||
Yenc.out.d[i] = buf.in.d.d[i+NxC];
|
Yenc.out.d[i] = buf.in.d.d[i+NxC];
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
// Line pull down stuff
|
||||||
|
// Create delay fifos to emulate the fact that the line pull downs
|
||||||
|
// are at the end of the line, and thus slow.
|
||||||
|
// Note that if N_dly = 0, delay fifo is just a pipe.
|
||||||
|
delay_chain<N_dly> dly_x[Nx];
|
||||||
|
delay_chain<N_dly> dly_y[Ny];
|
||||||
|
|
||||||
|
// Create x line req pull downs
|
||||||
|
nrn_line_end_pull_down pd_x[Nx];
|
||||||
|
sigbuf<Nx> rsb_pd_x(.in = reset_B, .supply = supply);
|
||||||
|
(i:0..Nx-1:
|
||||||
|
dly_x[i].supply = supply;
|
||||||
|
dly_x[i].in = to_pd_x[i].a;
|
||||||
|
pd_x[i].in = dly_x[i].out;
|
||||||
|
|
||||||
|
pd_x[i].out = to_pd_x[i].r;
|
||||||
|
pd_x[i].reset_B = rsb_pd_x.out[i];
|
||||||
|
pd_x[i].supply = supply;
|
||||||
|
)
|
||||||
|
|
||||||
|
// Create y line req pull downs
|
||||||
|
nrn_line_end_pull_down pd_y[Ny];
|
||||||
|
sigbuf<Ny> rsb_pd_y(.in = reset_B, .supply = supply);
|
||||||
|
(j:0..Ny-1:
|
||||||
|
dly_y[j].supply = supply;
|
||||||
|
dly_y[j].in = to_pd_y[j].a;
|
||||||
|
pd_y[j].in = dly_y[j].out;
|
||||||
|
|
||||||
|
pd_y[j].out = to_pd_y[j].r;
|
||||||
|
pd_y[j].reset_B = rsb_pd_y.out[j];
|
||||||
|
pd_y[j].supply = supply;
|
||||||
|
)
|
||||||
|
|
||||||
|
// Add keeps
|
||||||
|
KEEP keep_x[Nx];
|
||||||
|
(i:Nx:
|
||||||
|
keep_x[i].vdd = supply.vdd;
|
||||||
|
keep_x[i].vss = supply.vss;
|
||||||
|
keep_x[i].y = inx[i].r;
|
||||||
|
)
|
||||||
|
|
||||||
|
KEEP keep_y[Ny];
|
||||||
|
(j:Ny:
|
||||||
|
keep_y[j].vdd = supply.vdd;
|
||||||
|
keep_y[j].vss = supply.vss;
|
||||||
|
keep_y[j].y = iny[j].r;
|
||||||
|
)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export template<pint Nc, N>
|
export template<pint Nc, N>
|
||||||
|
@ -1025,30 +1086,6 @@ defproc decoder_2d_hybrid (avMx1of2<NxC+NyC> in; bool! out_req_x[Nx], out_req_y[
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// export
|
|
||||||
// defproc nrn_line_end_pull_down (bool? in; bool? reset_B; power supply; bool! out)
|
|
||||||
// {
|
|
||||||
// bool _out, __out, nand_out;
|
|
||||||
// BUF_X1 buf1(.a=in, .y=_out, .vdd=supply.vdd,.vss=supply.vss);
|
|
||||||
// BUF_X1 buf2(.a=_out, .y=__out, .vdd=supply.vdd,.vss=supply.vss);
|
|
||||||
// INV_X1 inv(.a = __out, .vdd=supply.vdd,.vss =supply.vss);
|
|
||||||
|
|
||||||
// NAND2_X1 aenor(.a=inv.y, .b=reset_B, .y = nand_out, .vdd=supply.vdd,.vss=supply.vss);
|
|
||||||
|
|
||||||
// A_1N_U_X4 pull_down(.a=nand_out, .y=out);
|
|
||||||
// }
|
|
||||||
|
|
||||||
export
|
|
||||||
defproc nrn_line_end_pull_down (bool? in; bool? reset_B; power supply; bool! out)
|
|
||||||
{
|
|
||||||
INV_X1 inv(.a = reset_B, .vdd=supply.vdd,.vss =supply.vss);
|
|
||||||
|
|
||||||
A_1N_U_X4 pull_down(.n1=in, .y=out);
|
|
||||||
A_1N_U_X4 pull_downR(.n1=inv.y, .y=out);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A 2d grid of neuron handshakers.
|
* A 2d grid of neuron handshakers.
|
||||||
* Should then slot into the encoder.
|
* Should then slot into the encoder.
|
||||||
|
@ -1057,8 +1094,9 @@ defproc decoder_2d_hybrid (avMx1of2<NxC+NyC> in; bool! out_req_x[Nx], out_req_y[
|
||||||
* for the purpose of running ACT sims.
|
* for the purpose of running ACT sims.
|
||||||
* It should probably be set to 0 though.
|
* It should probably be set to 0 though.
|
||||||
*/
|
*/
|
||||||
export template<pint Nx, Ny, N_dly>
|
export template<pint Nx, Ny>
|
||||||
defproc nrn_hs_2d_array(a1of1 in[Nx*Ny]; a1of1 outx[Nx], outy[Ny];
|
defproc nrn_hs_2d_array(a1of1 in[Nx*Ny]; a1of1 outx[Nx], outy[Ny];
|
||||||
|
a1of1 to_pd_x[Nx], to_pd_y[Ny];
|
||||||
power supply; bool reset_B) {
|
power supply; bool reset_B) {
|
||||||
|
|
||||||
// Make hella signal buffers
|
// Make hella signal buffers
|
||||||
|
@ -1085,10 +1123,8 @@ defproc decoder_2d_hybrid (avMx1of2<NxC+NyC> in; bool! out_req_x[Nx], out_req_y[
|
||||||
out_req_buf_y[i].a = _outy[i].r;
|
out_req_buf_y[i].a = _outy[i].r;
|
||||||
out_req_buf_y[i].y = outy[i].r;
|
out_req_buf_y[i].y = outy[i].r;
|
||||||
)
|
)
|
||||||
|
|
||||||
// Add buffers on output ack lines
|
// Add buffers on output ack lines
|
||||||
// Note that this should be generalised.
|
|
||||||
// And probably won't even be done by ACT/innovus anwyay
|
|
||||||
// TODO: do it properly with sigbufs?
|
|
||||||
BUF_X12 out_ack_buf_x[Nx];
|
BUF_X12 out_ack_buf_x[Nx];
|
||||||
(i:Nx:
|
(i:Nx:
|
||||||
out_ack_buf_x[i].vss = supply.vss;
|
out_ack_buf_x[i].vss = supply.vss;
|
||||||
|
@ -1120,52 +1156,11 @@ defproc decoder_2d_hybrid (avMx1of2<NxC+NyC> in; bool! out_req_x[Nx], out_req_y[
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
// Create delay fifos to emulate the fact that the line pull downs
|
// Pipe the ack/req lines through to the pulldowns
|
||||||
// are at the end of the line, and thus slow.
|
to_pd_x = _outx;
|
||||||
// Note that if N_dly = 0, delay fifo is just a pipe.
|
to_pd_y = _outy;
|
||||||
delay_chain<N_dly> dly_x[Nx];
|
|
||||||
delay_chain<N_dly> dly_y[Ny];
|
|
||||||
|
|
||||||
// Create x line req pull downs
|
|
||||||
nrn_line_end_pull_down pd_x[Nx];
|
|
||||||
sigbuf<Nx> rsb_pd_x(.in = reset_B, .supply = supply);
|
|
||||||
(i:0..Nx-1:
|
|
||||||
dly_x[i].supply = supply;
|
|
||||||
dly_x[i].in = _outx[i].a;
|
|
||||||
pd_x[i].in = dly_x[i].out;
|
|
||||||
|
|
||||||
pd_x[i].out = _outx[i].r;
|
|
||||||
pd_x[i].reset_B = rsb_pd_x.out[i];
|
|
||||||
pd_x[i].supply = supply;
|
|
||||||
)
|
|
||||||
|
|
||||||
// Create y line req pull downs
|
|
||||||
nrn_line_end_pull_down pd_y[Ny];
|
|
||||||
sigbuf<Ny> rsb_pd_y(.in = reset_B, .supply = supply);
|
|
||||||
(j:0..Ny-1:
|
|
||||||
dly_y[j].supply = supply;
|
|
||||||
dly_y[j].in = _outy[j].a;
|
|
||||||
pd_y[j].in = dly_y[j].out;
|
|
||||||
|
|
||||||
pd_y[j].out = _outy[j].r;
|
|
||||||
pd_y[j].reset_B = rsb_pd_y.out[j];
|
|
||||||
pd_y[j].supply = supply;
|
|
||||||
)
|
|
||||||
|
|
||||||
// Add keeps
|
|
||||||
KEEP keep_x[Nx];
|
|
||||||
(i:Nx:
|
|
||||||
keep_x[i].vdd = supply.vdd;
|
|
||||||
keep_x[i].vss = supply.vss;
|
|
||||||
keep_x[i].y = _outx[i].r;
|
|
||||||
)
|
|
||||||
|
|
||||||
KEEP keep_y[Ny];
|
|
||||||
(j:Ny:
|
|
||||||
keep_y[j].vdd = supply.vdd;
|
|
||||||
keep_y[j].vss = supply.vss;
|
|
||||||
keep_y[j].y = _outy[j].r;
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue