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

Subversion Repositories async_sdm_noc

[/] [async_sdm_noc/] [branches/] [clos_opt/] [common/] [src/] [dclos.v] - Blame information for rev 64

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 12 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
 Data Clos network.
13
 *** SystemVerilog is used ***
14
 
15
 History:
16
 17/07/2010  Initial version. <wsong83@gmail.com>
17
 20/09/2010  Supporting channel slicing and SDM using macro difinitions. <wsong83@gmail.com>
18
 23/05/2011  Clean up for opensource. <wsong83@gmail.com>
19 62 wsong0210
 21/06/2011  Prepare to support buffered Clos. <wsong83@gmail.com>
20 12 wsong0210
 
21
*/
22
 
23
// the router structure definitions
24
`include "define.v"
25
 
26 62 wsong0210
module dclos (
27 12 wsong0210
   // Outputs
28
   so0, so1, so2, so3, wo0, wo1, wo2, wo3, no0, no1, no2, no3, eo0,
29
   eo1, eo2, eo3, lo0, lo1, lo2, lo3, so4, wo4, no4, eo4, lo4, sia,
30
   wia, nia, eia, lia,
31
   // Inputs
32
   si0, si1, si2, si3, wi0, wi1, wi2, wi3, ni0, ni1, ni2, ni3, ei0,
33
   ei1, ei2, ei3, li0, li1, li2, li3, si4, wi4, ni4, ei4, li4, soa,
34
   woa, noa, eoa, loa, imcfg, scfg, ncfg, wcfg, ecfg, lcfg
35 62 wsong0210
`ifdef ENABLE_BUFFERED_CLOS
36
   , soa4, woa4, noa4, eoa4, loa4
37
`endif
38 12 wsong0210
   );
39
 
40
   parameter MN = 2;            // number of CMs
41
   parameter NN = 2;            // number of ports in an IM or OM, equ. to number of virtual circuits
42
   parameter DW = 8;            // datawidth of a single virtual circuit/port
43
   parameter SCN = DW/2;        // number of 1-of-4 sub-channels in one port
44
 
45
   input [NN-1:0][SCN-1:0]     si0, si1, si2, si3; // south input [0], X+1
46
   input [NN-1:0][SCN-1:0]     wi0, wi1, wi2, wi3; // west input [1], Y-1
47
   input [NN-1:0][SCN-1:0]     ni0, ni1, ni2, ni3; // north input [2], X-1
48
   input [NN-1:0][SCN-1:0]     ei0, ei1, ei2, ei3; // east input [3], Y+1
49
   input [NN-1:0][SCN-1:0]     li0, li1, li2, li3; // local input
50
   output [NN-1:0][SCN-1:0]    so0, so1, so2, so3; // south output
51
   output [NN-1:0][SCN-1:0]    wo0, wo1, wo2, wo3; // west output
52
   output [NN-1:0][SCN-1:0]    no0, no1, no2, no3; // north output
53
   output [NN-1:0][SCN-1:0]    eo0, eo1, eo2, eo3; // east output
54
   output [NN-1:0][SCN-1:0]    lo0, lo1, lo2, lo3; // local output
55
 
56
   // eof bits and ack lines
57
`ifdef ENABLE_CHANNEL_SLICING
58
   input [NN-1:0][SCN-1:0]     si4, wi4, ni4, ei4, li4;
59
   output [NN-1:0][SCN-1:0]    so4, wo4, no4, eo4, lo4;
60
   output [NN-1:0][SCN-1:0]    sia, wia, nia, eia, lia;
61
   input [NN-1:0][SCN-1:0]     soa, woa, noa, eoa, loa;
62 62 wsong0210
 `ifdef ENABLE_BUFFERED_CLOS
63
   input [NN-1:0][SCN-1:0]     soa4, woa4, noa4, eoa4, loa4; // the eof ack from output buffers
64
 `endif
65 12 wsong0210
`else
66
   input [NN-1:0]               si4, wi4, ni4, ei4, li4;
67
   output [NN-1:0]              so4, wo4, no4, eo4, lo4;
68
   output [NN-1:0]              sia, wia, nia, eia, lia;
69
   input [NN-1:0]               soa, woa, noa, eoa, loa;
70 62 wsong0210
 `ifdef ENABLE_BUFFERED_CLOS
