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 77

Go to most recent revision | 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
   wire [NN-1:0][SCN-1:0]      soa4, woa4, noa4, eoa4, loa4;
85
   wire [MN-1:0][4:0][SCN-1:0] cmo4;
86
`else
87
   wire [MN-1:0]                sim4, wim4, nim4, eim4, lim4;
88
   wire [MN-1:0]                sima, wima, nima, eima, lima;
89
   wire [NN-1:0]                soa4, woa4, noa4, eoa4, loa4;
90
   wire [MN-1:0][4:0]            cmo4;
91
`endif // !`ifdef ENABLE_CHANNEL_SLICING
92
 
93
   wire [MN-1:0][3:0]            simdec, nimdec, limdec; // the routing requests
94
   wire [MN-1:0][1:0]            wimdec, eimdec;   // the routing requests
95
 
96
`ifndef ENABLE_CRRD
97
   wire [MN-1:0][3:0]            sims, nims, lims;
98
   wire [MN-1:0][1:0]            wims, eims;
99
   wire [MN-1:0][4:0]            cms;
100
`endif
101
 
102 71 wsong0210
   genvar                      i,j;
103
 
104
 
105
   // the IMs
106
   im #(.MN(MN), .NN(NN), .DW(DW), .SN(4))
107
   SIM (
108
        .do0   ( sim0   ),
109
        .do1   ( sim1   ),
110
        .do2   ( sim2   ),
111
        .do3   ( sim3   ),
112
        .deco  ( simdec ),
113
        .dia   ( sia    ),
114
        .do4   ( sim4   ),
115
        .di0   ( si0    ),
116
        .di1   ( si1    ),
117
        .di2   ( si2    ),
118
        .di3   ( si3    ),
119
        .deci  ( sdec   ),
120
        .di4   ( si4    ),
121
        .doa   ( sima   ),
122
`ifndef ENABLE_CRRD
123
        .cms   ( sims   ),
124
`endif
125
        .rst_n ( rst_n  )
126
        );
127
 
128
   im #(.MN(MN), .NN(NN), .DW(DW), .SN(2))
129
   WIM (
130
        .do0   ( wim0   ),
131
        .do1   ( wim1   ),
132
        .do2   ( wim2   ),
133
        .do3   ( wim3   ),
134
        .deco  ( wimdec ),
135
        .dia   ( wia    ),
136
        .do4   ( wim4   ),
137
        .di0   ( wi0    ),
138
        .di1   ( wi1    ),
139
        .di2   ( wi2    ),
140
        .di3   ( wi3    ),
141
        .deci  ( wdec   ),
142
        .di4   ( wi4    ),
143
        .doa   ( wima   ),
144
`ifndef ENABLE_CRRD
145
        .cms   ( wims   ),
146
`endif
147
        .rst_n ( rst_n  )
148
        );
149
 
150
   im #(.MN(MN), .NN(NN), .DW(DW), .SN(4))
151
   NIM (
152
        .do0   ( nim0   ),
153
        .do1   ( nim1   ),
154
        .do2   ( nim2   ),
155
        .do3   ( nim3   ),
156
        .deco  ( nimdec ),
157
        .dia   ( nia    ),
158
        .do4   ( nim4   ),
159
        .di0   ( ni0    ),
160
        .di1   ( ni1    ),
161
        .di2   ( ni2    ),
162
        .di3   ( ni3    ),
163
        .deci  ( ndec   ),
164
        .di4   ( ni4    ),
165
        .doa   ( nima   ),
166
`ifndef ENABLE_CRRD
167
        .cms   ( nims   ),
168
`endif
169
        .rst_n ( rst_n  )
170
        );
171
 
172
   im #(.MN(MN), .NN(NN), .DW(DW), .SN(2))
173
   EIM (
174
        .do0   ( eim0   ),
175
        .do1   ( eim1   ),
176
        .do2   ( eim2   ),
177
        .do3   ( eim3   ),
178
        .deco  ( eimdec ),
179
        .dia   ( eia    ),
180
        .do4   ( eim4   ),
181
        .di0   ( ei0    ),
182
        .di1   ( ei1    ),
183
        .di2   ( ei2    ),
184
        .di3   ( ei3    ),
185
        .deci  ( edec   ),
186
        .di4   ( ei4    ),
187
        .doa   ( eima   ),
188
`ifndef ENABLE_CRRD
189
        .cms   ( eims   ),
190
`endif
191
        .rst_n ( rst_n  )
192
        );
193
 
194
   im #(.MN(MN), .NN(NN), .DW(DW), .SN(4))
195
   LIM (
196
        .do0   ( lim0   ),
197
        .do1   ( lim1   ),
198
        .do2   ( lim2   ),
199
        .do3   ( lim3   ),
200
        .deco  ( limdec ),
201
        .dia   ( lia    ),
202
        .do4   ( lim4   ),
203
        .di0   ( li0    ),
204
        .di1   ( li1    ),
205
        .di2   ( li2    ),
206
        .di3   ( li3    ),
207
        .deci  ( ldec   ),
208
        .di4   ( li4    ),
209
        .doa   ( lima   ),
210
`ifndef ENABLE_CRRD
211
        .cms   ( lims   ),
212
`endif
213
        .rst_n ( rst_n  )
214
        );
215
 
216
   // data wire shuffle
217
   // the CMs
218
   generate
