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] - Blame information for rev 78

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 71 wsong0210
/*
2
 Asynchronous SDM NoC
3
 (C)2011 Wei Song
4
 Advanced Processor Technologies Group
5
 Computer Science, the Univ. of Manchester, UK
6
 
7
 Authors:
8
 Wei Song     wsong83@gmail.com
9
 
10
 License: LGPL 3.0 or later
11
 
12
 Buffered Clos switch for SDM-Clos routers
13
 *** SystemVerilog is used ***
14
 
15
 History:
16
 09/07/2011  Initial version. <wsong83@gmail.com>
17
 
18
*/
19
 
20
// the router structure definitions
21
`include "define.v"
22
 
23 74 wsong0210
module clos (/*AUTOARG*/
24
   // Outputs
25
   so0, so1, so2, so3, wo0, wo1, wo2, wo3, no0, no1, no2, no3, eo0,
26
   eo1, eo2, eo3, lo0, lo1, lo2, lo3, so4, wo4, no4, eo4, lo4, sia,
27
   wia, nia, eia, lia,
28
   // Inputs
29
   si0, si1, si2, si3, wi0, wi1, wi2, wi3, ni0, ni1, ni2, ni3, ei0,
30
   ei1, ei2, ei3, li0, li1, li2, li3, si4, wi4, ni4, ei4, li4, soa,
31
   woa, noa, eoa, loa, soa4, woa4, noa4, eoa4, loa4, sdec, ndec, ldec,
32 75 wsong0210
   wdec, edec, rst_n
33 74 wsong0210
   );
34 71 wsong0210
 
35
   parameter MN = 2;            // number of CMs
36
   parameter NN = 2;            // number of ports in an IM or OM, equ. to number of virtual circuits
37
   parameter DW = 8;            // datawidth of a single virtual circuit/port
38
   parameter SCN = DW/2;        // number of 1-of-4 sub-channels in one port
39
 
40
   input [NN-1:0][SCN-1:0]     si0, si1, si2, si3; // south input [0], X+1
41
   input [NN-1:0][SCN-1:0]     wi0, wi1, wi2, wi3; // west input [1], Y-1
42
   input [NN-1:0][SCN-1:0]     ni0, ni1, ni2, ni3; // north input [2], X-1
43
   input [NN-1:0][SCN-1:0]     ei0, ei1, ei2, ei3; // east input [3], Y+1
44
   input [NN-1:0][SCN-1:0]     li0, li1, li2, li3; // local input
45
   output [NN-1:0][SCN-1:0]    so0, so1, so2, so3; // south output
46
   output [NN-1:0][SCN-1:0]    wo0, wo1, wo2, wo3; // west output
47
   output [NN-1:0][SCN-1:0]    no0, no1, no2, no3; // north output
48
   output [NN-1:0][SCN-1:0]    eo0, eo1, eo2, eo3; // east output
49
   output [NN-1:0][SCN-1:0]    lo0, lo1, lo2, lo3; // local output
50
 
51
   // eof bits and ack lines
52
`ifdef ENABLE_CHANNEL_SLICING
53
   input [NN-1:0][SCN-1:0]     si4, wi4, ni4, ei4, li4;
54
   output [NN-1:0][SCN-1:0]    so4, wo4, no4, eo4, lo4;
55
   output [NN-1:0][SCN-1:0]    sia, wia, nia, eia, lia;
56
   input [NN-1:0][SCN-1:0]     soa, woa, noa, eoa, loa;
57 74 wsong0210
// `ifdef ENABLE_BUFFERED_CLOS
58 71 wsong0210
   input [NN-1:0][SCN-1:0]     soa4, woa4, noa4, eoa4, loa4; // the eof ack from output buffers
59 74 wsong0210
// `endif
60 71 wsong0210
`else
61
   input [NN-1:0]               si4, wi4, ni4, ei4, li4;
62
   output [NN-1:0]              so4, wo4, no4, eo4, lo4;
63
   output [NN-1:0]              sia, wia, nia, eia, lia;
64
   input [NN-1:0]               soa, woa, noa, eoa, loa;
65
   input [NN-1:0]               soa4, woa4, noa4, eoa4, loa4; // the eof ack from output buffers
66
`endif // !`ifdef ENABLE_CHANNEL_SLICING
67
 