71
   input [NN-1:0]               soa4, woa4, noa4, eoa4, loa4; // the eof ack from output buffers
72
 `endif
73 12 wsong0210
`endif // !`ifdef ENABLE_CHANNEL_SLICING
74
 
75
   input [4:0][MN-1:0][NN-1:0] imcfg; // configuration for IMs
76
   // configuration for CMs
77
   input [MN-1:0][1:0]           scfg, ncfg;
78
   input [MN-1:0][3:0]           wcfg, ecfg, lcfg;
79
   // no OMs
80
 
81
   // output of IMs
82
   wire [MN-1:0][SCN-1:0]      imos0, imos1, imos2, imos3;
83
   wire [MN-1:0][SCN-1:0]      imow0, imow1, imow2, imow3;
84
   wire [MN-1:0][SCN-1:0]      imon0, imon1, imon2, imon3;
85
   wire [MN-1:0][SCN-1:0]      imoe0, imoe1, imoe2, imoe3;
86
   wire [MN-1:0][SCN-1:0]      imol0, imol1, imol2, imol3;
87
`ifdef ENABLE_CHANNEL_SLICING
88
   wire [MN-1:0][SCN-1:0]      imos4, imow4, imon4, imoe4, imol4;
89
   wire [MN-1:0][SCN-1:0]      imosa, imowa, imona, imoea, imola;
90 62 wsong0210
 `ifdef ENABLE_BUFFERED_CLOS
91
   wire [MN-1:0][SCN-1:0]      imosa4, imowa4, imona4, imoea4, imola4;
92
 `endif
93 12 wsong0210
`else
94
   wire [MN-1:0]                imos4, imow4, imon4, imoe4, imol4;
95
   wire [MN-1:0]                imosa, imowa, imona, imoea, imola;
96 62 wsong0210
 `ifdef ENABLE_BUFFERED_CLOS
97
   wire [MN-1:0]                imosa4, imowa4, imona4, imoea4, imola4;
98
 `endif
99 12 wsong0210
`endif
100
 
101
   // input of CMs
102
   wire [MN-1:0][4:0][SCN-1:0] cmi0, cmi1, cmi2, cmi3;
103
`ifdef ENABLE_CHANNEL_SLICING
104
   wire [MN-1:0][4:0][SCN-1:0] cmi4, cmia;
105
`else
106
   wire [MN-1:0][4:0]            cmi4, cmia;
107
`endif
108
 
109
   // output of CMs
110
   wire [MN-1:0][4:0][SCN-1:0] cmo0, cmo1, cmo2, cmo3;
111
`ifdef ENABLE_CHANNEL_SLICING
112
   wire [MN-1:0][4:0][SCN-1:0] cmo4, cmoa;
113 62 wsong0210
 `ifdef ENABLE_BUFFERED_CLOS
114
   wire [MN-1:0][4:0][SCN-1:0] cmoa4;
115
 `endif
116 12 wsong0210
`else
117
   wire [MN-1:0][4:0]            cmo4, cmoa;
118 62 wsong0210
 `ifdef ENABLE_BUFFERED_CLOS
119
   wire [MN-1:0][4:0]            cmoa4;
120
 `endif
121 12 wsong0210
`endif
122
 
123
   genvar                      i,j,k;
124
 
125
   dcb #(.NN(NN), .MN(MN), .DW(DW))
126
   SIM (
127 64 wsong0210
        .o0  ( imos0    ),
128
        .o1  ( imos1    ),
129
        .o2  ( imos2    ),
130
        .o3  ( imos3    ),
131
        .o4  ( imos4    ),
132
        .ia  ( sia      ),
133
        .i0  ( si0      ),
134
        .i1  ( si1      ),
135
        .i2  ( si2      ),
136
        .i3  ( si3      ),
137
        .i4  ( si4      ),
138
        .oa  ( imosa    ),
139
`ifdef ENABLE_BUFFERED_CLOS
140
        .oa4 ( imosa4   ),
