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

Subversion Repositories nocem

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

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 4 schelleg
 
2
-----------------------------------------------------------------------------
3
-- NoCem -- Network on Chip Emulation Tool for System on Chip Research 
4
-- and Implementations
5
-- 
6
-- Copyright (C) 2006  Graham Schelle, Dirk Grunwald
7
-- 
8
-- This program is free software; you can redistribute it and/or
9
-- modify it under the terms of the GNU General Public License
10
-- as published by the Free Software Foundation; either version 2
11
-- of the License, or (at your option) any later version.
12
-- 
13
-- This program is distributed in the hope that it will be useful,
14
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
15
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
-- GNU General Public License for more details.
17
-- 
18
-- You should have received a copy of the GNU General Public License
19
-- along with this program; if not, write to the Free Software
20
-- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  
21
-- 02110-1301, USA.
22
-- 
23
-- The authors can be contacted by email: <schelleg,grunwald>@cs.colorado.edu 
24
-- 
25
-- or by mail: Campus Box 430, Department of Computer Science,
26
-- University of Colorado at Boulder, Boulder, Colorado 80309
27
-------------------------------------------------------------------------------- 
28
 
29
 
30
-- 
31 2 schelleg
-- Filename: vc_node_vc_allocator.vhd
32 4 schelleg
-- 
33 2 schelleg
-- Description: vc_node virtual channel allocator
34 4 schelleg
-- 
35
 
36
 
37 2 schelleg
--
38
--VC Allocator will do
39
--   1. manage vc allocation and deallocation for incoming packets looking for outgoing VC
40
--
41
--
42
library IEEE;
43
use IEEE.STD_LOGIC_1164.ALL;
44
use IEEE.STD_LOGIC_ARITH.ALL;
45
use IEEE.STD_LOGIC_UNSIGNED.ALL;
46
use work.pkg_nocem.all;
47
 
48
 
49
 
50
entity vc_node_vc_allocator is
51
    Port (
52
                local_ch_addr : in std_logic_vector(4 downto 0);
53
                outoing_vc_status : in std_logic_vector(NOCEM_NUM_VC-1 downto 0);
54
 
55
           n_channel_cntrl_in  : in channel_cntrl_word;
56
           n_channel_cntrl_out : out channel_cntrl_word;
57
 
58
           s_channel_cntrl_in  : in channel_cntrl_word;
59
           s_channel_cntrl_out : out channel_cntrl_word;
60
 
61
           e_channel_cntrl_in  : in channel_cntrl_word;
62
           e_channel_cntrl_out : out channel_cntrl_word;
63
 
64
           w_channel_cntrl_in  : in channel_cntrl_word;
65
           w_channel_cntrl_out : out channel_cntrl_word;
66
 
67
           ap_channel_cntrl_in  : in channel_cntrl_word;
68
           ap_channel_cntrl_out : out channel_cntrl_word;
69
 
70
           clk : in std_logic;
71
      rst : in std_logic
72
 
73
                );
74
end vc_node_vc_allocator;
75
 
76
architecture Behavioral of vc_node_vc_allocator is
77
 
78
   -- determining if there is a valid request on a per INCOMING channel basis
79
        signal vc_req_array  : std_logic_vector(4 downto 0);
80
 
81
        -- determine the next free outgoing VC
82
        signal next_free_vc  : std_logic_vector(NOCEM_NUM_VC-1 downto 0);
83
        signal vc_state : std_logic_Vector(NOCEM_NUM_VC-1 downto 0);   -- 0: free, 1: allocated --
84
        signal vc_allocate : std_logic;
85
        signal free_this_vc      : std_logic_vector(NOCEM_NUM_VC-1 downto 0);
86
        signal allocated_vc : std_logic_vector(NOCEM_NUM_VC-1 downto 0);
87
 
88
 
89
        -- DEBUG SIGNALS
90
        signal debug_allocated_vc : std_logic_vector(NOCEM_NUM_VC-1 downto 0);
91
 
92
        signal debug_alloc_counter : std_logic_vector(15 downto 0);
93
        signal debug_dealloc_counter : std_logic_vector(15 downto 0);
94
 
95
 
96
 
97
begin
98
 
99
        -- setting up incoming request signals
100
        vc_req_array(NOCEM_NORTH_IX) <= '1' when n_channel_cntrl_in(NOCEM_CHFIFO_VC_REQER_VCID_HIX downto NOCEM_CHFIFO_VC_REQER_VCID_LIX) /= 0 and n_channel_cntrl_in(NOCEM_CHFIFO_VC_REQER_DEST_CH_HIX downto NOCEM_CHFIFO_VC_REQER_DEST_CH_LIX) = local_ch_addr  else '0';
