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

Subversion Repositories async_sdm_noc

[/] [async_sdm_noc/] [branches/] [init/] [vc/] [src/] [rtu.v] - Blame information for rev 45

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

Line No. Rev Author Line
1 39 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
 The routing calculation unit in every input buffer.
13
 p0 -> L -> p1 -> RTC -> p2 -> L -> p3 -> DEMUX -> p[0] -> L -> p[1] -> L -> p[2] -> L -> p[3] -> L -> p[4]
14
 
15
 History:
16
 02/04/2010  Initial version. <wsong83@gmail.com>
17
 02/06/2011  Clean up for opensource. <wsong83@gmail.com>
18
 
19
*/
20
 
21
module rtu (/*AUTOARG*/
22
   // Outputs
23
   dia, dort,
24
   // Inputs
25 45 wsong0210
   rst_n, di0, di1, di2, di3, dit, divc, addrx, addry, doa
26 39 wsong0210
   );
27
   parameter VCN = 2;
28
   parameter DIR = 0;
29
   parameter SN = 4;
30
   parameter PD = 2;
31
 
32 45 wsong0210
   input            rst_n;
33 39 wsong0210
   input [3:0]      di0, di1, di2, di3;
34
   input [2:0]       dit;
35
   input [VCN-1:0]  divc;
36
   output           dia;
37
 
38
   input [7:0]       addrx, addry;
39
 
40
   output [VCN-1:0][SN-1:0] dort;
41
   input [VCN-1:0]           doa;
42
 
43
   //------------------------------------------
44
   wire             p0an, p0ap, p0den, p0ad, p0avc;
45
   wire [3:0]        p1d0, p1d1, p1d2, p1d3;
46
   wire [VCN-1:0]   p1vc;
47
   wire             p1a, p1ad, p1avc, p1an;
48
   wire [SN-1:0]    p2d;
49
   wire [VCN-1:0]   p2vc;
50
   wire             p2a, p2ad, p2avc, p2an;
51
   wire [SN-1:0]    p3d;
52
   wire [VCN-1:0]   p3vc;
53
   wire             p3a, p3an;
54
   wire [PD*2:0][VCN-1:0][SN-1:0] pd;
55
   wire [PD*2:0][VCN-1:0]           pda, pdan;
56
 
57
   wire [2:0]                      x_cmp [1:0];
58
   wire [2:0]                      y_cmp [1:0];
59
   wire [5:0]                      dec;
60
   wire                           ds, dw, dn, de, dl;
61
 
62
 
63
   genvar                         gvc, gbd, i;
64
 
65
   //------------------------------------------
66
   // p0 -> L -> p1
67
 
68
   c2 CP0DE ( .a0(dit[0]), .a1(p1an), .q(p0den));
69
   c2 CP0A  ( .a0(p0ad), .a1(p0avc), .q(p0ap));
70
   assign p0an = |dit[2:1];
71
   assign dia = p0an | p0ap;
72
 
73
   pipe4 #(.DW(8))
74
   L0D (
75 42 wsong0210
        .ia ( p0ad   ),
76
        .o0 ( p1d0   ),
77
        .o1 ( p1d1   ),
78
        .o2 ( p1d2   ),
79
        .o3 ( p1d3   ),
80
        .i0 ( di0    ),
81
        .i1 ( di1    ),
82
        .i2 ( di2    ),
83
        .i3 ( di3    ),
84
        .oa ( p0den  )
85 39 wsong0210
        );
86
 
87
   pipen #(.DW(VCN))
88
   L0V (
89
        .d_in    ( divc    ),
90
        .d_in_a  ( p0avc   ),
91
        .d_out   ( p1vc    ),
92
        .d_out_a ( p0den   )
93
        );
94
 
95
   // p1 -> RTC -> p2
96
   comp4 X0 ( .a({p1d3[0], p1d2[0], p1d1[0], p1d0[0]}), .b(addrx[3:0]), .q(x_cmp[0]));
97
   comp4 X1 ( .a({p1d3[1], p1d2[1], p1d1[1], p1d0[1]}), .b(addrx[7:4]), .q(x_cmp[1]));
