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

Subversion Repositories nocem

[/] [nocem/] [trunk/] [VHDL/] [vc_node_ch_arbiter.vhd] - Blame information for rev 8

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 4 schelleg
 
2
library IEEE;
3
use IEEE.STD_LOGIC_1164.ALL;
4
use IEEE.STD_LOGIC_ARITH.ALL;
5
use IEEE.STD_LOGIC_UNSIGNED.ALL;
6
use work.pkg_nocem.all;
7
 
8
 
9
entity vc_node_ch_arbiter is
10
    Port (
11
                -- needed to mux outputs for the accompanying switch
12
                arb_grant_output : out arb_decision_array(4 downto 0);
13
 
14
           n_channel_cntrl_in  : in channel_cntrl_word;
15
           n_channel_cntrl_out : out channel_cntrl_word;
16
 
17
           s_channel_cntrl_in  : in channel_cntrl_word;
18
           s_channel_cntrl_out : out channel_cntrl_word;
19
 
20
           e_channel_cntrl_in  : in channel_cntrl_word;
21
           e_channel_cntrl_out : out channel_cntrl_word;
22
 
23
           w_channel_cntrl_in  : in channel_cntrl_word;
24
           w_channel_cntrl_out : out channel_cntrl_word;
25
 
26
           ap_channel_cntrl_in  : in channel_cntrl_word;
27
           ap_channel_cntrl_out : out channel_cntrl_word;
28
 
29
           clk : in std_logic;
30
      rst : in std_logic
31
 
32
                );
33
end vc_node_ch_arbiter;
34
 
35
architecture Behavioral of vc_node_ch_arbiter is
36
 
37
        constant VCS_ALL_FULL : std_logic_vector(NOCEM_NUM_VC-1 downto 0) := (others => '1');
38
 
39
 
40
        signal dest_local_port                          : arb_decision_array(4 downto 0);
41
        signal arb_decision_enum                : arb_decision_array(4 downto 0);
42
        signal channel_cntrl_in_array_i  : channel_cntrl_array(4 downto 0);
43
        signal channel_cntrl_out_array_ureg : channel_cntrl_array(4 downto 0);
44
        signal dest_local_vc_ureg,dest_local_vc_reg                             : vc_addr_array(4 downto 0);
45
        signal channel_cntrl_out_array   : channel_cntrl_array(4 downto 0);
46
        signal n_channel_cntrl_out_reg  : channel_cntrl_word;
47
        signal s_channel_cntrl_out_reg  : channel_cntrl_word;
48
        signal e_channel_cntrl_out_reg  : channel_cntrl_word;
49
        signal w_channel_cntrl_out_reg  : channel_cntrl_word;
50
        signal ap_channel_cntrl_out_reg : channel_cntrl_word;
51
        signal arb_grant_output_reg,arb_grant_output_ureg               : arb_decision_array(4 downto 0);
52
 
53
        signal zeroes_bv : bit_vector(NOCEM_NUM_VC-1 downto 0);
54
 
55
begin
56
 
57
        zeroes_bv <= (others => '0');
58
 
59
 
60
        -- just setting up an array or two for "easy" looping
61
        arb_decision_enum(NOCEM_AP_IX)          <= ARB_AP;
62
        arb_decision_enum(NOCEM_NORTH_IX)       <= ARB_NORTH;
63
        arb_decision_enum(NOCEM_SOUTH_IX)       <= ARB_SOUTH;
64
        arb_decision_enum(NOCEM_EAST_IX)        <= ARB_EAST;
65
        arb_decision_enum(NOCEM_WEST_IX)        <= ARB_WEST;
66
 
67
        dest_local_port(NOCEM_AP_IX)            <= ap_channel_cntrl_in(NOCEM_CHFIFO_VC_CHDEST_HIX downto NOCEM_CHFIFO_VC_CHDEST_LIX);
68
        dest_local_port(NOCEM_NORTH_IX)         <= n_channel_cntrl_in(NOCEM_CHFIFO_VC_CHDEST_HIX downto NOCEM_CHFIFO_VC_CHDEST_LIX);
69
        dest_local_port(NOCEM_SOUTH_IX)         <= s_channel_cntrl_in(NOCEM_CHFIFO_VC_CHDEST_HIX downto NOCEM_CHFIFO_VC_CHDEST_LIX);