141
`endif
142
        .cfg ( imcfg[0] )
143
        );
144 12 wsong0210
 
145
   dcb #(.NN(NN), .MN(MN), .DW(DW))
146
   WIM (
147 64 wsong0210
        .o0  ( imow0    ),
148
        .o1  ( imow1    ),
149
        .o2  ( imow2    ),
150
        .o3  ( imow3    ),
151
        .o4  ( imow4    ),
152
        .ia  ( wia      ),
153
        .i0  ( wi0      ),
154
        .i1  ( wi1      ),
155
        .i2  ( wi2      ),
156
        .i3  ( wi3      ),
157
        .i4  ( wi4      ),
158
        .oa  ( imowa    ),
159
`ifdef ENABLE_BUFFERED_CLOS
160
        .oa4 ( imowa4   ),
161
`endif
162
        .cfg ( imcfg[1] )
163
        );
164 12 wsong0210
 
165
   dcb #(.NN(NN), .MN(MN), .DW(DW))
166
   NIM (
167 64 wsong0210
        .o0  ( imon0    ),
168
        .o1  ( imon1    ),
169
        .o2  ( imon2    ),
170
        .o3  ( imon3    ),
171
        .o4  ( imon4    ),
172
        .ia  ( nia      ),
173
        .i0  ( ni0      ),
174
        .i1  ( ni1      ),
175
        .i2  ( ni2      ),
176
        .i3  ( ni3      ),
177
        .i4  ( ni4      ),
178
        .oa  ( imona    ),
179
`ifdef ENABLE_BUFFERED_CLOS
180
        .oa4 ( imona4   ),
181
`endif
182
        .cfg ( imcfg[2] )
183 12 wsong0210
       );
184
 
185
   dcb #(.NN(NN), .MN(MN), .DW(DW))
186
   EIM (
187 64 wsong0210
        .o0  ( imoe0    ),
188
        .o1  ( imoe1    ),
189
        .o2  ( imoe2    ),
190
        .o3  ( imoe3    ),
191
        .o4  ( imoe4    ),
192
        .ia  ( eia      ),
193
        .i0  ( ei0      ),
194
        .i1  ( ei1      ),
195
        .i2  ( ei2      ),
196
        .i3  ( ei3      ),
197
        .i4  ( ei4      ),
198
        .oa  ( imoea    ),
199
`ifdef ENABLE_BUFFERED_CLOS
200
        .oa4 ( imoea4   ),
201
`endif
202
        .cfg ( imcfg[3] )
203
        );
204 12 wsong0210
 
205
   dcb #(.NN(NN), .MN(MN), .DW(DW))
206
   LIM (
207 64 wsong0210
        .o0  ( imol0    ),
208
        .o1  ( imol1    ),
209
        .o2  ( imol2    ),
210
        .o3  ( imol3    ),
211
        .o4  ( imol4    ),
212
        .ia  ( lia      ),
213
        .i0  ( li0      ),
214
        .i1  ( li1      ),
215
        .i2  ( li2      ),
216
        .i3  ( li3      ),
217
        .i4  ( li4      ),
218
        .oa  ( imola    ),
219
`ifdef ENABLE_BUFFERED_CLOS
220
        .oa4 ( imola4   ),
221
`endif
222
        .cfg ( imcfg[4] )
223
        );
224 12 wsong0210
 
225
   generate for(i=0; i<MN; i++) begin: IMSHF
226 64 wsong0210
`ifdef ENABLE_BUFFERED_CLOS
227
      // the buffer stage between IM and CM
228
 `ifdef ENABLE_CHANNEL_SLICING
229
      for(j=0; j<SCN; j++) begin:SC
230
         pipe4 #(.DW(2))
231
         P (
232
            .o0 ( cmi0[i][0]  ),
233
            .o1 ( cmi1[i][0]  ),
234
            .o2 ( cmi2[i][0]  ),
235
            .o3 ( cmi3[i][0]  ),
236
            .ia ( imosa[i]    ),
237
            .i0 ( imos0[i]    ),
238
            .i1 ( imos1[i]    ),
239
            .i2 ( imos3[i]    ),
240
            .i3 ( imos4[i]    ),
241
 
242
 
243
`else
244 12 wsong0210
      // shuffle the interconnects between IMs and CMs
245
      assign cmi0[i][0] = imos0[i];