101
        vc_req_array(NOCEM_SOUTH_IX) <= '1' when s_channel_cntrl_in(NOCEM_CHFIFO_VC_REQER_VCID_HIX downto NOCEM_CHFIFO_VC_REQER_VCID_LIX) /= 0 and s_channel_cntrl_in(NOCEM_CHFIFO_VC_REQER_DEST_CH_HIX downto NOCEM_CHFIFO_VC_REQER_DEST_CH_LIX) = local_ch_addr  else '0';
102
        vc_req_array(NOCEM_WEST_IX) <= '1' when w_channel_cntrl_in(NOCEM_CHFIFO_VC_REQER_VCID_HIX downto NOCEM_CHFIFO_VC_REQER_VCID_LIX) /= 0 and w_channel_cntrl_in(NOCEM_CHFIFO_VC_REQER_DEST_CH_HIX downto NOCEM_CHFIFO_VC_REQER_DEST_CH_LIX) = local_ch_addr  else '0';
103
        vc_req_array(NOCEM_EAST_IX) <= '1' when e_channel_cntrl_in(NOCEM_CHFIFO_VC_REQER_VCID_HIX downto NOCEM_CHFIFO_VC_REQER_VCID_LIX) /= 0 and e_channel_cntrl_in(NOCEM_CHFIFO_VC_REQER_DEST_CH_HIX downto NOCEM_CHFIFO_VC_REQER_DEST_CH_LIX) = local_ch_addr  else '0';
104
        vc_req_array(NOCEM_AP_IX) <= '1' when ap_channel_cntrl_in(NOCEM_CHFIFO_VC_REQER_VCID_HIX downto NOCEM_CHFIFO_VC_REQER_VCID_LIX) /= 0 and ap_channel_cntrl_in(NOCEM_CHFIFO_VC_REQER_DEST_CH_HIX downto NOCEM_CHFIFO_VC_REQER_DEST_CH_LIX) = local_ch_addr  else '0';
105
 
106
        -- currently, vc status is '1' when eop is read out of VC
107
        free_this_vc  <= outoing_vc_status;
108
 
109
 
110
 
111
----------------------------------------------------------
112
----------------------------------------------------------
113
----------------------------------------------------------
114
----------------------------------------------------------
115
 
116
 
117
vc_state_gen_clkd : process (clk,rst)
118
begin
119
 
120
        if rst='1' then
121
                vc_state <= (others => '0');
122
        elsif clk'event and clk='1' then
123
 
124
                -- an interesting bit play that should work to keep vc_state happy....
125
                vc_state <= (allocated_vc or vc_state) xor free_this_vc;
126
 
127
        end if;
128
 
129
 
130
end process;
131
 
132
 
133
 
134
 
135
 
136
gen_vc_status_uclkd : process (vc_state)
137
begin
138
                next_free_vc <= (others => '0');
139
 
140
                l2: for I in NOCEM_NUM_VC-1 downto 0 loop
141
                        if vc_state(I) = '0' then
142
                                next_free_vc <= CONV_STD_LOGIC_VECTOR(2**I,NOCEM_NUM_VC);
143
                        end if;
144
 
145 4 schelleg
                end loop;
146 2 schelleg
 
147
end process;
148
 
149
 
150
 
151
 
152
gen_grant_clkd : process (clk,rst)
153
begin
154
 
155
        if rst='1' then
156
 
157
 
158
                n_channel_cntrl_out <= (others => '0');
159
                e_channel_cntrl_out <= (others => '0');
160
                s_channel_cntrl_out <= (others => '0');
161
                w_channel_cntrl_out <= (others => '0');
162
                ap_channel_cntrl_out <= (others => '0');
163
                vc_allocate <= '0';
164
 
165
                allocated_vc <= (others => '0');
166
 
167
 
168
        elsif clk'event and clk='1' then
169
 
170
                allocated_vc <= (others => '0');
171
 
172
 
173
                -- zero them out if nothing is happening
174
                n_channel_cntrl_out <= (others => '0');
175
                e_channel_cntrl_out <= (others => '0');
176
                s_channel_cntrl_out <= (others => '0');
177
                w_channel_cntrl_out <= (others => '0');
178
                ap_channel_cntrl_out <= (others => '0');
179
                vc_allocate <= '0';
180
 
181
                -- go through requests and satisfy one of them per cycle
