OpenCores
URL https://opencores.org/ocsvn/async_sdm_noc/async_sdm_noc/trunk

Subversion Repositories async_sdm_noc

[/] [async_sdm_noc/] [branches/] [clos_opt/] [clos_opt/] [src/] [clos_buf.v] - Diff between revs 74 and 75

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 74 Rev 75
/*
/*
 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*/
   // Outputs
   // Outputs
   so0, so1, so2, so3, wo0, wo1, wo2, wo3, no0, no1, no2, no3, eo0,
   so0, so1, so2, so3, wo0, wo1, wo2, wo3, no0, no1, no2, no3, eo0,
   eo1, eo2, eo3, lo0, lo1, lo2, lo3, so4, wo4, no4, eo4, lo4, sia,
   eo1, eo2, eo3, lo0, lo1, lo2, lo3, so4, wo4, no4, eo4, lo4, sia,
   wia, nia, eia, lia,
   wia, nia, eia, lia,
   // Inputs
   // Inputs
   si0, si1, si2, si3, wi0, wi1, wi2, wi3, ni0, ni1, ni2, ni3, ei0,
   si0, si1, si2, si3, wi0, wi1, wi2, wi3, ni0, ni1, ni2, ni3, ei0,
   ei1, ei2, ei3, li0, li1, li2, li3, si4, wi4, ni4, ei4, li4, soa,
   ei1, ei2, ei3, li0, li1, li2, li3, si4, wi4, ni4, ei4, li4, soa,
   woa, noa, eoa, loa, soa4, woa4, noa4, eoa4, loa4, sdec, ndec, ldec,
   woa, noa, eoa, loa, soa4, woa4, noa4, eoa4, loa4, sdec, ndec, ldec,
   wdec, edec
   wdec, edec, rst_n
   );
   );
 
 
   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
 
 
 
   input                       rst_n; // global active low reset
 
 
   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 so0[i] = cmo0[i][0];
         assign so1[i] = cmo1[i][0];
         assign so1[i] = cmo1[i][0];
         assign so2[i] = cmo2[i][0];
         assign so2[i] = cmo2[i][0];
         assign so3[i] = cmo3[i][0];
         assign so3[i] = cmo3[i][0];
         assign cmoa[i][0] = soa[i];
         assign cmoa[i][0] = soa[i];
         assign cmoa[i][0] = soa4[i];
         assign cmoa[i][0] = soa4[i];
 
 
         assign wo0[i] = cmo0[i][1];
         assign wo0[i] = cmo0[i][1];
         assign wo1[i] = cmo1[i][1];
         assign wo1[i] = cmo1[i][1];
         assign wo2[i] = cmo2[i][1];
         assign wo2[i] = cmo2[i][1];
         assign wo3[i] = cmo3[i][1];
         assign wo3[i] = cmo3[i][1];
         assign cmoa[i][1] = woa[i];
         assign cmoa[i][1] = woa[i];
         assign cmoa[i][1] = woa4[i];
         assign cmoa[i][1] = woa4[i];
 
 
         assign no0[i] = cmo0[i][2];
         assign no0[i] = cmo0[i][2];
         assign no1[i] = cmo1[i][2];
         assign no1[i] = cmo1[i][2];
         assign no2[i] = cmo2[i][2];
         assign no2[i] = cmo2[i][2];
         assign no3[i] = cmo3[i][2];
         assign no3[i] = cmo3[i][2];
         assign cmoa[i][2] = noa[i];
         assign cmoa[i][2] = noa[i];
         assign cmoa[i][2] = noa4[i];
         assign cmoa[i][2] = noa4[i];
 
 
         assign eo0[i] = cmo0[i][3];
         assign eo0[i] = cmo0[i][3];
         assign eo1[i] = cmo1[i][3];
         assign eo1[i] = cmo1[i][3];
         assign eo2[i] = cmo2[i][3];
         assign eo2[i] = cmo2[i][3];
         assign eo3[i] = cmo3[i][3];
         assign eo3[i] = cmo3[i][3];
         assign cmoa[i][3] = eoa[i];
         assign cmoa[i][3] = eoa[i];
         assign cmoa[i][3] = eoa4[i];
         assign cmoa[i][3] = eoa4[i];
 
 
         assign lo0[i] = cmo0[i][4];
         assign lo0[i] = cmo0[i][4];
         assign lo1[i] = cmo1[i][4];
         assign lo1[i] = cmo1[i][4];
         assign lo2[i] = cmo2[i][4];
         assign lo2[i] = cmo2[i][4];
         assign lo3[i] = cmo3[i][4];
         assign lo3[i] = cmo3[i][4];
         assign cmoa[i][4] = loa[i];
         assign cmoa[i][4] = loa[i];
         assign cmoa[i][4] = loa4[i];
         assign cmoa[i][4] = loa4[i];
 
 
      end
      end
   endgenerate
   endgenerate
 
 
 
 
endmodule // clos
endmodule // clos
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.