68
   input [NN-1:0][3:0]           sdec, ndec, ldec; // the routing requests
69
   input [NN-1:0][1:0]         wdec, edec;         // the routing requests
70
 
71 75 wsong0210
   input                       rst_n; // global active low reset
72
 
73 77 wsong0210
   wire [MN-1:0][SCN-1:0]      sim0, sim1, sim2, sim3;
74
   wire [MN-1:0][SCN-1:0]      wim0, wim1, wim2, wim3;
75
   wire [MN-1:0][SCN-1:0]      nim0, nim1, nim2, nim3;
76
   wire [MN-1:0][SCN-1:0]      eim0, eim1, eim2, eim3;
77
   wire [MN-1:0][SCN-1:0]      lim0, lim1, lim2, lim3;
78
   wire [MN-1:0][4:0][SCN-1:0] cmi0, cmi1, cmi2, cmi3;
79
   wire [MN-1:0][4:0][SCN-1:0] cmo0, cmo1, cmo2, cmo3;
80
 
81
`ifdef ENABLE_CHANNEL_SLICING
82
   wire [MN-1:0][SCN-1:0]      sim4, wim4, nim4, eim4, lim4;
83
   wire [MN-1:0][SCN-1:0]      sima, wima, nima, eima, lima;
84 78 wsong0210
   wire [MN-1:0][SCN-1:0]      sima4, wima4, nima4, eima4, lima4;
85 77 wsong0210
   wire [NN-1:0][SCN-1:0]      soa4, woa4, noa4, eoa4, loa4;
86 78 wsong0210
   wire [MN-1:0][4:0][SCN-1:0] cmo4, cmi4, cmia, cmoa, cmoa4;
87 77 wsong0210
`else
88
   wire [MN-1:0]                sim4, wim4, nim4, eim4, lim4;
89
   wire [MN-1:0]                sima, wima, nima, eima, lima;
90 78 wsong0210
   wire [MN-1:0]                sima4, wima4, nima4, eima4, lima4;
91 77 wsong0210
   wire [NN-1:0]                soa4, woa4, noa4, eoa4, loa4;
92 78 wsong0210
   wire [MN-1:0][4:0]            cmo4, cmi4, cmia, cmoa, cmoa4;
93 77 wsong0210
`endif // !`ifdef ENABLE_CHANNEL_SLICING
94
 
95
   wire [MN-1:0][3:0]            simdec, nimdec, limdec; // the routing requests
96
   wire [MN-1:0][1:0]            wimdec, eimdec;   // the routing requests
97
 
98
`ifndef ENABLE_CRRD
99
   wire [MN-1:0][3:0]            sims, nims, lims;
100
   wire [MN-1:0][1:0]            wims, eims;
101
   wire [MN-1:0][4:0]            cms;
102
`endif
103
 
104 71 wsong0210
   genvar                      i,j;
105
 
106
 
107
   // the IMs
108
   im #(.MN(MN), .NN(NN), .DW(DW), .SN(4))
109
   SIM (
110
        .do0   ( sim0   ),
111
        .do1   ( sim1   ),
112
        .do2   ( sim2   ),
113
        .do3   ( sim3   ),
114
        .deco  ( simdec ),
115
        .dia   ( sia    ),
116
        .do4   ( sim4   ),
117
        .di0   ( si0    ),
118
        .di1   ( si1    ),
119
        .di2   ( si2    ),
120
        .di3   ( si3    ),
121
        .deci  ( sdec   ),
122
        .di4   ( si4    ),
123
        .doa   ( sima   ),
124
`ifndef ENABLE_CRRD
125
        .cms   ( sims   ),
126
`endif
127
        .rst_n ( rst_n  )
128
        );
129
 
130
   im #(.MN(MN), .NN(NN), .DW(DW), .SN(2))
131
   WIM (
132
        .do0   ( wim0   ),
133
        .do1   ( wim1   ),
134
        .do2   ( wim2   ),
135
        .do3   ( wim3   ),
136
        .deco  ( wimdec ),
137
        .dia   ( wia    ),
138
        .do4   ( wim4   ),
139
        .di0   ( wi0    ),
140
        .di1   ( wi1    ),
141
        .di2   ( wi2    ),
142
        .di3   ( wi3    ),
143
        .deci  ( wdec   ),
144
        .di4   ( wi4    ),
145
        .doa   ( wima   ),
146
`ifndef ENABLE_CRRD
147
        .cms   ( wims   ),
148
`endif
149
        .rst_n ( rst_n  )
150
        );