182
                if vc_req_array(NOCEM_NORTH_IX) = '1' and vc_allocate = '0' then
183
                        n_channel_cntrl_out(NOCEM_CHFIFO_VC_ALLOC_FROMNODE_HIX downto NOCEM_CHFIFO_VC_ALLOC_FROMNODE_LIX) <= next_free_vc;
184
                        n_channel_cntrl_out(NOCEM_CHFIFO_VC_REQER_FROMNODE_HIX downto NOCEM_CHFIFO_VC_REQER_FROMNODE_LIX) <= n_channel_cntrl_in(NOCEM_CHFIFO_VC_REQER_VCID_HIX downto NOCEM_CHFIFO_VC_REQER_VCID_LIX);
185
                        if next_free_vc /= 0 then
186
                                vc_allocate <= '1';
187
                                allocated_vc <= next_free_vc;
188
                        end if;
189
                elsif   vc_req_array(NOCEM_SOUTH_IX) = '1' and vc_allocate = '0' then
190
                        s_channel_cntrl_out(NOCEM_CHFIFO_VC_ALLOC_FROMNODE_HIX downto NOCEM_CHFIFO_VC_ALLOC_FROMNODE_LIX) <= next_free_vc;
191
                        s_channel_cntrl_out(NOCEM_CHFIFO_VC_REQER_FROMNODE_HIX downto NOCEM_CHFIFO_VC_REQER_FROMNODE_LIX) <= s_channel_cntrl_in(NOCEM_CHFIFO_VC_REQER_VCID_HIX downto NOCEM_CHFIFO_VC_REQER_VCID_LIX);
192
                        if next_free_vc /= 0 then
193
                                vc_allocate <= '1';
194
                                allocated_vc <= next_free_vc;
195
                        end if;
196
                elsif   vc_req_array(NOCEM_EAST_IX) = '1' and vc_allocate = '0' then
197
                        e_channel_cntrl_out(NOCEM_CHFIFO_VC_ALLOC_FROMNODE_HIX downto NOCEM_CHFIFO_VC_ALLOC_FROMNODE_LIX) <= next_free_vc;
198
                        e_channel_cntrl_out(NOCEM_CHFIFO_VC_REQER_FROMNODE_HIX downto NOCEM_CHFIFO_VC_REQER_FROMNODE_LIX) <= e_channel_cntrl_in(NOCEM_CHFIFO_VC_REQER_VCID_HIX downto NOCEM_CHFIFO_VC_REQER_VCID_LIX);
199
                        if next_free_vc /= 0 then
200
                                vc_allocate <= '1';
201
                                allocated_vc <= next_free_vc;
202
                        end if;
203
                elsif   vc_req_array(NOCEM_WEST_IX) = '1' and vc_allocate = '0' then
204
                        w_channel_cntrl_out(NOCEM_CHFIFO_VC_ALLOC_FROMNODE_HIX downto NOCEM_CHFIFO_VC_ALLOC_FROMNODE_LIX) <= next_free_vc;
205
                        w_channel_cntrl_out(NOCEM_CHFIFO_VC_REQER_FROMNODE_HIX downto NOCEM_CHFIFO_VC_REQER_FROMNODE_LIX) <= w_channel_cntrl_in(NOCEM_CHFIFO_VC_REQER_VCID_HIX downto NOCEM_CHFIFO_VC_REQER_VCID_LIX);
206
                        if next_free_vc /= 0 then
207
                                vc_allocate <= '1';
208
                                allocated_vc <= next_free_vc;
209
                        end if;
210
                elsif   vc_req_array(NOCEM_AP_IX) = '1' and vc_allocate = '0' then
211
                        ap_channel_cntrl_out(NOCEM_CHFIFO_VC_ALLOC_FROMNODE_HIX downto NOCEM_CHFIFO_VC_ALLOC_FROMNODE_LIX) <= next_free_vc;
212
                        ap_channel_cntrl_out(NOCEM_CHFIFO_VC_REQER_FROMNODE_HIX downto NOCEM_CHFIFO_VC_REQER_FROMNODE_LIX) <= ap_channel_cntrl_in(NOCEM_CHFIFO_VC_REQER_VCID_HIX downto NOCEM_CHFIFO_VC_REQER_VCID_LIX);
213
                        if next_free_vc /= 0 then
214
                                vc_allocate <= '1';
215
                                allocated_vc <= next_free_vc;
216
                        end if;
217
                else
218
                        null;
219
                end if;
220
        end if;
221
 
222
 
223
 
224
end process;
225
 
226
 
227
 