70
        dest_local_port(NOCEM_EAST_IX)  <= e_channel_cntrl_in(NOCEM_CHFIFO_VC_CHDEST_HIX downto NOCEM_CHFIFO_VC_CHDEST_LIX);
71
        dest_local_port(NOCEM_WEST_IX)  <= w_channel_cntrl_in(NOCEM_CHFIFO_VC_CHDEST_HIX downto NOCEM_CHFIFO_VC_CHDEST_LIX);
72
 
73
        dest_local_vc_ureg(NOCEM_AP_IX)                 <= ap_channel_cntrl_in(NOCEM_CHFIFO_VC_VCDEST_HIX downto NOCEM_CHFIFO_VC_VCDEST_LIX);
74
        dest_local_vc_ureg(NOCEM_NORTH_IX)      <= n_channel_cntrl_in(NOCEM_CHFIFO_VC_VCDEST_HIX downto NOCEM_CHFIFO_VC_VCDEST_LIX);
75
        dest_local_vc_ureg(NOCEM_SOUTH_IX)      <= s_channel_cntrl_in(NOCEM_CHFIFO_VC_VCDEST_HIX downto NOCEM_CHFIFO_VC_VCDEST_LIX);
76
        dest_local_vc_ureg(NOCEM_EAST_IX)       <= e_channel_cntrl_in(NOCEM_CHFIFO_VC_VCDEST_HIX downto NOCEM_CHFIFO_VC_VCDEST_LIX);
77
        dest_local_vc_ureg(NOCEM_WEST_IX)       <= w_channel_cntrl_in(NOCEM_CHFIFO_VC_VCDEST_HIX downto NOCEM_CHFIFO_VC_VCDEST_LIX);
78
 
79
 
80
 
81
 
82
        channel_cntrl_in_array_i(NOCEM_NORTH_IX) <= n_channel_cntrl_in;
83
        channel_cntrl_in_array_i(NOCEM_SOUTH_IX) <= s_channel_cntrl_in;
84
        channel_cntrl_in_array_i(NOCEM_EAST_IX)  <= e_channel_cntrl_in;
85
        channel_cntrl_in_array_i(NOCEM_WEST_IX)  <= w_channel_cntrl_in;
86
        channel_cntrl_in_array_i(NOCEM_AP_IX)    <= ap_channel_cntrl_in;
87
 
88
 
89
 
90
        n_channel_cntrl_out  <= channel_cntrl_out_array(NOCEM_NORTH_IX);
91
        s_channel_cntrl_out  <= channel_cntrl_out_array(NOCEM_SOUTH_IX);
92
        e_channel_cntrl_out  <= channel_cntrl_out_array(NOCEM_EAST_IX);
93
        w_channel_cntrl_out  <= channel_cntrl_out_array(NOCEM_WEST_IX);
94
        ap_channel_cntrl_out <= channel_cntrl_out_array(NOCEM_AP_IX);
95
 
96
 
97
 
98
outputs_regd : process (clk,rst)
99
begin
100
 
101
        if rst='1' then
102
 
103
                n_channel_cntrl_out_reg  <= (others => '0');
104
                s_channel_cntrl_out_reg  <= (others => '0');
105
                e_channel_cntrl_out_reg  <= (others => '0');
106
                w_channel_cntrl_out_reg  <= (others => '0');
107
                ap_channel_cntrl_out_reg <= (others => '0');
108
                arb_grant_output_reg     <= (others => ARB_NODECISION);
109
                dest_local_vc_reg        <= (others => (others => '0'));
110
        elsif clk='1' and clk'event then
111
 
112
                n_channel_cntrl_out_reg  <= channel_cntrl_out_array_ureg(NOCEM_NORTH_IX);
113
                s_channel_cntrl_out_reg  <= channel_cntrl_out_array_ureg(NOCEM_SOUTH_IX);
114
                e_channel_cntrl_out_reg  <= channel_cntrl_out_array_ureg(NOCEM_EAST_IX);
115
                w_channel_cntrl_out_reg  <= channel_cntrl_out_array_ureg(NOCEM_WEST_IX);
116
                ap_channel_cntrl_out_reg <= channel_cntrl_out_array_ureg(NOCEM_AP_IX);