98
   comp4 Y0 ( .a({p1d3[2], p1d2[2], p1d1[2], p1d0[2]}), .b(addry[3:0]), .q(y_cmp[0]));
99
   comp4 Y1 ( .a({p1d3[3], p1d2[3], p1d1[3], p1d0[3]}), .b(addry[7:4]), .q(y_cmp[1]));
100
 
101
   assign dec[0] = x_cmp[1][0] | (x_cmp[1][2]&x_cmp[0][0]);       // frame x > addr x
102
   assign dec[1] = x_cmp[1][1] | (x_cmp[1][2]&x_cmp[0][1]);       // frame x < addr x
103
   assign dec[2] = x_cmp[1][2] & x_cmp[0][2];                     // frame x = addr x
104
   assign dec[3] = y_cmp[1][0] | (y_cmp[1][2]&y_cmp[0][0]);       // frame y > addr y
105
   assign dec[4] = y_cmp[1][1] | (y_cmp[1][2]&y_cmp[0][1]);       // frame y < addr y
106
   assign dec[5] = y_cmp[1][2] & y_cmp[0][2];                     // frame y = addr y
107
 
108
   assign ds = dec[0];
109
   assign dw = dec[2]&dec[4];
110
   assign dn = dec[1];
111
   assign de = dec[2]&dec[3];
112
   assign dl = dec[2]&dec[5];
113
 
114
   assign p2d =
115
                   DIR == 0 ?   {dl, de, dn, dw}  :       // south port
116
                   DIR == 1 ?   {dl, de}          :       // west port
117
                   DIR == 2 ?   {dl, de, dw, ds}  :       // north port
118
                   DIR == 3 ?   {dl, dw}          :       // east port
119
                                {de, dn, dw, ds}  ;       // local port
120
 
121
   assign p2vc = p1vc;
122
   assign p1an = p2an;
123
 
124
   // p2 -> L -> p3
125
 
126
   c2 CP2A  ( .a0(p2ad), .a1(p2avc), .q(p2a));
127 45 wsong0210
   assign p2an = (~p2a) & rst_n;
128 39 wsong0210
 
129
   pipen #(.DW(SN))
130
   L2R (
131
        .d_in    ( p2d     ),
132
        .d_in_a  ( p2ad    ),
133
        .d_out   ( p3d     ),
134
        .d_out_a ( p3an    )
135
        );
136
 
137
   pipen #(.DW(VCN))
138
   L2V (
139
        .d_in    ( p2vc    ),
140
        .d_in_a  ( p2avc   ),
141
        .d_out   ( p3vc    ),
142
        .d_out_a ( p3an    )
143
        );
144
 
145
   // p3 -> DEMUX -> pd[0]
146
   ddmux #(.DW(SN), .VCN(VCN))
147
   RTDM (
148
         .d_in_a  ( p3a   ),
149
         .d_out   ( pd[0] ),
150
         .d_in    ( p3d   ),
151
         .d_sel   ( p3vc  ),
152
         .d_out_a ( pda[0])
153
         );
154
 
155 45 wsong0210
   assign p3an = (~p3a) & rst_n;
156 39 wsong0210
 
157
   // pd pipeline
158
   generate
159
      for(gbd=0; gbd<PD*2; gbd++) begin:RT
160
         for(gvc=0; gvc<VCN; gvc++) begin:V
161
            pipen #(.DW(SN))
162
            P (
163
               .d_in    ( pd[gbd][gvc]     ),
164
               .d_in_a  ( pda[gbd][gvc]    ),
165
               .d_out   ( pd[gbd+1][gvc]   ),
166
               .d_out_a ( pdan[gbd+1][gvc] )
167
               );
168 45 wsong0210
            assign pdan[gbd+1][gvc] = (~pda[gbd+1][gvc])&rst_n;
169 39 wsong0210
         end
170
      end // block: RT
171
   endgenerate
172
 
173
   // output
174
   generate
175
      for(gvc=0; gvc<VCN; gvc++) begin:OV
176
         assign dort[gvc] = pd[PD*2][gvc];
177
         assign pda[PD*2][gvc] = doa[gvc];
178
      end
179
   endgenerate
180
 
181
endmodule // rtu
182
 
183
 
184
 
185
 

powered by: WebSVN 2.1.0

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