151
 
152
   im #(.MN(MN), .NN(NN), .DW(DW), .SN(4))
153
   NIM (
154
        .do0   ( nim0   ),
155
        .do1   ( nim1   ),
156
        .do2   ( nim2   ),
157
        .do3   ( nim3   ),
158
        .deco  ( nimdec ),
159
        .dia   ( nia    ),
160
        .do4   ( nim4   ),
161
        .di0   ( ni0    ),
162
        .di1   ( ni1    ),
163
        .di2   ( ni2    ),
164
        .di3   ( ni3    ),
165
        .deci  ( ndec   ),
166
        .di4   ( ni4    ),
167
        .doa   ( nima   ),
168
`ifndef ENABLE_CRRD
169
        .cms   ( nims   ),
170
`endif
171
        .rst_n ( rst_n  )
172
        );
173
 
174
   im #(.MN(MN), .NN(NN), .DW(DW), .SN(2))
175
   EIM (
176
        .do0   ( eim0   ),
177
        .do1   ( eim1   ),
178
        .do2   ( eim2   ),
179
        .do3   ( eim3   ),
180
        .deco  ( eimdec ),
181
        .dia   ( eia    ),
182
        .do4   ( eim4   ),
183
        .di0   ( ei0    ),
184
        .di1   ( ei1    ),
185
        .di2   ( ei2    ),
186
        .di3   ( ei3    ),
187
        .deci  ( edec   ),
188
        .di4   ( ei4    ),
189
        .doa   ( eima   ),
190
`ifndef ENABLE_CRRD
191
        .cms   ( eims   ),
192
`endif
193
        .rst_n ( rst_n  )
194
        );
195
 
196
   im #(.MN(MN), .NN(NN), .DW(DW), .SN(4))
197
   LIM (
198
        .do0   ( lim0   ),
199
        .do1   ( lim1   ),
200
        .do2   ( lim2   ),
201
        .do3   ( lim3   ),
202
        .deco  ( limdec ),
203
        .dia   ( lia    ),
204
        .do4   ( lim4   ),
205
        .di0   ( li0    ),
206
        .di1   ( li1    ),
207
        .di2   ( li2    ),
208
        .di3   ( li3    ),
209
        .deci  ( ldec   ),
210
        .di4   ( li4    ),
211
        .doa   ( lima   ),
212
`ifndef ENABLE_CRRD
213
        .cms   ( lims   ),
214
`endif
215
        .rst_n ( rst_n  )
216
        );
217
 
218
   // data wire shuffle
219
   // the CMs
220
   generate
221
      for(i=0; i<MN; i++) begin:CMSH
222
         assign cmi0[i][0] = sim0[i];
223
         assign cmi1[i][0] = sim1[i];
224
         assign cmi2[i][0] = sim2[i];
225
         assign cmi3[i][0] = sim3[i];
226
         assign sima[i] = cmia[i][0];
227
         assign sima4[i] = cmia[i][0];
228
 
229
         assign cmi0[i][1] = wim0[i];
230
         assign cmi1[i][1] = wim1[i];
231
         assign cmi2[i][1] = wim2[i];
232
         assign cmi3[i][1] = wim3[i];
233
         assign wima[i] = cmia[i][1];
234
         assign wima4[i] = cmia[i][1];
235
 
236
         assign cmi0[i][2] = nim0[i];
237
         assign cmi1[i][2] = nim1[i];
238
         assign cmi2[i][2] = nim2[i];
239
         assign cmi3[i][2] = nim3[i];
240
         assign nima[i] = cmia[i][2];
241
         assign nima4[i] = cmia[i][2];
242
 
243
         assign cmi0[i][3] = eim0[i];
244
         assign cmi1[i][3] = eim1[i];
245
         assign cmi2[i][3] = eim2[i];
246
         assign cmi3[i][3] = eim3[i];
247
         assign eima[i] = cmia[i][3];