117
                arb_grant_output_reg     <= arb_grant_output_ureg;
118
                dest_local_vc_reg                        <=  dest_local_vc_ureg;
119
        end if;
120
 
121
 
122
end process;
123
 
124
 
125
outputs_post_regd : process (n_channel_cntrl_in, s_channel_cntrl_in, e_channel_cntrl_in, w_channel_cntrl_in, ap_channel_cntrl_in, n_channel_cntrl_out_reg, s_channel_cntrl_out_reg, e_channel_cntrl_out_reg, w_channel_cntrl_out_reg, ap_channel_cntrl_out_reg, arb_grant_output_reg, dest_local_vc_reg, channel_cntrl_in_array_i, zeroes_bv)
126
begin
127
 
128
 
129
 
130
 
131
 
132
 
133
 
134
                -- need to do a sanity check that the incoming channel still has 
135
                -- data to give.  This is an artifact of the register pushing inside the 
136
                -- the arbitration process;
137
 
138
                channel_cntrl_out_array(NOCEM_NORTH_IX)                 <= n_channel_cntrl_out_reg;
139
                channel_cntrl_out_array(NOCEM_SOUTH_IX)                 <= s_channel_cntrl_out_reg;
140
                channel_cntrl_out_array(NOCEM_EAST_IX)          <= e_channel_cntrl_out_reg;
141
                channel_cntrl_out_array(NOCEM_WEST_IX)          <= w_channel_cntrl_out_reg;
142
                channel_cntrl_out_array(NOCEM_AP_IX)                    <= ap_channel_cntrl_out_reg;
143
 
144
                arb_grant_output                                                                                <=  arb_grant_output_reg;
145
 
146
 
147
                -- looking to see that what is being read is still there after some pipeline stages
148
                -- if not, just kill the read/write and switch allocation.  Also need to check if outgoing
149
                -- VC is not full now
150
 
151
 
152
                -- I iterates over output channels
153
                lll: for I in 4 downto 0 loop
154
 
155
                        if arb_grant_output_reg(I) = ARB_NORTH and
156
                                -- if incoming FIFO is now empty                         
157
                                ((((TO_BITVECTOR(n_channel_cntrl_in(NOCEM_CHFIFO_VC_EMPTY_HIX downto NOCEM_CHFIFO_VC_EMPTY_LIX)))
158
                                        and (TO_BITVECTOR(n_channel_cntrl_out_reg(NOCEM_CHFIFO_VC_RD_ADDR_HIX downto NOCEM_CHFIFO_VC_RD_ADDR_LIX)))) /= zeroes_bv) or
159
                                -- if outgoing is FIFO is mow full
160
                                ((TO_BITVECTOR(dest_local_vc_reg(NOCEM_NORTH_IX)) and TO_BITVECTOR(channel_cntrl_in_array_i(I)(NOCEM_CHFIFO_VC_FULL_HIX downto NOCEM_CHFIFO_VC_FULL_LIX))) /= zeroes_bv) )
161
                                        then
162
 
163
                                        arb_grant_output(I) <= ARB_NODECISION;
164
 
165
                                        channel_cntrl_out_array(NOCEM_NORTH_IX)(NOCEM_CHFIFO_DATA_RE_IX) <= '0';
166
                                        channel_cntrl_out_array(NOCEM_NORTH_IX)(NOCEM_CHFIFO_CNTRL_RE_IX) <= '0';
167
                                        channel_cntrl_out_array(NOCEM_NORTH_IX)(NOCEM_CHFIFO_VC_RD_ADDR_HIX downto NOCEM_CHFIFO_VC_RD_ADDR_LIX) <= (others => '0');
168
 
169
                                   channel_cntrl_out_array(I)(NOCEM_CHFIFO_DATA_WE_IX) <= '0';
170
                                   channel_cntrl_out_array(I)(NOCEM_CHFIFO_CNTRL_WE_IX) <= '0';
171
                         channel_cntrl_out_array(I)(NOCEM_CHFIFO_VC_WR_ADDR_HIX downto NOCEM_CHFIFO_VC_WR_ADDR_LIX) <= (others => '0');
172
 
173
                        end if;
174
 
