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

Subversion Repositories funbase_ip_library

[/] [funbase_ip_library/] [trunk/] [TUT/] [ip.hwp.communication/] [hibi/] [3.0/] [tb/] [sad_tb/] [hibiv3_r3.vhd] - Blame information for rev 145

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 145 lanttu
-------------------------------------------------------------------------------
2
-- Title      : Hibi toplevel using r3 wrappers
3
-- Project    : 
4
-------------------------------------------------------------------------------
5
-- File       : hibiv3_r3.vhd
6
-- Author     : Lasse Lehtonen, modified from Jussi Nieminen's HWTG hibi
7
--              top level
8
-- Company    : 
9
-- Last update: 2010-11-25
10
-- Platform   : 
11
-------------------------------------------------------------------------------
12
-- Description: Semi-generic toplevel, add as many agents as you like.  Just
13
--              be sure to create enough addresses in the tables (scroll down).
14
--              Every segment has equal number of wrappers and are connected
15
--              as a chain.
16
-------------------------------------------------------------------------------
17
-- Revisions  :
18
-- Date        Version  Author  Description
19
-- 2009/06/23  1.0      niemin95        Created
20
-------------------------------------------------------------------------------
21
 
22
library ieee;
23
use ieee.std_logic_1164.all;
24
use work.hibiv3_pkg.all;
25
 
26
 
27
entity hibiv3_r3 is
28
 
29
  generic (
30
    -- HIBI generics
31
    id_width_g          : integer := 4;
32
    addr_width_g        : integer := 16;
33
    data_width_g        : integer := 32;
34
    comm_width_g        : integer := 5;
35
    counter_width_g     : integer := 8;
36
    rel_agent_freq_g    : integer := 1;
37
    rel_bus_freq_g      : integer := 1;
38
    arb_type_g          : integer := 3;
39
    fifo_sel_g          : integer := 0;
40
    rx_fifo_depth_g     : integer := 4;
41
    rx_msg_fifo_depth_g : integer := 4;
42
    tx_fifo_depth_g     : integer := 4;
43
    tx_msg_fifo_depth_g : integer := 4;
44
    max_send_g          : integer := 20;
45
    n_cfg_pages_g       : integer := 1;
46
    n_time_slots_g      : integer := 0;
47
    keep_slot_g         : integer := 0;
48
    n_extra_params_g    : integer := 1;
49
 
50
    cfg_re_g            : integer := 1;
51
    cfg_we_g            : integer := 1;
52
    debug_width_g       : integer := 0;
53
 
54
    n_agents_g   : integer := 12;
55
    n_segments_g : integer := 3;
56
 
57
    separate_addr_g : integer := 0
58
    );
59
 
