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 62

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
       .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
       .cfg ( imcfg[0] )
140
       );
141
 
142
   dcb #(.NN(NN), .MN(MN), .DW(DW))
143
   WIM (
144
       .o0  ( imow0    ),
145
       .o1  ( imow1    ),
146
       .o2  ( imow2    ),
147
       .o3  ( imow3    ),
148
       .o4  ( imow4    ),
149
       .ia  ( wia      ),
150
       .i0  ( wi0      ),
151
       .i1  ( wi1      ),
152
       .i2  ( wi2      ),
153
       .i3  ( wi3      ),
154
       .i4  ( wi4      ),
155
       .oa  ( imowa    ),
156
       .cfg ( imcfg[1] )
157
       );
158
 
159
   dcb #(.NN(NN), .MN(MN), .DW(DW))
160
   NIM (
161
       .o0  ( imon0    ),
162
       .o1  ( imon1    ),
163
       .o2  ( imon2    ),
164
       .o3  ( imon3    ),
165
       .o4  ( imon4    ),
166
       .ia  ( nia      ),
167
       .i0  ( ni0      ),
168
       .i1  ( ni1      ),
169
       .i2  ( ni2      ),
170
       .i3  ( ni3      ),
171
       .i4  ( ni4      ),
172
       .oa  ( imona    ),
173
       .cfg ( imcfg[2] )
174
       );
175
 
176
   dcb #(.NN(NN), .MN(MN), .DW(DW))
177
   EIM (
178
       .o0  ( imoe0    ),
179
       .o1  ( imoe1    ),
180
       .o2  ( imoe2    ),
181
       .o3  ( imoe3    ),
182
       .o4  ( imoe4    ),
183
       .ia  ( eia      ),
184
       .i0  ( ei0      ),
185
       .i1  ( ei1      ),
186
       .i2  ( ei2      ),
187
       .i3  ( ei3      ),
188
       .i4  ( ei4      ),
189
       .oa  ( imoea    ),
190
       .cfg ( imcfg[3] )
191
       );
192
 
193
   dcb #(.NN(NN), .MN(MN), .DW(DW))
194
   LIM (
195
       .o0  ( imol0    ),
196
       .o1  ( imol1    ),
197
       .o2  ( imol2    ),
198
       .o3  ( imol3    ),
199
       .o4  ( imol4    ),
200
       .ia  ( lia      ),
201
       .i0  ( li0      ),
202
       .i1  ( li1      ),
203
       .i2  ( li2      ),
204
       .i3  ( li3      ),
205
       .i4  ( li4      ),
206
       .oa  ( imola    ),
207
       .cfg ( imcfg[4] )
208
       );
209
 
210
   generate for(i=0; i<MN; i++) begin: IMSHF
211
      // shuffle the interconnects between IMs and CMs
212
      assign cmi0[i][0] = imos0[i];
213
      assign cmi1[i][0] = imos1[i];
214
      assign cmi2[i][0] = imos2[i];
215
      assign cmi3[i][0] = imos3[i];
216
      assign cmi4[i][0] = imos4[i];
217
      assign imosa[i] = cmia[i][0];
218
 
219
      assign cmi0[i][1] = imow0[i];
220
      assign cmi1[i][1] = imow1[i];
221
      assign cmi2[i][1] = imow2[i];
222
      assign cmi3[i][1] = imow3[i];
223
      assign cmi4[i][1] = imow4[i];
224
      assign imowa[i] = cmia[i][1];
225
 
226
      assign cmi0[i][2] = imon0[i];
227
      assign cmi1[i][2] = imon1[i];
228
      assign cmi2[i][2] = imon2[i];
229
      assign cmi3[i][2] = imon3[i];
230
      assign cmi4[i][2] = imon4[i];
231
      assign imona[i] = cmia[i][2];
232
 
233
      assign cmi0[i][3] = imoe0[i];
234
      assign cmi1[i][3] = imoe1[i];
235
      assign cmi2[i][3] = imoe2[i];
236
      assign cmi3[i][3] = imoe3[i];
237
      assign cmi4[i][3] = imoe4[i];
238
      assign imoea[i] = cmia[i][3];
239
 
240
      assign cmi0[i][4] = imol0[i];
241
      assign cmi1[i][4] = imol1[i];
242
      assign cmi2[i][4] = imol2[i];
243
      assign cmi3[i][4] = imol3[i];
244
      assign cmi4[i][4] = imol4[i];
245
      assign imola[i] = cmia[i][4];
246
 
247
      // CM modules
248
      dcb_xy #(.VCN(1), .VCW(DW))