228
 
229
 
230
 
231
 
232
----------------------------------------------------------
233
----------------------------------------------------------
234
----------------------------------------------------------
235
----------------------------------------------------------
236
--
237
--gen_vc_status_clkd : process (clk,rst)
238
--begin
239
--
240
--      if rst='1' then
241
--              --next_free_vc <= ('1',others => '0');  
242
--              vc_state <= (others => '0');
243
--              
244
--      elsif clk'event and clk='1' then
245
--
246
--      
247
--
248
--
249
--
250
----            if vc_state = "11" then
251
----                    next_free_vc <= (others => '0');
252
----            end if;
253
--
254
--
255
--               l1: for I in NOCEM_NUM_VC-1 downto 0 loop
256
--                      if vc_state(I) = '0' and next_free_vc(I) = '1' and vc_allocate = '1' then -- free going to allocated
257
--                              vc_state(I) <= '1';
258
--                      elsif vc_state(I) = '1' and free_this_vc(I) = '1' then -- allocated going to free
259
--                              vc_state(I) <= '0';
260
--                      end if;          
261
--               end loop;
262
--
263
--      end if;
264
--end process;
265
--
266
----gen_vc_status_cclkd : process (clk,rst)
267
----begin
268
----
269
----    if rst='1' then
270
----            next_free_vc <= (others => '0');
271
----    elsif clk'event and clk='1' then
272
----            l2: for I in NOCEM_NUM_VC-1 downto 0 loop
273
----                    if vc_state(I) = '0' then
274
----                            next_free_vc <= CONV_STD_LOGIC_VECTOR(2**I,NOCEM_NUM_VC);
275
----                    end if;                                                                                         
276
----
277
----            end loop;
278
----    end if;
279
----
280
----end process;
281
--
282
--
283
--gen_vc_status_uclkd : process (vc_state)
284
--begin
285
--              next_free_vc <= (others => '0');
286
--
287
--              l2: for I in NOCEM_NUM_VC-1 downto 0 loop
288
--                      if vc_state(I) = '0' then
289
--                              next_free_vc <= CONV_STD_LOGIC_VECTOR(2**I,NOCEM_NUM_VC);
290
--                      end if;                                                                                         
291
--
292
--              end loop;
293
--end process;
294
--
295
--
296
--
297
--
298
--
299
--
300
--
301
--gen_grant_clkd : process (clk,rst)
302
--begin
303
--
304
--      if rst='1' then
305
--      
306
--              
307
--              n_channel_cntrl_out <= (others => '0');
308
--              e_channel_cntrl_out <= (others => '0');
309
--              s_channel_cntrl_out <= (others => '0');
310
--              w_channel_cntrl_out <= (others => '0');
311
--              ap_channel_cntrl_out <= (others => '0');
312
--              vc_allocate <= '0';
313
--
314
--      debug_allocated_vc <= (others => '0');
315
--
316
--
317
--      elsif clk'event and clk='1' then
318
--      
319
--              debug_allocated_vc <= (others => '0');
320
--              
321
--              
322
--              -- zero them out if nothing is happening
323
--              n_channel_cntrl_out <= (others => '0');
324
--              e_channel_cntrl_out <= (others => '0');
325
--              s_channel_cntrl_out <= (others => '0');
326
--              w_channel_cntrl_out <= (others => '0');
327
--              ap_channel_cntrl_out <= (others => '0');
328
--              vc_allocate <= '0';
329
--
330
--              -- go through requests and satisfy one of them per cycle
331
--              if vc_req_array(NOCEM_NORTH_IX) = '1' and vc_allocate = '0' then
332
--                      n_channel_cntrl_out(NOCEM_CHFIFO_VC_ALLOC_FROMNODE_HIX downto NOCEM_CHFIFO_VC_ALLOC_FROMNODE_LIX) <= next_free_vc;
333
--                      n_channel_cntrl_out(NOCEM_CHFIFO_VC_REQER_FROMNODE_HIX downto NOCEM_CHFIFO_VC_REQER_FROMNODE_LIX) <= n_channel_cntrl_in(NOCEM_CHFIFO_VC_REQER_VCID_HIX downto NOCEM_CHFIFO_VC_REQER_VCID_LIX);
334
--                      if next_free_vc /= 0 then
335
--                              vc_allocate <= '1';
336
--                              debug_allocated_vc <= next_free_vc;
337
--                      end if;
338
--              elsif   vc_req_array(NOCEM_SOUTH_IX) = '1' and vc_allocate = '0' then
339
--                      s_channel_cntrl_out(NOCEM_CHFIFO_VC_ALLOC_FROMNODE_HIX downto NOCEM_CHFIFO_VC_ALLOC_FROMNODE_LIX) <= next_free_vc;
340
--                      s_channel_cntrl_out(NOCEM_CHFIFO_VC_REQER_FROMNODE_HIX downto NOCEM_CHFIFO_VC_REQER_FROMNODE_LIX) <= s_channel_cntrl_in(NOCEM_CHFIFO_VC_REQER_VCID_HIX downto NOCEM_CHFIFO_VC_REQER_VCID_LIX);
341
--                      if next_free_vc /= 0 then
342
--                              vc_allocate <= '1';
343
--                              debug_allocated_vc <= next_free_vc;
344
--                      end if;
345
--              elsif   vc_req_array(NOCEM_EAST_IX) = '1' and vc_allocate = '0' then
346
--                      e_channel_cntrl_out(NOCEM_CHFIFO_VC_ALLOC_FROMNODE_HIX downto NOCEM_CHFIFO_VC_ALLOC_FROMNODE_LIX) <= next_free_vc;
347
--                      e_channel_cntrl_out(NOCEM_CHFIFO_VC_REQER_FROMNODE_HIX downto NOCEM_CHFIFO_VC_REQER_FROMNODE_LIX) <= e_channel_cntrl_in(NOCEM_CHFIFO_VC_REQER_VCID_HIX downto NOCEM_CHFIFO_VC_REQER_VCID_LIX);
348
--                      if next_free_vc /= 0 then
349
--                              vc_allocate <= '1';
350
--                              debug_allocated_vc <= next_free_vc;
351
--                      end if;
352
--              elsif   vc_req_array(NOCEM_WEST_IX) = '1' and vc_allocate = '0' then
353
--                      w_channel_cntrl_out(NOCEM_CHFIFO_VC_ALLOC_FROMNODE_HIX downto NOCEM_CHFIFO_VC_ALLOC_FROMNODE_LIX) <= next_free_vc;
354
--                      w_channel_cntrl_out(NOCEM_CHFIFO_VC_REQER_FROMNODE_HIX downto NOCEM_CHFIFO_VC_REQER_FROMNODE_LIX) <= w_channel_cntrl_in(NOCEM_CHFIFO_VC_REQER_VCID_HIX downto NOCEM_CHFIFO_VC_REQER_VCID_LIX);
355
--                      if next_free_vc /= 0 then
356
--                              vc_allocate <= '1';
357
--                              debug_allocated_vc <= next_free_vc;
358
--                      end if;
359
--              elsif   vc_req_array(NOCEM_AP_IX) = '1' and vc_allocate = '0' then
360
--                      ap_channel_cntrl_out(NOCEM_CHFIFO_VC_ALLOC_FROMNODE_HIX downto NOCEM_CHFIFO_VC_ALLOC_FROMNODE_LIX) <= next_free_vc;
361
--                      ap_channel_cntrl_out(NOCEM_CHFIFO_VC_REQER_FROMNODE_HIX downto NOCEM_CHFIFO_VC_REQER_FROMNODE_LIX) <= ap_channel_cntrl_in(NOCEM_CHFIFO_VC_REQER_VCID_HIX downto NOCEM_CHFIFO_VC_REQER_VCID_LIX);
362
--                      if next_free_vc /= 0 then
363
--                              vc_allocate <= '1';
364
--                              debug_allocated_vc <= next_free_vc;
365
--                      end if;
366
--              else
367
--                      null;
368
--              end if;
369
--      end if;
370
--
371
--
372
--
373
--end process;
374
--
375
 
376
 
377
 
378
--      signal debug_alloc_counter : std_logic_vector(15 downto 0);
379
--      signal debug_dealloc_counter : std_logic_vector(15 downto 0);
380
debug_proc : process (clk,rst)
381
begin
382
 
383
        if rst='1' then
384
                debug_alloc_counter   <= (others => '0');
385
                debug_dealloc_counter <= (others => '0');
386
        elsif clk'event and clk='1' then
387
                if vc_allocate = '1' then
388
                        debug_alloc_counter   <= debug_alloc_counter+1;
389
                end if;
390
 
391
                if free_this_vc /= 0 then
392
                        debug_dealloc_counter <= debug_dealloc_counter+1;
393
                end if;
394
 
395
 
396
        end if;
397
 
398
end process;
399
 
400
 
401
 
402
 
403
 
404
end Behavioral;

powered by: WebSVN 2.1.0

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