246
      assign cmi1[i][0] = imos1[i];
247
      assign cmi2[i][0] = imos2[i];
248
      assign cmi3[i][0] = imos3[i];
249
      assign cmi4[i][0] = imos4[i];
250
      assign imosa[i] = cmia[i][0];
251
 
252
      assign cmi0[i][1] = imow0[i];
253
      assign cmi1[i][1] = imow1[i];
254
      assign cmi2[i][1] = imow2[i];
255
      assign cmi3[i][1] = imow3[i];
256
      assign cmi4[i][1] = imow4[i];
257
      assign imowa[i] = cmia[i][1];
258
 
259
      assign cmi0[i][2] = imon0[i];
260
      assign cmi1[i][2] = imon1[i];
261
      assign cmi2[i][2] = imon2[i];
262
      assign cmi3[i][2] = imon3[i];
263
      assign cmi4[i][2] = imon4[i];
264
      assign imona[i] = cmia[i][2];
265
 
266
      assign cmi0[i][3] = imoe0[i];
267
      assign cmi1[i][3] = imoe1[i];
268
      assign cmi2[i][3] = imoe2[i];
269
      assign cmi3[i][3] = imoe3[i];
270
      assign cmi4[i][3] = imoe4[i];
271
      assign imoea[i] = cmia[i][3];
272
 
273
      assign cmi0[i][4] = imol0[i];
274
      assign cmi1[i][4] = imol1[i];
275
      assign cmi2[i][4] = imol2[i];
276
      assign cmi3[i][4] = imol3[i];
277
      assign cmi4[i][4] = imol4[i];
278
      assign imola[i] = cmia[i][4];
279 64 wsong0210
`endif // !`ifdef ENABLE_BUFFERED_CLOS
280
 
281 12 wsong0210
      // CM modules
282
      dcb_xy #(.VCN(1), .VCW(DW))
283
      CM (
284
          .sia   ( cmia[i][0]   ),
285
          .wia   ( cmia[i][1]   ),
286
          .nia   ( cmia[i][2]   ),
287
          .eia   ( cmia[i][3]   ),
288
          .lia   ( cmia[i][4]   ),
289
          .so0   ( cmo0[i][0]   ),
290
          .so1   ( cmo1[i][0]   ),
291
          .so2   ( cmo2[i][0]   ),
292
          .so3   ( cmo3[i][0]   ),
293
          .so4   ( cmo4[i][0]   ),
294
          .wo0   ( cmo0[i][1]   ),
295
          .wo1   ( cmo1[i][1]   ),
296
          .wo2   ( cmo2[i][1]   ),
297
          .wo3   ( cmo3[i][1]   ),
298
          .wo4   ( cmo4[i][1]   ) ,
299
          .no0   ( cmo0[i][2]   ),
300
          .no1   ( cmo1[i][2]   ),
301
          .no2   ( cmo2[i][2]   ),
302
          .no3   ( cmo3[i][2]   ),
303
          .no4   ( cmo4[i][2]   ),
304
          .eo0   ( cmo0[i][3]   ),
305
          .eo1   ( cmo1[i][3]   ),
306
          .eo2   ( cmo2[i][3]   ),
307
          .eo3   ( cmo3[i][3]   ),
308
          .eo4   ( cmo4[i][3]   ),
309
          .lo0   ( cmo0[i][4]   ),
310
          .lo1   ( cmo1[i][4]   ),
311
          .lo2   ( cmo2[i][4]   ),
312
          .lo3   ( cmo3[i][4]   ),
313
          .lo4   ( cmo4[i][4]   ),
314
          .si0   ( cmi0[i][0]   ),
315
          .si1   ( cmi1[i][0]   ),
316
          .si2   ( cmi2[i][0]   ),
317
          .si3   ( cmi3[i][0]   ),
318
          .si4   ( cmi4[i][0]   ),
319
          .wi0   ( cmi0[i][1]   ),
320
          .wi1   ( cmi1[i][1]   ),
321
          .wi2   ( cmi2[i][1]   ),
322
          .wi3   ( cmi3[i][1]   ),
323
          .wi4   ( cmi4[i][1]   ),
324
          .ni0   ( cmi0[i][2]   ),
325
          .ni1   ( cmi1[i][2]   ),
326
          .ni2   ( cmi2[i][2]   ),
327
          .ni3   ( cmi3[i][2]   ),
328
          .ni4   ( cmi4[i][2]   ),
329
          .ei0   ( cmi0[i][3]   ),
330
          .ei1   ( cmi1[i][3]   ),
331
          .ei2   ( cmi2[i][3]   ),
332
          .ei3   ( cmi3[i][3]   ),
333
          .ei4   ( cmi4[i][3]   ),
334
          .li0   ( cmi0[i][4]   ),
335
          .li1   ( cmi1[i][4]   ),
336
          .li2   ( cmi2[i][4]   ),
337
          .li3   ( cmi3[i][4]   ),
338
          .li4   ( cmi4[i][4]   ),
339
          .soa   ( cmoa[i][0]   ),
340 64 wsong0210
          .woa   ( cmoa[i][1]   ),
341
          .noa   ( cmoa[i][2]   ),
342
          .eoa   ( cmoa[i][3]   ),
343
          .loa   ( cmoa[i][4]   ),
344
`ifdef ENABLE_BUFFERED_CLOS
345
          .soa4  ( cmoa4[i][0]  ),
346
          .woa4  ( cmoa4[i][1]  ),
347
          .noa4  ( cmoa4[i][2]  ),
348
          .eoa4  ( cmoa4[i][3]  ),
349
          .loa4  ( cmoa4[i][4]  ),
350
`endif
351 12 wsong0210
          .wcfg  ( wcfg[i]      ),
352
          .ecfg  ( ecfg[i]      ),
353
          .lcfg  ( lcfg[i]      ),
354
          .scfg  ( scfg[i]      ),
355
          .ncfg  ( ncfg[i]      )
356
          );