248
         assign eima4[i] = cmia[i][3];
249
 
250
         assign cmi0[i][4] = lim0[i];
251
         assign cmi1[i][4] = lim1[i];
252
         assign cmi2[i][4] = lim2[i];
253
         assign cmi3[i][4] = lim3[i];
254
         assign lima[i] = cmia[i][4];
255
         assign lima4[i] = cmia[i][4];
256
 
257
         cm #(.KN(5), .DW(DW))
258
         CMSW (
259 77 wsong0210
               .do0   ( cmo0[i]   ),
260
               .do1   ( cmo1[i]   ),
261
               .do2   ( cmo2[i]   ),
262
               .do3   ( cmo3[i]   ),
263
               .dia   ( cmia[i]   ),
264
               .do4   ( cmo4[i]   ),
265
               .di0   ( cmi0[i]   ),
266
               .di1   ( cmi1[i]   ),
267
               .di2   ( cmi2[i]   ),
268
               .di3   ( cmi3[i]   ),
269
               .sdec  ( simdec[i] ),
270
               .ndec  ( nimdec[i] ),
271
               .ldec  ( limdec[i] ),
272
               .wdec  ( wimdec[i] ),
273
               .edec  ( eimdec[i] ),
274
               .di4   ( cmi4[i]   ),
275
               .doa   ( cmoa[i]   ),
276
               .doa4  ( cmoa4[i]  ),
277 71 wsong0210
`ifndef ENABLE_CRRD
278 77 wsong0210
               .cms   ( cms[i]    ),
279 71 wsong0210
`endif
280 77 wsong0210
               .rst_n ( rst_n     )
281 71 wsong0210
               );
282
 
283 72 wsong0210
         assign so0[i] = cmo0[i][0];
284
         assign so1[i] = cmo1[i][0];
285
         assign so2[i] = cmo2[i][0];
286
         assign so3[i] = cmo3[i][0];
287
         assign cmoa[i][0] = soa[i];
288 78 wsong0210
         assign cmoa4[i][0] = soa4[i];
289 72 wsong0210
 
290
         assign wo0[i] = cmo0[i][1];
291
         assign wo1[i] = cmo1[i][1];
292
         assign wo2[i] = cmo2[i][1];
293
         assign wo3[i] = cmo3[i][1];
294
         assign cmoa[i][1] = woa[i];
295 78 wsong0210
         assign cmoa4[i][1] = woa4[i];
296 72 wsong0210
 
297
         assign no0[i] = cmo0[i][2];
298
         assign no1[i] = cmo1[i][2];
299
         assign no2[i] = cmo2[i][2];
300
         assign no3[i] = cmo3[i][2];
301
         assign cmoa[i][2] = noa[i];
302 78 wsong0210
         assign cmoa4[i][2] = noa4[i];
303 72 wsong0210
 
304
         assign eo0[i] = cmo0[i][3];
305
         assign eo1[i] = cmo1[i][3];
306
         assign eo2[i] = cmo2[i][3];
307
         assign eo3[i] = cmo3[i][3];
308
         assign cmoa[i][3] = eoa[i];
309 78 wsong0210
         assign cmoa4[i][3] = eoa4[i];
310 72 wsong0210
 
311
         assign lo0[i] = cmo0[i][4];
312
         assign lo1[i] = cmo1[i][4];
313
         assign lo2[i] = cmo2[i][4];
314
         assign lo3[i] = cmo3[i][4];
315
         assign cmoa[i][4] = loa[i];
316 78 wsong0210
         assign cmoa4[i][4] = loa4[i];
317 72 wsong0210
 
318 77 wsong0210
         assign sims[i] = {cms[i][4],cms[i][3],cms[i][2],cms[i][1]};
319
         assign wims[i] = {cms[i][4],cms[i][3]};
320
         assign nims[i] = {cms[i][4],cms[i][3],cms[i][1],cms[i][0]};
321
         assign eims[i] = {cms[i][4],cms[i][1]};
322
         assign lims[i] = {cms[i][3],cms[i][2],cms[i][1],cms[i][0]};
323
 
324 72 wsong0210
      end
325
   endgenerate
326 71 wsong0210
 
327 72 wsong0210
 
328
endmodule // clos

powered by: WebSVN 2.1.0

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