175
                        if arb_grant_output_reg(I) = ARB_SOUTH and
176
                                -- if incoming FIFO is now empty                         
177
                                ((((TO_BITVECTOR(s_channel_cntrl_in(NOCEM_CHFIFO_VC_EMPTY_HIX downto NOCEM_CHFIFO_VC_EMPTY_LIX)))
178
                                        and (TO_BITVECTOR(s_channel_cntrl_out_reg(NOCEM_CHFIFO_VC_RD_ADDR_HIX downto NOCEM_CHFIFO_VC_RD_ADDR_LIX)))) /= zeroes_bv) or
179
                                -- if outgoing is FIFO is mow full
180
                                ((TO_BITVECTOR(dest_local_vc_reg(NOCEM_SOUTH_IX)) and TO_BITVECTOR(channel_cntrl_in_array_i(I)(NOCEM_CHFIFO_VC_FULL_HIX downto NOCEM_CHFIFO_VC_FULL_LIX))) /= zeroes_bv) )
181
                                        then
182
 
183
 
184
 
185
                                        arb_grant_output(I) <= ARB_NODECISION;
186
 
187
                                        channel_cntrl_out_array(NOCEM_SOUTH_IX)(NOCEM_CHFIFO_DATA_RE_IX) <= '0';
188
                                        channel_cntrl_out_array(NOCEM_SOUTH_IX)(NOCEM_CHFIFO_CNTRL_RE_IX) <= '0';
189
                                        channel_cntrl_out_array(NOCEM_SOUTH_IX)(NOCEM_CHFIFO_VC_RD_ADDR_HIX downto NOCEM_CHFIFO_VC_RD_ADDR_LIX) <= (others => '0');
190
 
191
                                   channel_cntrl_out_array(I)(NOCEM_CHFIFO_DATA_WE_IX) <= '0';
192
                                   channel_cntrl_out_array(I)(NOCEM_CHFIFO_CNTRL_WE_IX) <= '0';
193
                         channel_cntrl_out_array(I)(NOCEM_CHFIFO_VC_WR_ADDR_HIX downto NOCEM_CHFIFO_VC_WR_ADDR_LIX) <= (others => '0');
194
 
195
                        end if;
196
 
197
                        if arb_grant_output_reg(I) = ARB_EAST and
198
                                -- if incoming FIFO is now empty                         
199
                                ((((TO_BITVECTOR(e_channel_cntrl_in(NOCEM_CHFIFO_VC_EMPTY_HIX downto NOCEM_CHFIFO_VC_EMPTY_LIX)))
200
                                        and (TO_BITVECTOR(e_channel_cntrl_out_reg(NOCEM_CHFIFO_VC_RD_ADDR_HIX downto NOCEM_CHFIFO_VC_RD_ADDR_LIX)))) /= zeroes_bv) or
201
                                -- if outgoing is FIFO is mow full
202
                                ((TO_BITVECTOR(dest_local_vc_reg(NOCEM_EAST_IX)) and TO_BITVECTOR(channel_cntrl_in_array_i(I)(NOCEM_CHFIFO_VC_FULL_HIX downto NOCEM_CHFIFO_VC_FULL_LIX))) /= zeroes_bv) )
203
                                        then
204
 
205
 
206
 
207
 
208
 
209
                                        arb_grant_output(I) <= ARB_NODECISION;
210
 
211
                                        channel_cntrl_out_array(NOCEM_EAST_IX)(NOCEM_CHFIFO_DATA_RE_IX) <= '0';
212
                                        channel_cntrl_out_array(NOCEM_EAST_IX)(NOCEM_CHFIFO_CNTRL_RE_IX) <= '0';
213
                                        channel_cntrl_out_array(NOCEM_EAST_IX)(NOCEM_CHFIFO_VC_RD_ADDR_HIX downto NOCEM_CHFIFO_VC_RD_ADDR_LIX) <= (others => '0');
214
 
215
                                   channel_cntrl_out_array(I)(NOCEM_CHFIFO_DATA_WE_IX) <= '0';
216
                                   channel_cntrl_out_array(I)(NOCEM_CHFIFO_CNTRL_WE_IX) <= '0';
