/*
|
/*
|
Asynchronous SDM NoC
|
Asynchronous SDM NoC
|
(C)2011 Wei Song
|
(C)2011 Wei Song
|
Advanced Processor Technologies Group
|
Advanced Processor Technologies Group
|
Computer Science, the Univ. of Manchester, UK
|
Computer Science, the Univ. of Manchester, UK
|
|
|
Authors:
|
Authors:
|
Wei Song wsong83@gmail.com
|
Wei Song wsong83@gmail.com
|
|
|
License: LGPL 3.0 or later
|
License: LGPL 3.0 or later
|
|
|
Buffered Clos switch for SDM-Clos routers
|
Buffered Clos switch for SDM-Clos routers
|
*** SystemVerilog is used ***
|
*** SystemVerilog is used ***
|
|
|
History:
|
History:
|
09/07/2011 Initial version. <wsong83@gmail.com>
|
09/07/2011 Initial version. <wsong83@gmail.com>
|
|
|
*/
|
*/
|
|
|
// the router structure definitions
|
// the router structure definitions
|
`include "define.v"
|
`include "define.v"
|
|
|
module clos (/*AUTOARG*/);
|
module clos (/*AUTOARG*/);
|
|
|
parameter MN = 2; // number of CMs
|
parameter MN = 2; // number of CMs
|
parameter NN = 2; // number of ports in an IM or OM, equ. to number of virtual circuits
|
parameter NN = 2; // number of ports in an IM or OM, equ. to number of virtual circuits
|
parameter DW = 8; // datawidth of a single virtual circuit/port
|
parameter DW = 8; // datawidth of a single virtual circuit/port
|
parameter SCN = DW/2; // number of 1-of-4 sub-channels in one port
|
parameter SCN = DW/2; // number of 1-of-4 sub-channels in one port
|
|
|
input [NN-1:0][SCN-1:0] si0, si1, si2, si3; // south input [0], X+1
|
input [NN-1:0][SCN-1:0] si0, si1, si2, si3; // south input [0], X+1
|
input [NN-1:0][SCN-1:0] wi0, wi1, wi2, wi3; // west input [1], Y-1
|
input [NN-1:0][SCN-1:0] wi0, wi1, wi2, wi3; // west input [1], Y-1
|
input [NN-1:0][SCN-1:0] ni0, ni1, ni2, ni3; // north input [2], X-1
|
input [NN-1:0][SCN-1:0] ni0, ni1, ni2, ni3; // north input [2], X-1
|
input [NN-1:0][SCN-1:0] ei0, ei1, ei2, ei3; // east input [3], Y+1
|
input [NN-1:0][SCN-1:0] ei0, ei1, ei2, ei3; // east input [3], Y+1
|
input [NN-1:0][SCN-1:0] li0, li1, li2, li3; // local input
|
input [NN-1:0][SCN-1:0] li0, li1, li2, li3; // local input
|
output [NN-1:0][SCN-1:0] so0, so1, so2, so3; // south output
|
output [NN-1:0][SCN-1:0] so0, so1, so2, so3; // south output
|
output [NN-1:0][SCN-1:0] wo0, wo1, wo2, wo3; // west output
|
output [NN-1:0][SCN-1:0] wo0, wo1, wo2, wo3; // west output
|
output [NN-1:0][SCN-1:0] no0, no1, no2, no3; // north output
|
output [NN-1:0][SCN-1:0] no0, no1, no2, no3; // north output
|
output [NN-1:0][SCN-1:0] eo0, eo1, eo2, eo3; // east output
|
output [NN-1:0][SCN-1:0] eo0, eo1, eo2, eo3; // east output
|
output [NN-1:0][SCN-1:0] lo0, lo1, lo2, lo3; // local output
|
output [NN-1:0][SCN-1:0] lo0, lo1, lo2, lo3; // local output
|
|
|
// eof bits and ack lines
|
// eof bits and ack lines
|
`ifdef ENABLE_CHANNEL_SLICING
|
`ifdef ENABLE_CHANNEL_SLICING
|
input [NN-1:0][SCN-1:0] si4, wi4, ni4, ei4, li4;
|
input [NN-1:0][SCN-1:0] si4, wi4, ni4, ei4, li4;
|
output [NN-1:0][SCN-1:0] so4, wo4, no4, eo4, lo4;
|
output [NN-1:0][SCN-1:0] so4, wo4, no4, eo4, lo4;
|
output [NN-1:0][SCN-1:0] sia, wia, nia, eia, lia;
|
output [NN-1:0][SCN-1:0] sia, wia, nia, eia, lia;
|
input [NN-1:0][SCN-1:0] soa, woa, noa, eoa, loa;
|
input [NN-1:0][SCN-1:0] soa, woa, noa, eoa, loa;
|
`ifdef ENABLE_BUFFERED_CLOS
|
`ifdef ENABLE_BUFFERED_CLOS
|
input [NN-1:0][SCN-1:0] soa4, woa4, noa4, eoa4, loa4; // the eof ack from output buffers
|
input [NN-1:0][SCN-1:0] soa4, woa4, noa4, eoa4, loa4; // the eof ack from output buffers
|
`endif
|
`endif
|
`else
|
`else
|
input [NN-1:0] si4, wi4, ni4, ei4, li4;
|
input [NN-1:0] si4, wi4, ni4, ei4, li4;
|
output [NN-1:0] so4, wo4, no4, eo4, lo4;
|
output [NN-1:0] so4, wo4, no4, eo4, lo4;
|
output [NN-1:0] sia, wia, nia, eia, lia;
|
output [NN-1:0] sia, wia, nia, eia, lia;
|
input [NN-1:0] soa, woa, noa, eoa, loa;
|
input [NN-1:0] soa, woa, noa, eoa, loa;
|
`ifdef ENABLE_BUFFERED_CLOS
|
`ifdef ENABLE_BUFFERED_CLOS
|
input [NN-1:0] soa4, woa4, noa4, eoa4, loa4; // the eof ack from output buffers
|
input [NN-1:0] soa4, woa4, noa4, eoa4, loa4; // the eof ack from output buffers
|
`endif
|
`endif
|
`endif // !`ifdef ENABLE_CHANNEL_SLICING
|
`endif // !`ifdef ENABLE_CHANNEL_SLICING
|
|
|
input [NN-1:0][3:0] sdec, ndec, ldec; // the routing requests
|
input [NN-1:0][3:0] sdec, ndec, ldec; // the routing requests
|
input [NN-1:0][1:0] wdec, edec; // the routing requests
|
input [NN-1:0][1:0] wdec, edec; // the routing requests
|
|
|
genvar i,j;
|
genvar i,j;
|
|
|
|
|
// the IMs
|
// the IMs
|
im #(.MN(MN), .NN(NN), .DW(DW), .SN(4))
|
im #(.MN(MN), .NN(NN), .DW(DW), .SN(4))
|
SIM (
|
SIM (
|
.do0 ( sim0 ),
|
.do0 ( sim0 ),
|
.do1 ( sim1 ),
|
.do1 ( sim1 ),
|
.do2 ( sim2 ),
|
.do2 ( sim2 ),
|
.do3 ( sim3 ),
|
.do3 ( sim3 ),
|
.deco ( simdec ),
|
.deco ( simdec ),
|
.dia ( sia ),
|
.dia ( sia ),
|
.do4 ( sim4 ),
|
.do4 ( sim4 ),
|
.di0 ( si0 ),
|
.di0 ( si0 ),
|
.di1 ( si1 ),
|
.di1 ( si1 ),
|
.di2 ( si2 ),
|
.di2 ( si2 ),
|
.di3 ( si3 ),
|
.di3 ( si3 ),
|
.deci ( sdec ),
|
.deci ( sdec ),
|
.di4 ( si4 ),
|
.di4 ( si4 ),
|
.doa ( sima ),
|
.doa ( sima ),
|
`ifndef ENABLE_CRRD
|
`ifndef ENABLE_CRRD
|
.cms ( sims ),
|
.cms ( sims ),
|
`endif
|
`endif
|
.rst_n ( rst_n )
|
.rst_n ( rst_n )
|
);
|
);
|
|
|
im #(.MN(MN), .NN(NN), .DW(DW), .SN(2))
|
im #(.MN(MN), .NN(NN), .DW(DW), .SN(2))
|
WIM (
|
WIM (
|
.do0 ( wim0 ),
|
.do0 ( wim0 ),
|
.do1 ( wim1 ),
|
.do1 ( wim1 ),
|
.do2 ( wim2 ),
|
.do2 ( wim2 ),
|
.do3 ( wim3 ),
|
.do3 ( wim3 ),
|
.deco ( wimdec ),
|
.deco ( wimdec ),
|
.dia ( wia ),
|
.dia ( wia ),
|
.do4 ( wim4 ),
|
.do4 ( wim4 ),
|
.di0 ( wi0 ),
|
.di0 ( wi0 ),
|
.di1 ( wi1 ),
|
.di1 ( wi1 ),
|
.di2 ( wi2 ),
|
.di2 ( wi2 ),
|
.di3 ( wi3 ),
|
.di3 ( wi3 ),
|
.deci ( wdec ),
|
.deci ( wdec ),
|
.di4 ( wi4 ),
|
.di4 ( wi4 ),
|
.doa ( wima ),
|
.doa ( wima ),
|
`ifndef ENABLE_CRRD
|
`ifndef ENABLE_CRRD
|
.cms ( wims ),
|
.cms ( wims ),
|
`endif
|
`endif
|
.rst_n ( rst_n )
|
.rst_n ( rst_n )
|
);
|
);
|
|
|
im #(.MN(MN), .NN(NN), .DW(DW), .SN(4))
|
im #(.MN(MN), .NN(NN), .DW(DW), .SN(4))
|
NIM (
|
NIM (
|
.do0 ( nim0 ),
|
.do0 ( nim0 ),
|
.do1 ( nim1 ),
|
.do1 ( nim1 ),
|
.do2 ( nim2 ),
|
.do2 ( nim2 ),
|
.do3 ( nim3 ),
|
.do3 ( nim3 ),
|
.deco ( nimdec ),
|
.deco ( nimdec ),
|
.dia ( nia ),
|
.dia ( nia ),
|
.do4 ( nim4 ),
|
.do4 ( nim4 ),
|
.di0 ( ni0 ),
|
.di0 ( ni0 ),
|
.di1 ( ni1 ),
|
.di1 ( ni1 ),
|
.di2 ( ni2 ),
|
.di2 ( ni2 ),
|
.di3 ( ni3 ),
|
.di3 ( ni3 ),
|
.deci ( ndec ),
|
.deci ( ndec ),
|
.di4 ( ni4 ),
|
.di4 ( ni4 ),
|
.doa ( nima ),
|
.doa ( nima ),
|
`ifndef ENABLE_CRRD
|
`ifndef ENABLE_CRRD
|
.cms ( nims ),
|
.cms ( nims ),
|
`endif
|
`endif
|
.rst_n ( rst_n )
|
.rst_n ( rst_n )
|
);
|
);
|
|
|
im #(.MN(MN), .NN(NN), .DW(DW), .SN(2))
|
im #(.MN(MN), .NN(NN), .DW(DW), .SN(2))
|
EIM (
|
EIM (
|
.do0 ( eim0 ),
|
.do0 ( eim0 ),
|
.do1 ( eim1 ),
|
.do1 ( eim1 ),
|
.do2 ( eim2 ),
|
.do2 ( eim2 ),
|
.do3 ( eim3 ),
|
.do3 ( eim3 ),
|
.deco ( eimdec ),
|
.deco ( eimdec ),
|
.dia ( eia ),
|
.dia ( eia ),
|
.do4 ( eim4 ),
|
.do4 ( eim4 ),
|
.di0 ( ei0 ),
|
.di0 ( ei0 ),
|
.di1 ( ei1 ),
|
.di1 ( ei1 ),
|
.di2 ( ei2 ),
|
.di2 ( ei2 ),
|
.di3 ( ei3 ),
|
.di3 ( ei3 ),
|
.deci ( edec ),
|
.deci ( edec ),
|
.di4 ( ei4 ),
|
.di4 ( ei4 ),
|
.doa ( eima ),
|
.doa ( eima ),
|
`ifndef ENABLE_CRRD
|
`ifndef ENABLE_CRRD
|
.cms ( eims ),
|
.cms ( eims ),
|
`endif
|
`endif
|
.rst_n ( rst_n )
|
.rst_n ( rst_n )
|
);
|
);
|
|
|
im #(.MN(MN), .NN(NN), .DW(DW), .SN(4))
|
im #(.MN(MN), .NN(NN), .DW(DW), .SN(4))
|
LIM (
|
LIM (
|
.do0 ( lim0 ),
|
.do0 ( lim0 ),
|
.do1 ( lim1 ),
|
.do1 ( lim1 ),
|
.do2 ( lim2 ),
|
.do2 ( lim2 ),
|
.do3 ( lim3 ),
|
.do3 ( lim3 ),
|
.deco ( limdec ),
|
.deco ( limdec ),
|
.dia ( lia ),
|
.dia ( lia ),
|
.do4 ( lim4 ),
|
.do4 ( lim4 ),
|
.di0 ( li0 ),
|
.di0 ( li0 ),
|
.di1 ( li1 ),
|
.di1 ( li1 ),
|
.di2 ( li2 ),
|
.di2 ( li2 ),
|
.di3 ( li3 ),
|
.di3 ( li3 ),
|
.deci ( ldec ),
|
.deci ( ldec ),
|
.di4 ( li4 ),
|
.di4 ( li4 ),
|
.doa ( lima ),
|
.doa ( lima ),
|
`ifndef ENABLE_CRRD
|
`ifndef ENABLE_CRRD
|
.cms ( lims ),
|
.cms ( lims ),
|
`endif
|
`endif
|
.rst_n ( rst_n )
|
.rst_n ( rst_n )
|
);
|
);
|
|
|
// data wire shuffle
|
// data wire shuffle
|
// the CMs
|
// the CMs
|
generate
|
generate
|
for(i=0; i<MN; i++) begin:CMSH
|
for(i=0; i<MN; i++) begin:CMSH
|
assign cmi0[i][0] = sim0[i];
|
assign cmi0[i][0] = sim0[i];
|
assign cmi1[i][0] = sim1[i];
|
assign cmi1[i][0] = sim1[i];
|
assign cmi2[i][0] = sim2[i];
|
assign cmi2[i][0] = sim2[i];
|
assign cmi3[i][0] = sim3[i];
|
assign cmi3[i][0] = sim3[i];
|
assign sima[i] = cmia[i][0];
|
assign sima[i] = cmia[i][0];
|
assign sima4[i] = cmia[i][0];
|
assign sima4[i] = cmia[i][0];
|
|
|
assign cmi0[i][1] = wim0[i];
|
assign cmi0[i][1] = wim0[i];
|
assign cmi1[i][1] = wim1[i];
|
assign cmi1[i][1] = wim1[i];
|
assign cmi2[i][1] = wim2[i];
|
assign cmi2[i][1] = wim2[i];
|
assign cmi3[i][1] = wim3[i];
|
assign cmi3[i][1] = wim3[i];
|
assign wima[i] = cmia[i][1];
|
assign wima[i] = cmia[i][1];
|
assign wima4[i] = cmia[i][1];
|
assign wima4[i] = cmia[i][1];
|
|
|
assign cmi0[i][2] = nim0[i];
|
assign cmi0[i][2] = nim0[i];
|
assign cmi1[i][2] = nim1[i];
|
assign cmi1[i][2] = nim1[i];
|
assign cmi2[i][2] = nim2[i];
|
assign cmi2[i][2] = nim2[i];
|
assign cmi3[i][2] = nim3[i];
|
assign cmi3[i][2] = nim3[i];
|
assign nima[i] = cmia[i][2];
|
assign nima[i] = cmia[i][2];
|
assign nima4[i] = cmia[i][2];
|
assign nima4[i] = cmia[i][2];
|
|
|
assign cmi0[i][3] = eim0[i];
|
assign cmi0[i][3] = eim0[i];
|
assign cmi1[i][3] = eim1[i];
|
assign cmi1[i][3] = eim1[i];
|
assign cmi2[i][3] = eim2[i];
|
assign cmi2[i][3] = eim2[i];
|
assign cmi3[i][3] = eim3[i];
|
assign cmi3[i][3] = eim3[i];
|
assign eima[i] = cmia[i][3];
|
assign eima[i] = cmia[i][3];
|
assign eima4[i] = cmia[i][3];
|
assign eima4[i] = cmia[i][3];
|
|
|
assign cmi0[i][4] = lim0[i];
|
assign cmi0[i][4] = lim0[i];
|
assign cmi1[i][4] = lim1[i];
|
assign cmi1[i][4] = lim1[i];
|
assign cmi2[i][4] = lim2[i];
|
assign cmi2[i][4] = lim2[i];
|
assign cmi3[i][4] = lim3[i];
|
assign cmi3[i][4] = lim3[i];
|
assign lima[i] = cmia[i][4];
|
assign lima[i] = cmia[i][4];
|
assign lima4[i] = cmia[i][4];
|
assign lima4[i] = cmia[i][4];
|
|
|
cm #(.KN(5), .DW(DW))
|
cm #(.KN(5), .DW(DW))
|
CMSW (
|
CMSW (
|
.do0 ( cmo0[i] ),
|
.do0 ( cmo0[i] ),
|
.do1 ( cmo1[i] ),
|
.do1 ( cmo1[i] ),
|
.do2 ( cmo2[i] ),
|
.do2 ( cmo2[i] ),
|
.do3 ( cmo3[i] ),
|
.do3 ( cmo3[i] ),
|
.dia ( cmia[i] ),
|
.dia ( cmia[i] ),
|
.do4 ( cmo4[i] ),
|
.do4 ( cmo4[i] ),
|
.di0 ( cmi0[i] ),
|
.di0 ( cmi0[i] ),
|
.di1 ( cmi1[i] ),
|
.di1 ( cmi1[i] ),
|
.di2 ( cmi2[i] ),
|
.di2 ( cmi2[i] ),
|
.di3 ( cmi3[i] ),
|
.di3 ( cmi3[i] ),
|
.sdec ( sdec[i] ),
|
.sdec ( sdec[i] ),
|
.ndec ( ndec[i] ),
|
.ndec ( ndec[i] ),
|
.ldec ( ldec[i] ),
|
.ldec ( ldec[i] ),
|
.wdec ( wdec[i] ),
|
.wdec ( wdec[i] ),
|
.edec ( edec[i] ),
|
.edec ( edec[i] ),
|
.di4 ( cmi4[i] ),
|
.di4 ( cmi4[i] ),
|
.doa ( cmoa[i] ),
|
.doa ( cmoa[i] ),
|
.doa4 ( cmoa4[i] ),
|
.doa4 ( cmoa4[i] ),
|
`ifndef ENABLE_CRRD
|
`ifndef ENABLE_CRRD
|
.cms ( cms[i] ),
|
.cms ( cms[i] ),
|
`endif
|
`endif
|
.rst_n ( rst_n )
|
.rst_n ( rst_n )
|
);
|
);
|
|
|
|
assign so0[i] = cmo0[i][0];
|
|
assign so1[i] = cmo1[i][0];
|
|
assign so2[i] = cmo2[i][0];
|
|
assign so3[i] = cmo3[i][0];
|
|
assign cmoa[i][0] = soa[i];
|
|
assign cmoa[i][0] = soa4[i];
|
|
|
|
assign wo0[i] = cmo0[i][1];
|
|
assign wo1[i] = cmo1[i][1];
|
|
assign wo2[i] = cmo2[i][1];
|
|
assign wo3[i] = cmo3[i][1];
|
|
assign cmoa[i][1] = woa[i];
|
|
assign cmoa[i][1] = woa4[i];
|
|
|
|
assign no0[i] = cmo0[i][2];
|
|
assign no1[i] = cmo1[i][2];
|
|
assign no2[i] = cmo2[i][2];
|
|
assign no3[i] = cmo3[i][2];
|
|
assign cmoa[i][2] = noa[i];
|
|
assign cmoa[i][2] = noa4[i];
|
|
|
|
assign eo0[i] = cmo0[i][3];
|
|
assign eo1[i] = cmo1[i][3];
|
|
assign eo2[i] = cmo2[i][3];
|
|
assign eo3[i] = cmo3[i][3];
|
|
assign cmoa[i][3] = eoa[i];
|
|
assign cmoa[i][3] = eoa4[i];
|
|
|
|
assign lo0[i] = cmo0[i][4];
|
|
assign lo1[i] = cmo1[i][4];
|
|
assign lo2[i] = cmo2[i][4];
|
|
assign lo3[i] = cmo3[i][4];
|
|
assign cmoa[i][4] = loa[i];
|
|
assign cmoa[i][4] = loa4[i];
|
|
|
|
end
|
|
endgenerate
|
|
|
|
|
|
endmodule // clos
|
|
|
No newline at end of file
|
No newline at end of file
|