249
      CM (
250
          .sia   ( cmia[i][0]   ),
251
          .wia   ( cmia[i][1]   ),
252
          .nia   ( cmia[i][2]   ),
253
          .eia   ( cmia[i][3]   ),
254
          .lia   ( cmia[i][4]   ),
255
          .so0   ( cmo0[i][0]   ),
256
          .so1   ( cmo1[i][0]   ),
257
          .so2   ( cmo2[i][0]   ),
258
          .so3   ( cmo3[i][0]   ),
259
          .so4   ( cmo4[i][0]   ),
260
          .wo0   ( cmo0[i][1]   ),
261
          .wo1   ( cmo1[i][1]   ),
262
          .wo2   ( cmo2[i][1]   ),
263
          .wo3   ( cmo3[i][1]   ),
264
          .wo4   ( cmo4[i][1]   ) ,
265
          .no0   ( cmo0[i][2]   ),
266
          .no1   ( cmo1[i][2]   ),
267
          .no2   ( cmo2[i][2]   ),
268
          .no3   ( cmo3[i][2]   ),
269
          .no4   ( cmo4[i][2]   ),
270
          .eo0   ( cmo0[i][3]   ),
271
          .eo1   ( cmo1[i][3]   ),
272
          .eo2   ( cmo2[i][3]   ),
273
          .eo3   ( cmo3[i][3]   ),
274
          .eo4   ( cmo4[i][3]   ),
275
          .lo0   ( cmo0[i][4]   ),
276
          .lo1   ( cmo1[i][4]   ),
277
          .lo2   ( cmo2[i][4]   ),
278
          .lo3   ( cmo3[i][4]   ),
279
          .lo4   ( cmo4[i][4]   ),
280
          .si0   ( cmi0[i][0]   ),
281
          .si1   ( cmi1[i][0]   ),
282
          .si2   ( cmi2[i][0]   ),
283
          .si3   ( cmi3[i][0]   ),
284
          .si4   ( cmi4[i][0]   ),
285
          .wi0   ( cmi0[i][1]   ),
286
          .wi1   ( cmi1[i][1]   ),
287
          .wi2   ( cmi2[i][1]   ),
288
          .wi3   ( cmi3[i][1]   ),
289
          .wi4   ( cmi4[i][1]   ),
290
          .ni0   ( cmi0[i][2]   ),
291
          .ni1   ( cmi1[i][2]   ),
292
          .ni2   ( cmi2[i][2]   ),
293
          .ni3   ( cmi3[i][2]   ),
294
          .ni4   ( cmi4[i][2]   ),
295
          .ei0   ( cmi0[i][3]   ),
296
          .ei1   ( cmi1[i][3]   ),
297
          .ei2   ( cmi2[i][3]   ),
298
          .ei3   ( cmi3[i][3]   ),
299
          .ei4   ( cmi4[i][3]   ),
300
          .li0   ( cmi0[i][4]   ),
301
          .li1   ( cmi1[i][4]   ),
302
          .li2   ( cmi2[i][4]   ),
303
          .li3   ( cmi3[i][4]   ),
304
          .li4   ( cmi4[i][4]   ),
305
          .soa   ( cmoa[i][0]   ),
306
          .woa   ( cmoa[i][1]   ),
307
          .noa   ( cmoa[i][2]   ),
308
          .eoa   ( cmoa[i][3]   ),
309
          .loa   ( cmoa[i][4]   ),
310
          .wcfg  ( wcfg[i]      ),
311
          .ecfg  ( ecfg[i]      ),
312
          .lcfg  ( lcfg[i]      ),
313
          .scfg  ( scfg[i]      ),
314
          .ncfg  ( ncfg[i]      )
315
          );
316
 
317
      // shuffle between CMs and OMs(OPs)
318
      assign so0[i] = cmo0[i][0];
319
      assign so1[i] = cmo1[i][0];
320
      assign so2[i] = cmo2[i][0];
321
      assign so3[i] = cmo3[i][0];
322
      assign so4[i] = cmo4[i][0];
323
      assign cmoa[i][0] = soa[i];
324
 
325
      assign wo0[i] = cmo0[i][1];
326
      assign wo1[i] = cmo1[i][1];
327
      assign wo2[i] = cmo2[i][1];
328
      assign wo3[i] = cmo3[i][1];
329
      assign wo4[i] = cmo4[i][1];
330
      assign cmoa[i][1] = woa[i];
331
 
332
      assign no0[i] = cmo0[i][2];
333
      assign no1[i] = cmo1[i][2];
334
      assign no2[i] = cmo2[i][2];
335
      assign no3[i] = cmo3[i][2];
336
      assign no4[i] = cmo4[i][2];
337
      assign cmoa[i][2] = noa[i];
338
 
339
      assign eo0[i] = cmo0[i][3];
340
      assign eo1[i] = cmo1[i][3];
341
      assign eo2[i] = cmo2[i][3];
342
      assign eo3[i] = cmo3[i][3];
343
      assign eo4[i] = cmo4[i][3];
344
      assign cmoa[i][3] = eoa[i];
345
 
346
      assign lo0[i] = cmo0[i][4];
347
      assign lo1[i] = cmo1[i][4];
348
      assign lo2[i] = cmo2[i][4];
349
      assign lo3[i] = cmo3[i][4];
350
      assign lo4[i] = cmo4[i][4];
351
      assign cmoa[i][4] = loa[i];
352
   end // block: IMSHF
353
 
354
   endgenerate
355
 
356
 
357
endmodule // dclos
358
 
359
 
360
 
361
 
362
 
363
 
364
 
365
 
366
 
367
 

powered by: WebSVN 2.1.0

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