217
                         channel_cntrl_out_array(I)(NOCEM_CHFIFO_VC_WR_ADDR_HIX downto NOCEM_CHFIFO_VC_WR_ADDR_LIX) <= (others => '0');
218
 
219
                        end if;
220
 
221
                        if arb_grant_output_reg(I) = ARB_WEST and
222
                                -- if incoming FIFO is now empty                         
223
                                ((((TO_BITVECTOR(w_channel_cntrl_in(NOCEM_CHFIFO_VC_EMPTY_HIX downto NOCEM_CHFIFO_VC_EMPTY_LIX)))
224
                                        and (TO_BITVECTOR(w_channel_cntrl_out_reg(NOCEM_CHFIFO_VC_RD_ADDR_HIX downto NOCEM_CHFIFO_VC_RD_ADDR_LIX)))) /= zeroes_bv) or
225
                                -- if outgoing is FIFO is mow full
226
                                ((TO_BITVECTOR(dest_local_vc_reg(NOCEM_WEST_IX)) and TO_BITVECTOR(channel_cntrl_in_array_i(I)(NOCEM_CHFIFO_VC_FULL_HIX downto NOCEM_CHFIFO_VC_FULL_LIX))) /= zeroes_bv) )
227
                                        then
228
 
229
 
230
                                        arb_grant_output(I) <= ARB_NODECISION;
231
 
232
                                        channel_cntrl_out_array(NOCEM_WEST_IX)(NOCEM_CHFIFO_DATA_RE_IX) <= '0';
233
                                        channel_cntrl_out_array(NOCEM_WEST_IX)(NOCEM_CHFIFO_CNTRL_RE_IX) <= '0';
234
                                        channel_cntrl_out_array(NOCEM_WEST_IX)(NOCEM_CHFIFO_VC_RD_ADDR_HIX downto NOCEM_CHFIFO_VC_RD_ADDR_LIX) <= (others => '0');
235
 
236
                                   channel_cntrl_out_array(I)(NOCEM_CHFIFO_DATA_WE_IX) <= '0';
237
                                   channel_cntrl_out_array(I)(NOCEM_CHFIFO_CNTRL_WE_IX) <= '0';
238
                         channel_cntrl_out_array(I)(NOCEM_CHFIFO_VC_WR_ADDR_HIX downto NOCEM_CHFIFO_VC_WR_ADDR_LIX) <= (others => '0');
239
 
240
                        end if;
241
 
242
                        if arb_grant_output_reg(I) = ARB_AP and
243
                                -- if incoming FIFO is now empty                         
244
                                ((((TO_BITVECTOR(ap_channel_cntrl_in(NOCEM_CHFIFO_VC_EMPTY_HIX downto NOCEM_CHFIFO_VC_EMPTY_LIX)))
245
                                        and (TO_BITVECTOR(ap_channel_cntrl_out_reg(NOCEM_CHFIFO_VC_RD_ADDR_HIX downto NOCEM_CHFIFO_VC_RD_ADDR_LIX)))) /= zeroes_bv) or
246
                                -- if outgoing is FIFO is mow full
247
                                ((TO_BITVECTOR(dest_local_vc_reg(NOCEM_AP_IX)) and TO_BITVECTOR(channel_cntrl_in_array_i(I)(NOCEM_CHFIFO_VC_FULL_HIX downto NOCEM_CHFIFO_VC_FULL_LIX))) /= zeroes_bv) )
248
                                        then
249
 
250
                                        arb_grant_output(I) <= ARB_NODECISION;
251
 
252
                                        channel_cntrl_out_array(NOCEM_AP_IX)(NOCEM_CHFIFO_DATA_RE_IX) <= '0';
253
                                        channel_cntrl_out_array(NOCEM_AP_IX)(NOCEM_CHFIFO_CNTRL_RE_IX) <= '0';
254
                                        channel_cntrl_out_array(NOCEM_AP_IX)(NOCEM_CHFIFO_VC_RD_ADDR_HIX downto NOCEM_CHFIFO_VC_RD_ADDR_LIX) <= (others => '0');
255
 
256
                                   channel_cntrl_out_array(I)(NOCEM_CHFIFO_DATA_WE_IX) <= '0';
257
                                   channel_cntrl_out_array(I)(NOCEM_CHFIFO_CNTRL_WE_IX) <= '0';
