URL
https://opencores.org/ocsvn/async_sdm_noc/async_sdm_noc/trunk
Subversion Repositories async_sdm_noc
Compare Revisions
- This comparison shows the changes necessary to convert path
/async_sdm_noc
- from Rev 74 to Rev 75
- ↔ Reverse comparison
Rev 74 → Rev 75
/branches/clos_opt/clos_opt/src/dclos1.v
File deleted
\ No newline at end of file
/branches/clos_opt/clos_opt/src/clos_buf.v
29,7 → 29,7
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, |
woa, noa, eoa, loa, soa4, woa4, noa4, eoa4, loa4, sdec, ndec, ldec, |
wdec, edec |
wdec, edec, rst_n |
); |
|
parameter MN = 2; // number of CMs |
70,6 → 70,8
input [NN-1:0][3:0] sdec, ndec, ldec; // the routing requests |
input [NN-1:0][1:0] wdec, edec; // the routing requests |
|
input rst_n; // global active low reset |
|
genvar i,j; |
|
|
/branches/clos_opt/clos_opt/src/router.v
0,0 → 1,478
/* |
Asynchronous SDM NoC |
(C)2011 Wei Song |
Advanced Processor Technologies Group |
Computer Science, the Univ. of Manchester, UK |
|
Authors: |
Wei Song wsong83@gmail.com |
|
License: LGPL 3.0 or later |
|
Wormhole/SDM router top level module |
*** SystemVerilog is used *** |
|
History: |
28/05/2009 Initial version. <wsong83@gmail.com> |
23/09/2010 Supporting channel slicing and SDM using macro difinitions. <wsong83@gmail.com> |
22/10/2010 Parameterize the number of pipelines in output buffers. <wsong83@gmail.com> |
25/05/2011 Clean up for opensource. <wsong83@gmail.com> |
21/07/2011 Preparation for the buffered Clos switch. <wsong83@gmail.com> |
|
*/ |
|
// the router structure definitions |
`include "define.v" |
|
module router(/*AUTOARG*/ |
// Outputs |
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, |
wia, nia, eia, lia, |
// Inputs |
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, |
woa, noa, eoa, loa, addrx, addry, rst_n |
); |
|
parameter VCN = 1; // number of virtual circuits in each direction. When VCN == 1, it is a wormhole router |
parameter DW = 32; // the datawidth of a single virtual circuit, the total data width of the router is DW*VCN |
parameter IPD = 1; // the number of half-buffer stages in input buffers |
parameter OPD = 2; // the number of half-buffer stages in output buffers |
parameter SCN = DW/2; // the number of 1-of-4 sub-channel in each virtual circuit |
|
input [VCN-1:0][SCN-1:0] si0, si1, si2, si3; // south input [0], X+1 |
input [VCN-1:0][SCN-1:0] wi0, wi1, wi2, wi3; // west input [1], Y-1 |
input [VCN-1:0][SCN-1:0] ni0, ni1, ni2, ni3; // north input [2], X-1 |
input [VCN-1:0][SCN-1:0] ei0, ei1, ei2, ei3; // east input [3], Y+1 |
input [VCN-1:0][SCN-1:0] li0, li1, li2, li3; // local input |
output [VCN-1:0][SCN-1:0] so0, so1, so2, so3; // south output |
output [VCN-1:0][SCN-1:0] wo0, wo1, wo2, wo3; // west output |
output [VCN-1:0][SCN-1:0] no0, no1, no2, no3; // north output |
output [VCN-1:0][SCN-1:0] eo0, eo1, eo2, eo3; // east output |
output [VCN-1:0][SCN-1:0] lo0, lo1, lo2, lo3; // local output |
|
// eof bits and ack lines |
`ifdef ENABLE_CHANNEL_SLICING |
input [VCN-1:0][SCN-1:0] si4, wi4, ni4, ei4, li4; |
output [VCN-1:0][SCN-1:0] so4, wo4, no4, eo4, lo4; |
output [VCN-1:0][SCN-1:0] sia, wia, nia, eia, lia; |
input [VCN-1:0][SCN-1:0] soa, woa, noa, eoa, loa; |
`else |
input [VCN-1:0] si4, wi4, ni4, ei4, li4; |
output [VCN-1:0] so4, wo4, no4, eo4, lo4; |
output [VCN-1:0] sia, wia, nia, eia, lia; |
input [VCN-1:0] soa, woa, noa, eoa, loa; |
`endif // !`ifdef ENABLE_CHANNEL_SLICING |
|
input [7:0] addrx, addry; // the local address of the router, coded in 1-of-4 coding |
input rst_n; // active low reset signal |
|
// internal wires, input buffers to switches (crossbar): [dir]2[cb][1-of-4 index] |
wire [VCN-1:0][SCN-1:0] s2c0, s2c1, s2c2, s2c3; // south input to switch data |
wire [VCN-1:0][SCN-1:0] w2c0, w2c1, w2c2, w2c3; |
wire [VCN-1:0][SCN-1:0] n2c0, n2c1, n2c2, n2c3; |
wire [VCN-1:0][SCN-1:0] e2c0, e2c1, e2c2, e2c3; |
wire [VCN-1:0][SCN-1:0] l2c0, l2c1, l2c2, l2c3; |
// internal wires, switches (crossbar) to output buffers: [cb]2[dir][1-of-4 index] |
wire [VCN-1:0][SCN-1:0] c2s0, c2s1, c2s2, c2s3; |
wire [VCN-1:0][SCN-1:0] c2w0, c2w1, c2w2, c2w3; |
wire [VCN-1:0][SCN-1:0] c2n0, c2n1, c2n2, c2n3; // switch to north output |
wire [VCN-1:0][SCN-1:0] c2e0, c2e1, c2e2, c2e3; |
wire [VCN-1:0][SCN-1:0] c2l0, c2l1, c2l2, c2l3; |
|
// internal wires for ack and eof bits |
`ifdef ENABLE_CHANNEL_SLICING |
wire [VCN-1:0][SCN-1:0] s2c4, w2c4, n2c4, e2c4, l2c4; |
wire [VCN-1:0][SCN-1:0] c2s4, c2w4, c2n4, c2e4, c2l4; |
wire [VCN-1:0][SCN-1:0] s2ca, w2ca, n2ca, e2ca, l2ca; |
wire [VCN-1:0][SCN-1:0] c2sa, c2wa, c2na, c2ea, c2la; |
`else |
wire [VCN-1:0] s2c4, w2c4, n2c4, e2c4, l2c4; |
wire [VCN-1:0] c2s4, c2w4, c2n4, c2e4, c2l4; |
wire [VCN-1:0] s2ca, w2ca, n2ca, e2ca, l2ca; |
wire [VCN-1:0] c2sa, c2wa, c2na, c2ea, c2la; |
`endif // !`ifdef ENABLE_CHANNEL_SLICING |
|
// the requests/acks from/to input buffers to switch allocators |
wire [VCN-1:0][3:0] sreq, nreq, lreq; |
wire [VCN-1:0][1:0] wreq, ereq; |
wire [VCN-1:0] sack, wack, nack, eack, lack; |
|
// configuration bits for the switches |
`ifdef ENABLE_CLOS |
wire [4:0][VCN-1:0][VCN-1:0] imcfg; |
wire [VCN-1:0][1:0] scfg, ncfg; |
wire [VCN-1:0][3:0] wcfg, ecfg, lcfg; |
`else // normal crossbar based SDM |
wire [VCN-1:0][2*VCN-1:0] scfg, ncfg; |
wire [VCN-1:0][4*VCN-1:0] wcfg, ecfg, lcfg; |
`endif |
|
|
genvar i; |
|
generate |
for (i=0; i<VCN; i++) begin: SC |
|
// --------------- input buffers ------------------- // |
|
inp_buf #(.DIR(0), .RN(4), .DW(DW), .PD(IPD)) |
SIB ( |
.o0 ( s2c0[i] ), |
.o1 ( s2c1[i] ), |
.o2 ( s2c2[i] ), |
.o3 ( s2c3[i] ), |
.o4 ( s2c4[i] ), |
.ia ( sia[i] ), |
.deco ( sreq[i] ), |
.rst_n ( rst_n ), |
.i0 ( si0[i] ), |
.i1 ( si1[i] ), |
.i2 ( si2[i] ), |
.i3 ( si3[i] ), |
.i4 ( si4[i] ), |
.oa ( s2ca[i] ), |
.addrx ( addrx ), |
.addry ( addry ) |
); |
|
inp_buf #(.DIR(1), .RN(2), .DW(DW), .PD(IPD)) |
WIB ( |
.o0 ( w2c0[i] ), |
.o1 ( w2c1[i] ), |
.o2 ( w2c2[i] ), |
.o3 ( w2c3[i] ), |
.o4 ( w2c4[i] ), |
.ia ( wia[i] ), |
.deco ( wreq[i] ), |
.rst_n ( rst_n ), |
.i0 ( wi0[i] ), |
.i1 ( wi1[i] ), |
.i2 ( wi2[i] ), |
.i3 ( wi3[i] ), |
.i4 ( wi4[i] ), |
.oa ( w2ca[i] ), |
.addrx ( addrx ), |
.addry ( addry ) |
); |
|
inp_buf #(.DIR(2), .RN(4), .DW(DW), .PD(IPD)) |
NIB ( |
.o0 ( n2c0[i] ), |
.o1 ( n2c1[i] ), |
.o2 ( n2c2[i] ), |
.o3 ( n2c3[i] ), |
.o4 ( n2c4[i] ), |
.ia ( nia[i] ), |
.deco ( nreq[i] ), |
.rst_n ( rst_n ), |
.i0 ( ni0[i] ), |
.i1 ( ni1[i] ), |
.i2 ( ni2[i] ), |
.i3 ( ni3[i] ), |
.i4 ( ni4[i] ), |
.oa ( n2ca[i] ), |
.addrx ( addrx ), |
.addry ( addry ) |
); |
|
inp_buf #(.DIR(3), .RN(2), .DW(DW), .PD(IPD)) |
EIB ( |
.o0 ( e2c0[i] ), |
.o1 ( e2c1[i] ), |
.o2 ( e2c2[i] ), |
.o3 ( e2c3[i] ), |
.o4 ( e2c4[i] ), |
.ia ( eia[i] ), |
.deco ( ereq[i] ), |
.rst_n ( rst_n ), |
.i0 ( ei0[i] ), |
.i1 ( ei1[i] ), |
.i2 ( ei2[i] ), |
.i3 ( ei3[i] ), |
.i4 ( ei4[i] ), |
.oa ( e2ca[i] ), |
.addrx ( addrx ), |
.addry ( addry ) |
); |
|
inp_buf #(.DIR(4), .RN(4), .DW(DW), .PD(IPD)) |
LIB ( |
.o0 ( l2c0[i] ), |
.o1 ( l2c1[i] ), |
.o2 ( l2c2[i] ), |
.o3 ( l2c3[i] ), |
.o4 ( l2c4[i] ), |
.ia ( lia[i] ), |
.deco ( lreq[i] ), |
.rst_n ( rst_n ), |
.i0 ( li0[i] ), |
.i1 ( li1[i] ), |
.i2 ( li2[i] ), |
.i3 ( li3[i] ), |
.i4 ( li4[i] ), |
.oa ( l2ca[i] ), |
.addrx ( addrx ), |
.addry ( addry ) |
); |
|
// --------------------- output buffers ---------------- // |
outp_buf #(.DW(DW), .PD(OPD)) |
SOB ( |
.o0 ( so0[i] ), |
.o1 ( so1[i] ), |
.o2 ( so2[i] ), |
.o3 ( so3[i] ), |
.o4 ( so4[i] ), |
.oa ( soa[i] ), |
.i0 ( c2s0[i] ), |
.i1 ( c2s1[i] ), |
.i2 ( c2s2[i] ), |
.i3 ( c2s3[i] ), |
.i4 ( c2s4[i] ), |
.ia ( c2sa[i] ), |
.ia4 ( c2sa4[i] ), |
.rst_n ( rst_n ) |
); |
|
outp_buf #(.DW(DW), .PD(OPD)) |
WOB ( |
.o0 ( wo0[i] ), |
.o1 ( wo1[i] ), |
.o2 ( wo2[i] ), |
.o3 ( wo3[i] ), |
.o4 ( wo4[i] ), |
.oa ( woa[i] ), |
.i0 ( c2w0[i] ), |
.i1 ( c2w1[i] ), |
.i2 ( c2w2[i] ), |
.i3 ( c2w3[i] ), |
.i4 ( c2w4[i] ), |
.ia ( c2wa[i] ), |
.ia4 ( c2wa4[i] ), |
.rst_n ( rst_n ) |
); |
|
outp_buf #(.DW(DW), .PD(OPD)) |
NOB ( |
.o0 ( no0[i] ), |
.o1 ( no1[i] ), |
.o2 ( no2[i] ), |
.o3 ( no3[i] ), |
.o4 ( no4[i] ), |
.oa ( noa[i] ), |
.i0 ( c2n0[i] ), |
.i1 ( c2n1[i] ), |
.i2 ( c2n2[i] ), |
.i3 ( c2n3[i] ), |
.i4 ( c2n4[i] ), |
.ia ( c2na[i] ), |
.ia4 ( c2na4[i] ), |
.rst_n ( rst_n ) |
); |
|
outp_buf #(.DW(DW), .PD(OPD)) |
EOB ( |
.o0 ( eo0[i] ), |
.o1 ( eo1[i] ), |
.o2 ( eo2[i] ), |
.o3 ( eo3[i] ), |
.o4 ( eo4[i] ), |
.oa ( eoa[i] ), |
.i0 ( c2e0[i] ), |
.i1 ( c2e1[i] ), |
.i2 ( c2e2[i] ), |
.i3 ( c2e3[i] ), |
.i4 ( c2e4[i] ), |
.ia ( c2ea[i] ), |
.ia4 ( c2ea4[i] ), |
.rst_n ( rst_n ) |
); |
|
outp_buf #(.DW(DW), .PD(OPD)) |
LOB ( |
.o0 ( lo0[i] ), |
.o1 ( lo1[i] ), |
.o2 ( lo2[i] ), |
.o3 ( lo3[i] ), |
.o4 ( lo4[i] ), |
.oa ( loa[i] ), |
.i0 ( c2l0[i] ), |
.i1 ( c2l1[i] ), |
.i2 ( c2l2[i] ), |
.i3 ( c2l3[i] ), |
.i4 ( c2l4[i] ), |
.ia ( c2la[i] ), |
.ia4 ( c2la4[i] ), |
.rst_n ( rst_n ) |
); |
|
end // block: SC |
endgenerate |
|
`ifdef ENABLE_CLOS |
clos #(.MN(VCN), .NN(VCN), .DW(DW)) |
CB ( |
.so0 ( c2s0 ), |
.so1 ( c2s1 ), |
.so2 ( c2s2 ), |
.so3 ( c2s3 ), |
.so4 ( c2s4 ), |
.soa ( c2sa ), |
.soa4 ( c2sa4 ), |
.wo0 ( c2w0 ), |
.wo1 ( c2w1 ), |
.wo2 ( c2w2 ), |
.wo3 ( c2w3 ), |
.wo4 ( c2w4 ), |
.woa ( c2wa ), |
.woa4 ( c2wa4 ), |
.no0 ( c2n0 ), |
.no1 ( c2n1 ), |
.no2 ( c2n2 ), |
.no3 ( c2n3 ), |
.no4 ( c2n4 ), |
.noa ( c2na ), |
.noa4 ( c2na4 ), |
.eo0 ( c2e0 ), |
.eo1 ( c2e1 ), |
.eo2 ( c2e2 ), |
.eo3 ( c2e3 ), |
.eo4 ( c2e4 ), |
.eoa ( c2ea ), |
.eoa4 ( c2ea4 ), |
.lo0 ( c2l0 ), |
.lo1 ( c2l1 ), |
.lo2 ( c2l2 ), |
.lo3 ( c2l3 ), |
.lo4 ( c2l4 ), |
.loa ( c2la ), |
.loa4 ( c2la4 ), |
.si0 ( s2c0 ), |
.si1 ( s2c1 ), |
.si2 ( s2c2 ), |
.si3 ( s2c3 ), |
.si4 ( s2c4 ), |
.sia ( s2ca ), |
.wi0 ( w2c0 ), |
.wi1 ( w2c1 ), |
.wi2 ( w2c2 ), |
.wi3 ( w2c3 ), |
.wi4 ( w2c4 ), |
.wia ( w2ca ), |
.ni0 ( n2c0 ), |
.ni1 ( n2c1 ), |
.ni2 ( n2c2 ), |
.ni3 ( n2c3 ), |
.ni4 ( n2c4 ), |
.nia ( n2ca ), |
.ei0 ( e2c0 ), |
.ei1 ( e2c1 ), |
.ei2 ( e2c2 ), |
.ei3 ( e2c3 ), |
.ei4 ( e2c4 ), |
.eia ( e2ca ), |
.li0 ( l2c0 ), |
.li1 ( l2c1 ), |
.li2 ( l2c2 ), |
.li3 ( l2c3 ), |
.li4 ( l2c4 ), |
.lia ( l2ca ), |
.rst_n ( rst_n ) |
) ; |
|
`else // Crossbar based SDM |
|
dcb_xy #(.VCN(VCN), .VCW(DW)) |
CB ( |
.so0 ( c2s0 ), |
.so1 ( c2s1 ), |
.so2 ( c2s2 ), |
.so3 ( c2s3 ), |
.so4 ( c2s4 ), |
.soa ( c2sa ), |
.wo0 ( c2w0 ), |
.wo1 ( c2w1 ), |
.wo2 ( c2w2 ), |
.wo3 ( c2w3 ), |
.wo4 ( c2w4 ), |
.woa ( c2wa ), |
.no0 ( c2n0 ), |
.no1 ( c2n1 ), |
.no2 ( c2n2 ), |
.no3 ( c2n3 ), |
.no4 ( c2n4 ), |
.noa ( c2na ), |
.eo0 ( c2e0 ), |
.eo1 ( c2e1 ), |
.eo2 ( c2e2 ), |
.eo3 ( c2e3 ), |
.eo4 ( c2e4 ), |
.eoa ( c2ea ), |
.lo0 ( c2l0 ), |
.lo1 ( c2l1 ), |
.lo2 ( c2l2 ), |
.lo3 ( c2l3 ), |
.lo4 ( c2l4 ), |
.loa ( c2la ), |
.si0 ( s2c0 ), |
.si1 ( s2c1 ), |
.si2 ( s2c2 ), |
.si3 ( s2c3 ), |
.si4 ( s2c4 ), |
.sia ( s2ca ), |
.wi0 ( w2c0 ), |
.wi1 ( w2c1 ), |
.wi2 ( w2c2 ), |
.wi3 ( w2c3 ), |
.wi4 ( w2c4 ), |
.wia ( w2ca ), |
.ni0 ( n2c0 ), |
.ni1 ( n2c1 ), |
.ni2 ( n2c2 ), |
.ni3 ( n2c3 ), |
.ni4 ( n2c4 ), |
.nia ( n2ca ), |
.ei0 ( e2c0 ), |
.ei1 ( e2c1 ), |
.ei2 ( e2c2 ), |
.ei3 ( e2c3 ), |
.ei4 ( e2c4 ), |
.eia ( e2ca ), |
.li0 ( l2c0 ), |
.li1 ( l2c1 ), |
.li2 ( l2c2 ), |
.li3 ( l2c3 ), |
.li4 ( l2c4 ), |
.lia ( l2ca ), |
.wcfg ( wcfg ), |
.ecfg ( ecfg ), |
.lcfg ( lcfg ), |
.scfg ( scfg ), |
.ncfg ( ncfg ) |
) ; |
|
|
sdm_sch #(.VCN(VCN)) |
ALLOC ( |
.sack ( sack ), |
.wack ( wack ), |
.nack ( nack ), |
.eack ( eack ), |
.lack ( lack ), |
.scfg ( scfg ), |
.ncfg ( ncfg ), |
.wcfg ( wcfg ), |
.ecfg ( ecfg ), |
.lcfg ( lcfg ), |
.sreq ( sreq ), |
.nreq ( nreq ), |
.lreq ( lreq ), |
.wreq ( wreq ), |
.ereq ( ereq ), |
.rst_n ( rst_n ) |
); |
`endif |
|
endmodule // router |
branches/clos_opt/clos_opt/src/router.v
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property