357
 
358
      // shuffle between CMs and OMs(OPs)
359
      assign so0[i] = cmo0[i][0];
360
      assign so1[i] = cmo1[i][0];
361
      assign so2[i] = cmo2[i][0];
362
      assign so3[i] = cmo3[i][0];
363
      assign so4[i] = cmo4[i][0];
364
      assign cmoa[i][0] = soa[i];
365
 
366
      assign wo0[i] = cmo0[i][1];
367
      assign wo1[i] = cmo1[i][1];
368
      assign wo2[i] = cmo2[i][1];
369
      assign wo3[i] = cmo3[i][1];
370
      assign wo4[i] = cmo4[i][1];
371
      assign cmoa[i][1] = woa[i];
372
 
373
      assign no0[i] = cmo0[i][2];
374
      assign no1[i] = cmo1[i][2];
375
      assign no2[i] = cmo2[i][2];
376
      assign no3[i] = cmo3[i][2];
377
      assign no4[i] = cmo4[i][2];
378
      assign cmoa[i][2] = noa[i];
379
 
380
      assign eo0[i] = cmo0[i][3];
381
      assign eo1[i] = cmo1[i][3];
382
      assign eo2[i] = cmo2[i][3];
383
      assign eo3[i] = cmo3[i][3];
384
      assign eo4[i] = cmo4[i][3];
385
      assign cmoa[i][3] = eoa[i];
386
 
387
      assign lo0[i] = cmo0[i][4];
388
      assign lo1[i] = cmo1[i][4];
389
      assign lo2[i] = cmo2[i][4];
390
      assign lo3[i] = cmo3[i][4];
391
      assign lo4[i] = cmo4[i][4];
392
      assign cmoa[i][4] = loa[i];
393 64 wsong0210
 
394
`ifdef ENABLE_BUFFERED_CLOS
395
      assign cmoa4[i][0] = soa4[i];
396
      assign cmoa4[i][1] = woa4[i];
397
      assign cmoa4[i][2] = noa4[i];
398
      assign cmoa4[i][3] = eoa4[i];
399
      assign cmoa4[i][4] = loa4[i];
400
`endif
401 12 wsong0210
   end // block: IMSHF
402
 
403
   endgenerate
404
 
405
 
406
endmodule // dclos
407
 
408
 
409
 
410
 
411
 
412
 
413
 
414
 
415
 
416
 

powered by: WebSVN 2.1.0

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