219
      for(i=0; i<MN; i++) begin:CMSH
220
         assign cmi0[i][0] = sim0[i];
221
         assign cmi1[i][0] = sim1[i];
222
         assign cmi2[i][0] = sim2[i];
223
         assign cmi3[i][0] = sim3[i];
224
         assign sima[i] = cmia[i][0];
225
         assign sima4[i] = cmia[i][0];
226
 
227
         assign cmi0[i][1] = wim0[i];
228
         assign cmi1[i][1] = wim1[i];
229
         assign cmi2[i][1] = wim2[i];
230
         assign cmi3[i][1] = wim3[i];
231
         assign wima[i] = cmia[i][1];
232
         assign wima4[i] = cmia[i][1];
233
 
234
         assign cmi0[i][2] = nim0[i];
235
         assign cmi1[i][2] = nim1[i];
236
         assign cmi2[i][2] = nim2[i];
237
         assign cmi3[i][2] = nim3[i];
238
         assign nima[i] = cmia[i][2];
239
         assign nima4[i] = cmia[i][2];
240
 
241
         assign cmi0[i][3] = eim0[i];
242
         assign cmi1[i][3] = eim1[i];
243
         assign cmi2[i][3] = eim2[i];
244
         assign cmi3[i][3] = eim3[i];
245
         assign eima[i] = cmia[i][3];
246
         assign eima4[i] = cmia[i][3];
247
 
248
         assign cmi0[i][4] = lim0[i];
249
         assign cmi1[i][4] = lim1[i];
250
         assign cmi2[i][4] = lim2[i];
251
         assign cmi3[i][4] = lim3[i];
252
         assign lima[i] = cmia[i][4];
253
         assign lima4[i] = cmia[i][4];
254
 
255
         cm #(.KN(5), .DW(DW))
256
         CMSW (
257 77 wsong0210
               .do0   ( cmo0[i]   ),
258
               .do1   ( cmo1[i]   ),
259
               .do2   ( cmo2[i]   ),
260
               .do3   ( cmo3[i]   ),
261
               .dia   ( cmia[i]   ),
262
               .do4   ( cmo4[i]   ),
263
               .di0   ( cmi0[i]   ),
264
               .di1   ( cmi1[i]   ),
265
               .di2   ( cmi2[i]   ),
266
               .di3   ( cmi3[i]   ),
267
               .sdec  ( simdec[i] ),
268
               .ndec  ( nimdec[i] ),
269
               .ldec  ( limdec[i] ),
270
               .wdec  ( wimdec[i] ),
271
               .edec  ( eimdec[i] ),
272
               .di4   ( cmi4[i]   ),
273
               .doa   ( cmoa[i]   ),
274
               .doa4  ( cmoa4[i]  ),
275 71 wsong0210
`ifndef ENABLE_CRRD
276 77 wsong0210
               .cms   ( cms[i]    ),
277 71 wsong0210
`endif
278 77 wsong0210
               .rst_n ( rst_n     )
279 71 wsong0210
               );
280
 
281 72 wsong0210
         assign so0[i] = cmo0[i][0];
282
         assign so1[i] = cmo1[i][0];
283
         assign so2[i] = cmo2[i][0];
284
         assign so3[i] = cmo3[i][0];
285
         assign cmoa[i][0] = soa[i];
286
         assign cmoa[i][0] = soa4[i];
287
 
288
         assign wo0[i] = cmo0[i][1];
289
         assign wo1[i] = cmo1[i][1];
290
         assign wo2[i] = cmo2[i][1];
291
         assign wo3[i] = cmo3[i][1];
292
         assign cmoa[i][1] = woa[i];
293
         assign cmoa[i][1] = woa4[i];
294
 
295
         assign no0[i] = cmo0[i][2];
296
         assign no1[i] = cmo1[i][2];
297
         assign no2[i] = cmo2[i][2];
298
         assign no3[i] = cmo3[i][2];
299
         assign cmoa[i][2] = noa[i];
300
         assign cmoa[i][2] = noa4[i];
301
 
302
         assign eo0[i] = cmo0[i][3];
303
         assign eo1[i] = cmo1[i][3];
304
         assign eo2[i] = cmo2[i][3];
305
         assign eo3[i] = cmo3[i][3];
306
         assign cmoa[i][3] = eoa[i];
307
         assign cmoa[i][3] = eoa4[i];
308
 
309
         assign lo0[i] = cmo0[i][4];
310
         assign lo1[i] = cmo1[i][4];
311
         assign lo2[i] = cmo2[i][4];
312
         assign lo3[i] = cmo3[i][4];
313
         assign cmoa[i][4] = loa[i];
314
         assign cmoa[i][4] = loa4[i];
315
 
316 77 wsong0210
         assign sims[i] = {cms[i][4],cms[i][3],cms[i][2],cms[i][1]};
317
         assign wims[i] = {cms[i][4],cms[i][3]};
318
         assign nims[i] = {cms[i][4],cms[i][3],cms[i][1],cms[i][0]};
319
         assign eims[i] = {cms[i][4],cms[i][1]};
320
         assign lims[i] = {cms[i][3],cms[i][2],cms[i][1],cms[i][0]};
321
 
322 72 wsong0210
      end
323
   endgenerate
324 71 wsong0210
 
325 72 wsong0210
 
326
endmodule // clos

powered by: WebSVN 2.1.0

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