60
  port (
61
    clk_ip  : in std_logic;
62
    clk_noc : in std_logic;
63
    rst_n   : in std_logic;
64
 
65
    agent_comm_in   : in  std_logic_vector(n_agents_g*comm_width_g-1 downto 0);
66
    agent_data_in   : in  std_logic_vector(n_agents_g*data_width_g-1 downto 0);
67
    agent_addr_in   : in  std_logic_vector(n_agents_g*addr_width_g-1 downto 0);
68
    agent_we_in     : in  std_logic_vector(n_agents_g-1 downto 0);
69
    agent_re_in     : in  std_logic_vector(n_agents_g-1 downto 0);
70
    agent_comm_out  : out std_logic_vector(n_agents_g*comm_width_g-1 downto 0);
71
    agent_data_out  : out std_logic_vector(n_agents_g*data_width_g-1 downto 0);
72
    agent_addr_out  : out std_logic_vector(n_agents_g*addr_width_g-1 downto 0);
73
    agent_full_out  : out std_logic_vector(n_agents_g-1 downto 0);
74
    agent_one_p_out : out std_logic_vector(n_agents_g-1 downto 0);
75
    agent_empty_out : out std_logic_vector(n_agents_g-1 downto 0);
76
    agent_one_d_out : out std_logic_vector(n_agents_g-1 downto 0);
77
 
78
    agent_msg_comm_in   : in  std_logic_vector(n_agents_g*comm_width_g-1 downto 0);
79
    agent_msg_data_in   : in  std_logic_vector(n_agents_g*data_width_g-1 downto 0);
80
    agent_msg_addr_in   : in  std_logic_vector(n_agents_g*addr_width_g-1 downto 0);
81
    agent_msg_we_in     : in  std_logic_vector(n_agents_g-1 downto 0);
82
    agent_msg_re_in     : in  std_logic_vector(n_agents_g-1 downto 0);
83
    agent_msg_comm_out  : out std_logic_vector(n_agents_g*comm_width_g-1 downto 0);
84
    agent_msg_data_out  : out std_logic_vector(n_agents_g*data_width_g-1 downto 0);
85
    agent_msg_addr_out  : out std_logic_vector(n_agents_g*addr_width_g-1 downto 0);
86
    agent_msg_full_out  : out std_logic_vector(n_agents_g-1 downto 0);
87
    agent_msg_one_p_out : out std_logic_vector(n_agents_g-1 downto 0);
88
    agent_msg_empty_out : out std_logic_vector(n_agents_g-1 downto 0);
89
    agent_msg_one_d_out : out std_logic_vector(n_agents_g-1 downto 0)
90
 
91
    );
92
 
93
end hibiv3_r3;
94
 
95
 
96
 
97
architecture structural of hibiv3_r3 is
98
 
99
  -----------------------------------------------------------------------------
100
  -- HIBI ADDRESSES
101
  -----------------------------------------------------------------------------
102
 
103
  type gen_addr_array_type is array (1 to 4) of integer;
104
  type gen_addr_array_3d_type is array (0 to 2) of gen_addr_array_type;
105
  type gen_bridge_addr_array is array (0 to 1) of integer;
106
 
107
  -- addresses_c(segment index)(wrapper index in the segment)
108
  constant addresses_c : gen_addr_array_3d_type :=