258
                         channel_cntrl_out_array(I)(NOCEM_CHFIFO_VC_WR_ADDR_HIX downto NOCEM_CHFIFO_VC_WR_ADDR_LIX) <= (others => '0');
259
 
260
 
261
 
262
 
263
 
264
                        end if;
265
 
266
                end loop;
267
 
268
end process;
269
 
270
 
271
 
272
 
273
 
274
 
275
-- THIS IS WHERE THE DECISION IS MADE...
276
 
277
arb_gen : process (channel_cntrl_in_array_i,dest_local_port, dest_local_vc_ureg, ap_channel_cntrl_in, n_channel_cntrl_in, s_channel_cntrl_in, e_channel_cntrl_in, w_channel_cntrl_in, arb_decision_enum, zeroes_bv)
278
begin
279
 
280
 
281
        arb_grant_output_ureg <= (others => ARB_NODECISION);
282
        channel_cntrl_out_array_ureg <= (others => (others => '0'));
283
 
284
 
285
l3: for I in 4 downto 0 loop
286
 
287
        -- I iterates over the OUTPUT ports
288
        if channel_cntrl_in_array_i(I)(NOCEM_CHFIFO_VC_FULL_HIX downto NOCEM_CHFIFO_VC_FULL_LIX) /= VCS_ALL_FULL then
289
 
290
 
291
      -- determining if data can flow....
292
      -- incoming channel wants to travel to THIS (I) channel AND
293
      -- destination VC is not full 