109
    ((16#00000010#, 16#00000030#, 16#00000050#, 16#00000070#),
110
     (16#00000110#, 16#00000130#, 16#00000150#, 16#00000170#),
111
     (16#00000310#, 16#00000330#, 16#00000350#, 16#00000370#));
112
 
113
  constant bridge_a_addr_base_c : gen_bridge_addr_array :=
114
    (16#00000000#, 16#00000000#);
115
  constant bridge_a_addr_limit_c : gen_bridge_addr_array :=
116
    (16#000000FF#, 16#000001FF#);
117
  constant bridge_b_addr_base_c : gen_bridge_addr_array :=
118
    (16#00000000#, 16#00000000#);
119
  constant bridge_b_addr_limit_c : gen_bridge_addr_array :=
120
    (16#000000FF#, 16#000001FF#);
121
 
122
  constant bridge_a_id_min_c : gen_bridge_addr_array :=
123
    (1, 1);
124
  constant bridge_a_id_max_c : gen_bridge_addr_array :=
125
    (5, 11);
126
  constant bridge_b_id_min_c : gen_bridge_addr_array :=
127
    (1, 1);
128
  constant bridge_b_id_max_c : gen_bridge_addr_array :=
129
    (5, 11);
130
 
131
  constant bridge_a_inv_addr_c : gen_bridge_addr_array :=
132
    (1, 1);
133
  constant bridge_b_inv_addr_c : gen_bridge_addr_array :=
134
    (0, 0);
135
 
136
 
137
 
138
 
139
 
140
 
141
 
142
  -----------------------------------------------------------------------------
143
  -- 
144
  -----------------------------------------------------------------------------
145
 
146
  -- purpose: to resolve the number of agents in each segment
147
  function n_agents_in_segment (
148
    constant segment, n_segments, wrappers_per_seg : integer)
149
    return integer is
150
  begin  -- n_agents_in_segment
151
 
152
    if n_segments = 1 then
153
      return wrappers_per_seg;
154
    elsif segment = 0 or segment = n_segments - 1 then
155
      -- end segment, only one bridge
156
      return wrappers_per_seg + 1;
157
    else
158
      -- middle segment
159
      return wrappers_per_seg + 2;
160
    end if;
161
 
162
  end n_agents_in_segment;
163
 
164
  function priority_a (
165
    constant segment, n_segments, wrappers_per_seg : integer)
166
    return integer is
167
  begin
168
 
169
    if n_segments = 1 then
170
      return 0;
171
    elsif segment = 0 or segment = n_segments - 1 then
172
      -- end segment, only one bridge
173
      return wrappers_per_seg + 1;
174
    else
175
      -- middle segment
176
      return wrappers_per_seg + 2;
177
    end if;
178
 
179
  end priority_a;
180
 
181
  function priority_b (
182
    constant segment, n_segments, wrappers_per_seg : integer)
183
    return integer is
184
  begin
185
 
186
    if n_segments = 1 then
187
      return 0;
188
    elsif segment = 0 or segment = n_segments - 1 then
189
      -- end segment, only one bridge
190
      return wrappers_per_seg + 1;
191
    else
192
      -- middle segment
193
      return wrappers_per_seg + 1;
194
    end if;
195
 
196
  end priority_b;
197
 
198
  function id_agent (
199
    constant segment, n_segments, wrappers_per_seg : integer)
200
    return integer is
201
  begin
202
 
203
    if n_segments = 1 then
204
      return 1;
205
    elsif segment = 0 then
206
      -- first segment
207
      return 1;
208
    elsif segment = n_segments - 1 then
209
      -- last segment
210
      return segment*(wrappers_per_seg+2);
211
    else
212
      -- middle segment
213
      return segment*(wrappers_per_seg+2);
214
    end if;
215
 
216
  end id_agent;
217
 
218
  function id_a (
219
    constant segment, n_segments, wrappers_per_seg : integer)
220
    return integer is
221
  begin
222
 
223
    if n_segments = 1 then
224
      return 0;
225
    elsif segment = 0 then
226
      -- first segment
227
      return wrappers_per_seg + 1;
228
    elsif segment = n_segments - 1 then
229
      -- last segment
230
      return 0;
231
    else
232
      -- middle segment
233
      return segment*(wrappers_per_seg+2)+wrappers_per_seg;
234
    end if;
235
 
236
  end id_a;
237
 
238
  function id_b (
239
    constant segment, n_segments, wrappers_per_seg : integer)
240
    return integer is
241
  begin
242
 
243
    if n_segments = 1 then
244
      return 0;
245
    elsif segment = 0 then
246
      -- first segment
247
      return 0;
248
    elsif segment = n_segments - 1 then
249
      return segment*(wrappers_per_seg+2)+wrappers_per_seg;
250
    else
251
      -- middle segment
252
      return segment*(wrappers_per_seg+2)+wrappers_per_seg+1;
253
    end if;
254
 
255
  end id_b;
256
 
257
 
258
  constant wrappers_per_segment_c : integer := n_agents_g / n_segments_g;
259
 
260
  type bus_data_segments_array is array (0 to n_segments_g-1) of
261
    std_logic_vector(data_width_g+separate_addr_g*addr_width_g-1 downto 0);
262
  type bus_comm_segments_array is array (0 to n_segments_g-1) of
263
    std_logic_vector(comm_width_c-1 downto 0);
264
 
265
  signal bus_wra_data : bus_data_segments_array;
266
  signal bus_wra_comm : bus_comm_segments_array;
267
  signal bus_wra_av   : std_logic_vector(n_segments_g-1 downto 0);
268
  signal bus_wra_full : std_logic_vector(n_segments_g-1 downto 0);
269
  signal bus_wra_lock : std_logic_vector(n_segments_g-1 downto 0);
270
 
271
  -- +1, because there might be bridges in the segment. This is not optimal,
272
  -- but much easier and extra signals should be optimized away in synthesis
273
  type data_to_bus_type is array (0 to wrappers_per_segment_c+1) of
274
    std_logic_vector(data_width_g+separate_addr_g*addr_width_g-1 downto 0);
275
  type comm_to_bus_type is array (0 to wrappers_per_segment_c+1) of
276
    std_logic_vector(comm_width_c-1 downto 0);
277
 
278
  type data_segments_array is array (0 to n_segments_g-1) of data_to_bus_type;
279
  type comm_segments_array is array (0 to n_segments_g-1) of comm_to_bus_type;
280
  type cntr_segments_array is array (0 to n_segments_g-1) of std_logic_vector
281
    (wrappers_per_segment_c + 1 downto 0);
282
 
283
  signal wra_bus_data : data_segments_array;
284
  signal wra_bus_comm : comm_segments_array;
285
  signal wra_bus_av   : cntr_segments_array;
286
  signal wra_bus_full : cntr_segments_array;
287
  signal wra_bus_lock : cntr_segments_array;
288
 
289
-------------------------------------------------------------------------------
290
begin  -- structural
291
-------------------------------------------------------------------------------
292
 
293
  -- if there is more than 1 segment, wrappers must distribute evenly
294
  assert n_segments_g = 1 or n_agents_g mod n_segments_g = 0
295
    report "With more than one segment wrappers distribute evenly"
296
    severity failure;
297
 
298
 
299
  segments : for seg in 0 to n_segments_g-1 generate
300
 
301
    wrappers : for wra in 0 to wrappers_per_segment_c-1 generate
302
 
303
      wrapper : entity work.hibi_wrapper_r3
304
        generic map (
305
          id_g                => id_agent
306
          (seg, n_segments_g, wrappers_per_segment_c) + wra,
307
          addr_g              => addresses_c(seg)(wra + 1),
308
          inv_addr_en_g       => 0,
309
          id_width_g          => id_width_g,
310
          addr_width_g        => addr_width_g,
311
          data_width_g        => data_width_g,
312
          separate_addr_g     => separate_addr_g,
313
          comm_width_g        => comm_width_g,
314
          counter_width_g     => counter_width_g,
315
          rel_agent_freq_g    => rel_agent_freq_g,
316
          rel_bus_freq_g      => rel_bus_freq_g,
317
          arb_type_g          => arb_type_g,
318
          fifo_sel_g          => fifo_sel_g,
319
          rx_fifo_depth_g     => rx_fifo_depth_g,
320
          rx_msg_fifo_depth_g => rx_msg_fifo_depth_g,
321
          tx_fifo_depth_g     => tx_fifo_depth_g,
322
          tx_msg_fifo_depth_g => tx_msg_fifo_depth_g,
323
          prior_g             => wra + 1,
324
          max_send_g          => max_send_g,
325
          -- n_agents_g should be num of ips + num of bridges in the segment
326
          n_agents_g          => n_agents_in_segment
327
          (seg, n_segments_g, wrappers_per_segment_c),
328
          n_cfg_pages_g       => n_cfg_pages_g,
329
          n_time_slots_g      => n_time_slots_g,
330
          keep_slot_g         => keep_slot_g,
331
          n_extra_params_g    => n_extra_params_g,
332
 
333
          cfg_re_g            => cfg_re_g,
334
          cfg_we_g            => cfg_we_g,
335
          debug_width_g       => debug_width_g
336
          )
337
        port map (
338
          bus_clk         => clk_noc,
339
          agent_clk       => clk_ip,
340
          bus_sync_clk    => clk_noc,
341
          agent_sync_clk  => clk_ip,
342
          rst_n           => rst_n,
343
          bus_comm_in     => bus_wra_comm(seg),
344
          bus_data_in     => bus_wra_data(seg),
345
          bus_full_in     => bus_wra_full(seg),
346
          bus_lock_in     => bus_wra_lock(seg),
347
          bus_av_in       => bus_wra_av(seg),
348
          agent_comm_in   => agent_comm_in((seg*wrappers_per_segment_c+wra+1)*
349
                                           comm_width_g-1 downto
350
                                           (seg*wrappers_per_segment_c+wra)*
351
                                           comm_width_g),
352
          agent_data_in   => agent_data_in((seg*wrappers_per_segment_c+wra+1)*
353
                                           data_width_g-1 downto
354
                                           (seg*wrappers_per_segment_c+wra)*
355
                                           data_width_g),
356
          agent_addr_in   => agent_addr_in((seg*wrappers_per_segment_c+wra+1)*
357
                                           addr_width_g-1 downto
358
                                           (seg*wrappers_per_segment_c+wra)*
359
                                           addr_width_g),
360
          agent_we_in     => agent_we_in(seg*wrappers_per_segment_c+wra),
361
          agent_re_in     => agent_re_in(seg*wrappers_per_segment_c+wra),
362
          agent_msg_comm_in   => agent_msg_comm_in((seg*wrappers_per_segment_c+wra+1)*
363
                                           comm_width_g-1 downto
364
                                           (seg*wrappers_per_segment_c+wra)*
365
                                           comm_width_g),
366
          agent_msg_data_in   => agent_msg_data_in((seg*wrappers_per_segment_c+wra+1)*
367
                                           data_width_g-1 downto
368
                                           (seg*wrappers_per_segment_c+wra)*
369
                                           data_width_g),
370
          agent_msg_addr_in   => agent_msg_addr_in((seg*wrappers_per_segment_c+wra+1)*
371
                                           addr_width_g-1 downto
372
                                           (seg*wrappers_per_segment_c+wra)*
373
                                           addr_width_g),
374
          agent_msg_we_in     => agent_msg_we_in(seg*wrappers_per_segment_c+wra),
375
          agent_msg_re_in     => agent_msg_re_in(seg*wrappers_per_segment_c+wra),
376
          bus_comm_out    => wra_bus_comm(seg)(wra),
377
          bus_data_out    => wra_bus_data(seg)(wra),
378
          bus_full_out    => wra_bus_full(seg)(wra),
379
          bus_lock_out    => wra_bus_lock(seg)(wra),
380
          bus_av_out      => wra_bus_av(seg)(wra),
381
          agent_comm_out  => agent_comm_out((seg*wrappers_per_segment_c+wra+1)*
382
                                            comm_width_g-1 downto
383
                                            (seg*wrappers_per_segment_c+wra)*
384
                                            comm_width_g),
385
          agent_data_out  => agent_data_out((seg*wrappers_per_segment_c+wra+1)*
386
                                            data_width_g-1 downto
387
                                            (seg*wrappers_per_segment_c+wra)*
388
                                            data_width_g),
389
          agent_addr_out  => agent_addr_out((seg*wrappers_per_segment_c+wra+1)*
390
                                            addr_width_g-1 downto
391
                                            (seg*wrappers_per_segment_c+wra)*
392
                                            addr_width_g),
393
          agent_full_out  => agent_full_out(seg*wrappers_per_segment_c+wra),
394
          agent_one_p_out => agent_one_p_out(seg*wrappers_per_segment_c+wra),
395
          agent_empty_out => agent_empty_out(seg*wrappers_per_segment_c+wra),
396
          agent_one_d_out => agent_one_d_out(seg*wrappers_per_segment_c+wra),
397
          agent_msg_comm_out  => agent_msg_comm_out((seg*wrappers_per_segment_c+wra+1)*
398
                                            comm_width_g-1 downto
399
                                            (seg*wrappers_per_segment_c+wra)*
400
                                            comm_width_g),
401
          agent_msg_data_out  => agent_msg_data_out((seg*wrappers_per_segment_c+wra+1)*
402
                                            data_width_g-1 downto
403
                                            (seg*wrappers_per_segment_c+wra)*
404
                                            data_width_g),
405
          agent_msg_addr_out  => agent_msg_addr_out((seg*wrappers_per_segment_c+wra+1)*
406
                                            addr_width_g-1 downto
407
                                            (seg*wrappers_per_segment_c+wra)*
408
                                            addr_width_g),
409
          agent_msg_full_out  => agent_msg_full_out(seg*wrappers_per_segment_c+wra),
410
          agent_msg_one_p_out => agent_msg_one_p_out(seg*wrappers_per_segment_c+wra),
411
          agent_msg_empty_out => agent_msg_empty_out(seg*wrappers_per_segment_c+wra),
412
          agent_msg_one_d_out => agent_msg_one_d_out(seg*wrappers_per_segment_c+wra)
413
          -- synthesis translate_off
414
          ,
415
          debug_out       => open,
416
          debug_in        => (others => '0')
417
          -- synthesis translate_on
418
          );
419
 
420
 
421
    end generate wrappers;
422
 
423
 
424
    bridge_needed : if seg > 0 generate
425
 
426
      i_bridge : entity work.hibi_bridge
427
        generic map (
428
          a_id_g                =>
429
          id_a(seg-1, n_segments_g, wrappers_per_segment_c),
430
          a_addr_g              => bridge_a_addr_base_c(seg-1),
431
          a_inv_addr_en_g       => bridge_a_inv_addr_c(seg-1),
432
          a_id_width_g          => id_width_g,
433
          a_addr_width_g        => addr_width_g,
434
          a_data_width_g        => data_width_g+separate_addr_g*addr_width_g,
435
          a_separate_addr_g     => separate_addr_g,
436
          a_comm_width_g        => comm_width_g,
437
          a_counter_width_g     => counter_width_g,
438
          a_rx_fifo_depth_g     => rx_fifo_depth_g,
439
          a_tx_fifo_depth_g     => tx_fifo_depth_g,
440
          a_rx_msg_fifo_depth_g => rx_msg_fifo_depth_g,
441
          a_tx_msg_fifo_depth_g => tx_msg_fifo_depth_g,
442
          a_arb_type_g          => arb_type_g,
443
          a_fifo_sel_g          => fifo_sel_g,
444
 
445
          a_debug_width_g       => debug_width_g,
446
          a_prior_g             =>
447
          priority_a(seg-1, n_segments_g, wrappers_per_segment_c),
448
          a_max_send_g          => max_send_g,
449
          a_n_agents_g          =>
450
          n_agents_in_segment(seg-1, n_segments_g, wrappers_per_segment_c),
451
          a_n_cfg_pages_g       => n_cfg_pages_g,
452
          a_n_time_slots_g      => n_time_slots_g,
453
          a_n_extra_params_g    => n_extra_params_g,
454
          a_cfg_re_g            => cfg_re_g,
455
          a_cfg_we_g            => cfg_we_g,
456
 
457
          b_id_g                =>
458
          id_b(seg, n_segments_g, wrappers_per_segment_c),
459
          b_addr_g              => bridge_b_addr_base_c(seg-1),
460
          b_inv_addr_en_g       => bridge_b_inv_addr_c(seg-1),
461
          b_id_width_g          => id_width_g,
462
          b_addr_width_g        => addr_width_g,
463
          b_data_width_g        => data_width_g+separate_addr_g*addr_width_g,
464
          b_separate_addr_g     => separate_addr_g,
465
          b_comm_width_g        => comm_width_g,
466
          b_counter_width_g     => counter_width_g,
467
          b_rx_fifo_depth_g     => rx_fifo_depth_g,
468
          b_tx_fifo_depth_g     => tx_fifo_depth_g,
469
          b_rx_msg_fifo_depth_g => rx_msg_fifo_depth_g,
470
          b_tx_msg_fifo_depth_g => tx_msg_fifo_depth_g,
471
          b_arb_type_g          => arb_type_g,
472
          b_fifo_sel_g          => fifo_sel_g,
473
 
474
          b_debug_width_g       => debug_width_g,
475
          b_prior_g             =>
476
          priority_b(seg, n_segments_g, wrappers_per_segment_c),
477
          b_max_send_g          => max_send_g,
478
          b_n_agents_g          =>
479
          n_agents_in_segment(seg, n_segments_g, wrappers_per_segment_c),
480
          b_n_cfg_pages_g       => n_cfg_pages_g,
481
          b_n_time_slots_g      => n_time_slots_g,
482
          b_n_extra_params_g    => n_extra_params_g,
483
          b_cfg_re_g            => cfg_re_g,
484
          b_cfg_we_g            => cfg_we_g,
485
 
486
          a_id_min_g     => bridge_a_id_min_c(seg-1),
487
          a_id_max_g     => bridge_a_id_max_c(seg-1),
488
          a_addr_limit_g => bridge_a_addr_limit_c(seg-1),
489
 
490
          b_id_min_g     => bridge_b_id_min_c(seg-1),
491
          b_id_max_g     => bridge_b_id_max_c(seg-1),
492
          b_addr_limit_g => bridge_b_addr_limit_c(seg-1)
493
 
494
          )
495
        port map (
496
          a_clk          => clk_noc,
497
          a_rst_n        => rst_n,
498
          b_clk          => clk_noc,
499
          b_rst_n        => rst_n,
500
          a_bus_av_in    => bus_wra_av(seg-1),
501
          a_bus_data_in  => bus_wra_data(seg-1),
502
          a_bus_comm_in  => bus_wra_comm(seg-1),
503
          a_bus_full_in  => bus_wra_full(seg-1),
504
          a_bus_lock_in  => bus_wra_lock(seg-1),
505
          b_bus_av_in    => bus_wra_av(seg),
506
          b_bus_data_in  => bus_wra_data(seg),
507
          b_bus_comm_in  => bus_wra_comm(seg),
508
          b_bus_full_in  => bus_wra_full(seg),
509
          b_bus_lock_in  => bus_wra_lock(seg),
510
          a_bus_av_out   => wra_bus_av(seg-1)(wrappers_per_segment_c),
511
          a_bus_data_out => wra_bus_data(seg-1)(wrappers_per_segment_c),
512
          a_bus_comm_out => wra_bus_comm(seg-1)(wrappers_per_segment_c),
513
          a_bus_lock_out => wra_bus_lock(seg-1)(wrappers_per_segment_c),
514
          a_bus_full_out => wra_bus_full(seg-1)(wrappers_per_segment_c),
515
          b_bus_av_out   => wra_bus_av(seg)(wrappers_per_segment_c+1),
516
          b_bus_data_out => wra_bus_data(seg)(wrappers_per_segment_c+1),
517
          b_bus_comm_out => wra_bus_comm(seg)(wrappers_per_segment_c+1),
518
          b_bus_lock_out => wra_bus_lock(seg)(wrappers_per_segment_c+1),
519
          b_bus_full_out => wra_bus_full(seg)(wrappers_per_segment_c+1)
520
                        -- synthesis translate_off
521
          ,
522
          a_debug_out    => open,
523
          a_debug_in     => (others => '0'),
524
          b_debug_out    => open,
525
          b_debug_in     => (others => '0')
526
          -- synthesis translate_on
527
          );
528
 
529
      -- nullify extra signals
530
      nullify_first_seg : if seg = 1 generate
531
        -- no b-side on the first segment
532
        wra_bus_av(seg-1)(wrappers_per_segment_c+1)   <= '0';
533
        wra_bus_full(seg-1)(wrappers_per_segment_c+1) <= '0';
534
        wra_bus_lock(seg-1)(wrappers_per_segment_c+1) <= '0';
535
        wra_bus_comm(seg-1)(wrappers_per_segment_c+1) <= (others => '0');
536
        wra_bus_data(seg-1)(wrappers_per_segment_c+1) <= (others => '0');
537
      end generate nullify_first_seg;
538
 
539
      nullify_last_seg : if seg = n_segments_g-1 generate
540
        -- no a-side here
541
        wra_bus_av(seg)(wrappers_per_segment_c)   <= '0';
542
        wra_bus_full(seg)(wrappers_per_segment_c) <= '0';
543
        wra_bus_lock(seg)(wrappers_per_segment_c) <= '0';
544
        wra_bus_comm(seg)(wrappers_per_segment_c) <= (others => '0');
545
        wra_bus_data(seg)(wrappers_per_segment_c) <= (others => '0');
546
      end generate nullify_last_seg;
547
 
548
    end generate bridge_needed;
549
 
550
 
551
    no_bridges : if n_segments_g = 1 generate
552
 
553
      -- no bridges, nullify extra all signals
554
      wra_bus_av(seg)(wrappers_per_segment_c)     <= '0';
555
      wra_bus_full(seg)(wrappers_per_segment_c)   <= '0';
556
      wra_bus_lock(seg)(wrappers_per_segment_c)   <= '0';
557
      wra_bus_comm(seg)(wrappers_per_segment_c)   <= (others => '0');
558
      wra_bus_data(seg)(wrappers_per_segment_c)   <= (others => '0');
559
      wra_bus_av(seg)(wrappers_per_segment_c+1)   <= '0';
560
      wra_bus_full(seg)(wrappers_per_segment_c+1) <= '0';
561
      wra_bus_lock(seg)(wrappers_per_segment_c+1) <= '0';
562
      wra_bus_comm(seg)(wrappers_per_segment_c+1) <= (others => '0');
563
      wra_bus_data(seg)(wrappers_per_segment_c+1) <= (others => '0');
564
 
565
    end generate no_bridges;
566
 
567
 
568
  end generate segments;
569
 
570
 
571
  -- making the bus
572
  form_bus : process (wra_bus_data, wra_bus_comm, wra_bus_av,
573
                      wra_bus_full, wra_bus_lock)
574
    variable tmp_data_v : bus_data_segments_array;
575
    variable tmp_comm_v : bus_comm_segments_array;
576
    variable tmp_av_v   : std_logic_vector(n_segments_g-1 downto 0);
577
    variable tmp_full_v : std_logic_vector(n_segments_g-1 downto 0);
578
    variable tmp_lock_v : std_logic_vector(n_segments_g-1 downto 0);
579
  begin  -- process form_bus
580
 
581
    for seg in 0 to n_segments_g-1 loop
582
 
583
      tmp_data_v(seg) := wra_bus_data(seg)(0);
584
      tmp_comm_v(seg) := wra_bus_comm(seg)(0);
585
      tmp_av_v(seg)   := wra_bus_av(seg)(0);
586
      tmp_full_v(seg) := wra_bus_full(seg)(0);
587
      tmp_lock_v(seg) := wra_bus_lock(seg)(0);
588
 
589
      for n in 1 to wrappers_per_segment_c+1 loop
590
 
591
        tmp_data_v(seg) := wra_bus_data(seg)(n) or tmp_data_v(seg);
592
        tmp_comm_v(seg) := wra_bus_comm(seg)(n) or tmp_comm_v(seg);
593
        tmp_av_v(seg)   := wra_bus_av(seg)(n) or tmp_av_v(seg);
594
        tmp_full_v(seg) := wra_bus_full(seg)(n) or tmp_full_v(seg);
595
        tmp_lock_v(seg) := wra_bus_lock(seg)(n) or tmp_lock_v(seg);
596
 
597
      end loop;  -- n
598
 
599
      bus_wra_data(seg) <= tmp_data_v(seg);
600
      bus_wra_comm(seg) <= tmp_comm_v(seg);
601
      bus_wra_av(seg)   <= tmp_av_v(seg);
602
      bus_wra_full(seg) <= tmp_full_v(seg);
603
      bus_wra_lock(seg) <= tmp_lock_v(seg);
604
 
605
    end loop;  -- seg
606
 
607
  end process form_bus;
608
 
609
end structural;

powered by: WebSVN 2.1.0

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