294
      --        (done by AND'ing dest_local_vc, full_vector --> 0: dest_vc not full, /= 0, dest_vc is full)
295
 
296
                if dest_local_port(NOCEM_AP_IX) = arb_decision_enum(I) and
297
                        ((TO_BITVECTOR(dest_local_vc_ureg(NOCEM_AP_IX)) and TO_BITVECTOR(channel_cntrl_in_array_i(I)(NOCEM_CHFIFO_VC_FULL_HIX downto NOCEM_CHFIFO_VC_FULL_LIX))) = zeroes_bv) then
298
 
299
                        --arb grant will push data through switch
300
                        arb_grant_output_ureg(I) <= ARB_AP;
301
 
302
                        -- do read enable for selected incoming data
303
                        channel_cntrl_out_array_ureg(NOCEM_AP_IX)(NOCEM_CHFIFO_DATA_RE_IX) <= '1';
304
                        channel_cntrl_out_array_ureg(NOCEM_AP_IX)(NOCEM_CHFIFO_CNTRL_RE_IX) <= '1';
305
 
306
 
307
                        channel_cntrl_out_array_ureg(NOCEM_AP_IX)(NOCEM_CHFIFO_VC_RD_ADDR_HIX downto NOCEM_CHFIFO_VC_RD_ADDR_LIX)
308
                                                        <= channel_cntrl_in_array_i(NOCEM_AP_IX)(NOCEM_CHFIFO_VC_VCSRC_HIX downto NOCEM_CHFIFO_VC_VCSRC_LIX);
309
 
310
 
311
                        -- do write enable for outgoing port
312
                   channel_cntrl_out_array_ureg(I)(NOCEM_CHFIFO_DATA_WE_IX) <= '1';
313
                   channel_cntrl_out_array_ureg(I)(NOCEM_CHFIFO_CNTRL_WE_IX) <= '1';
314
 
315
         -- do correct WR mux on virtual channel
316
         channel_cntrl_out_array_ureg(I)(NOCEM_CHFIFO_VC_WR_ADDR_HIX downto NOCEM_CHFIFO_VC_WR_ADDR_LIX)
317
                     <= ap_channel_cntrl_in(NOCEM_CHFIFO_VC_VCDEST_HIX downto NOCEM_CHFIFO_VC_VCDEST_LIX);
318
 
319
                elsif dest_local_port(NOCEM_NORTH_IX) = arb_decision_enum(I) and
320
                        ((TO_BITVECTOR(dest_local_vc_ureg(NOCEM_NORTH_IX)) and TO_BITVECTOR(channel_cntrl_in_array_i(I)(NOCEM_CHFIFO_VC_FULL_HIX downto NOCEM_CHFIFO_VC_FULL_LIX))) = zeroes_bv) then
321
 
322
                        arb_grant_output_ureg(I) <= ARB_NORTH;
323
 
324
                        -- do read enable for selected incoming data
325
                        channel_cntrl_out_array_ureg(NOCEM_NORTH_IX)(NOCEM_CHFIFO_DATA_RE_IX) <= '1';
326
                        channel_cntrl_out_array_ureg(NOCEM_NORTH_IX)(NOCEM_CHFIFO_CNTRL_RE_IX) <= '1';
327
 
328
                        channel_cntrl_out_array_ureg(NOCEM_NORTH_IX)(NOCEM_CHFIFO_VC_RD_ADDR_HIX downto NOCEM_CHFIFO_VC_RD_ADDR_LIX)
329
                                                        <= channel_cntrl_in_array_i(NOCEM_NORTH_IX)(NOCEM_CHFIFO_VC_VCSRC_HIX downto NOCEM_CHFIFO_VC_VCSRC_LIX);
330
 
331
 
332
                        -- do write enable for outgoing port
333
                   channel_cntrl_out_array_ureg(I)(NOCEM_CHFIFO_DATA_WE_IX) <= '1';
334
                   channel_cntrl_out_array_ureg(I)(NOCEM_CHFIFO_CNTRL_WE_IX) <= '1';
335
 
336
         -- do correct WR mux on virtual channel
337
         channel_cntrl_out_array_ureg(I)(NOCEM_CHFIFO_VC_WR_ADDR_HIX downto NOCEM_CHFIFO_VC_WR_ADDR_LIX)
338
                     <= n_channel_cntrl_in(NOCEM_CHFIFO_VC_VCDEST_HIX downto NOCEM_CHFIFO_VC_VCDEST_LIX);
339
 
340
 
341
                elsif dest_local_port(NOCEM_SOUTH_IX) = arb_decision_enum(I) and
342
                        ((TO_BITVECTOR(dest_local_vc_ureg(NOCEM_SOUTH_IX)) and TO_BITVECTOR(channel_cntrl_in_array_i(I)(NOCEM_CHFIFO_VC_FULL_HIX downto NOCEM_CHFIFO_VC_FULL_LIX))) = zeroes_bv) then
343
 
344
                        arb_grant_output_ureg(I) <= ARB_SOUTH;
345
 
346
                        -- do read enable for selected incoming data
347
                        channel_cntrl_out_array_ureg(NOCEM_SOUTH_IX)(NOCEM_CHFIFO_DATA_RE_IX) <= '1';
348
                        channel_cntrl_out_array_ureg(NOCEM_SOUTH_IX)(NOCEM_CHFIFO_CNTRL_RE_IX) <= '1';
349
 
350
                        channel_cntrl_out_array_ureg(NOCEM_SOUTH_IX)(NOCEM_CHFIFO_VC_RD_ADDR_HIX downto NOCEM_CHFIFO_VC_RD_ADDR_LIX)
351
                                                        <= channel_cntrl_in_array_i(NOCEM_SOUTH_IX)(NOCEM_CHFIFO_VC_VCSRC_HIX downto NOCEM_CHFIFO_VC_VCSRC_LIX);
352
 
353
 
354
                        -- do write enable for outgoing port
355
                   channel_cntrl_out_array_ureg(I)(NOCEM_CHFIFO_DATA_WE_IX) <= '1';
356
                   channel_cntrl_out_array_ureg(I)(NOCEM_CHFIFO_CNTRL_WE_IX) <= '1';
357
 
358
         -- do correct WR mux on virtual channel
359
         channel_cntrl_out_array_ureg(I)(NOCEM_CHFIFO_VC_WR_ADDR_HIX downto NOCEM_CHFIFO_VC_WR_ADDR_LIX)
360
                     <= s_channel_cntrl_in(NOCEM_CHFIFO_VC_VCDEST_HIX downto NOCEM_CHFIFO_VC_VCDEST_LIX);
361
 
362
 
363
                elsif dest_local_port(NOCEM_EAST_IX) = arb_decision_enum(I) and
364
                        ((TO_BITVECTOR(dest_local_vc_ureg(NOCEM_EAST_IX)) and TO_BITVECTOR(channel_cntrl_in_array_i(I)(NOCEM_CHFIFO_VC_FULL_HIX downto NOCEM_CHFIFO_VC_FULL_LIX))) = zeroes_bv) then
365
 
366
                        arb_grant_output_ureg(I) <= ARB_EAST;
367
 
368
                        -- do read enable for selected incoming data
369
                        channel_cntrl_out_array_ureg(NOCEM_EAST_IX)(NOCEM_CHFIFO_DATA_RE_IX) <= '1';
370
                        channel_cntrl_out_array_ureg(NOCEM_EAST_IX)(NOCEM_CHFIFO_CNTRL_RE_IX) <= '1';
371
 
372
                        channel_cntrl_out_array_ureg(NOCEM_EAST_IX)(NOCEM_CHFIFO_VC_RD_ADDR_HIX downto NOCEM_CHFIFO_VC_RD_ADDR_LIX)
373
                                                        <= channel_cntrl_in_array_i(NOCEM_EAST_IX)(NOCEM_CHFIFO_VC_VCSRC_HIX downto NOCEM_CHFIFO_VC_VCSRC_LIX);
374
 
375
 
376
                        -- do write enable for outgoing port
377
                   channel_cntrl_out_array_ureg(I)(NOCEM_CHFIFO_DATA_WE_IX) <= '1';
378
                   channel_cntrl_out_array_ureg(I)(NOCEM_CHFIFO_CNTRL_WE_IX) <= '1';
379
 
380
         -- do correct WR mux on virtual channel
381
         channel_cntrl_out_array_ureg(I)(NOCEM_CHFIFO_VC_WR_ADDR_HIX downto NOCEM_CHFIFO_VC_WR_ADDR_LIX)
382
                     <= e_channel_cntrl_in(NOCEM_CHFIFO_VC_VCDEST_HIX downto NOCEM_CHFIFO_VC_VCDEST_LIX);
383
 
384
 
385
                elsif dest_local_port(NOCEM_WEST_IX) = arb_decision_enum(I) and
386
                        ((TO_BITVECTOR(dest_local_vc_ureg(NOCEM_WEST_IX)) and TO_BITVECTOR(channel_cntrl_in_array_i(I)(NOCEM_CHFIFO_VC_FULL_HIX downto NOCEM_CHFIFO_VC_FULL_LIX))) = zeroes_bv) then
387
 
388
                        arb_grant_output_ureg(I) <= ARB_WEST;
389
 
390
                        -- do read enable for selected incoming data
391
                        channel_cntrl_out_array_ureg(NOCEM_WEST_IX)(NOCEM_CHFIFO_DATA_RE_IX) <= '1';
392
                        channel_cntrl_out_array_ureg(NOCEM_WEST_IX)(NOCEM_CHFIFO_CNTRL_RE_IX) <= '1';
393
 
394
                        channel_cntrl_out_array_ureg(NOCEM_WEST_IX)(NOCEM_CHFIFO_VC_RD_ADDR_HIX downto NOCEM_CHFIFO_VC_RD_ADDR_LIX)
395
                                                        <= channel_cntrl_in_array_i(NOCEM_WEST_IX)(NOCEM_CHFIFO_VC_VCSRC_HIX downto NOCEM_CHFIFO_VC_VCSRC_LIX);
396
 
397
 
398
                        -- do write enable for outgoing port
399
                   channel_cntrl_out_array_ureg(I)(NOCEM_CHFIFO_DATA_WE_IX) <= '1';
400
                   channel_cntrl_out_array_ureg(I)(NOCEM_CHFIFO_CNTRL_WE_IX) <= '1';
401
 
402
         -- do correct WR mux on virtual channel
403
         channel_cntrl_out_array_ureg(I)(NOCEM_CHFIFO_VC_WR_ADDR_HIX downto NOCEM_CHFIFO_VC_WR_ADDR_LIX)
404
                     <= w_channel_cntrl_in(NOCEM_CHFIFO_VC_VCDEST_HIX downto NOCEM_CHFIFO_VC_VCDEST_LIX);
405
 
406
 
407
                end if;
408
        end if;
409
 
410
 
411
 
412
 
413
end loop;
414
 
415
 
416
 
417
end process;
418
 
419
 
420
 
421
 
422
end Behavioral;

powered by: WebSVN 2.1.0

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