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/] [pkt_codec_mk2/] [1.0/] [vhd/] [ase_mesh1_pkg.vhd] - Blame information for rev 145

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 145 lanttu
-------------------------------------------------------------------------------
2
-- Title      : Functions for ase_mesh1 and wrappers using it
3
-- Project    : 
4
-------------------------------------------------------------------------------
5
-- File       : ase_mesh1_pkg.vhdl
6
-- Author     : Lasse Lehtonen
7
-- Company    : 
8
-- Created    : 2010-06-16
9
-- Last update: 2012-03-31
10
-- Platform   : 
11
-- Standard   : VHDL'93
12
-------------------------------------------------------------------------------
13
-- Description: 
14
-------------------------------------------------------------------------------
15
-- Copyright (c) 2010 
16
-------------------------------------------------------------------------------
17
-- Revisions  :
18
-- Date        Version  Author  Description
19
-- 2010-06-16  1.0      ase     Created
20
-------------------------------------------------------------------------------
21
 
22
library ieee;
23
use ieee.std_logic_1164.all;
24
use ieee.numeric_std.all;
25
 
26
use work.log2_pkg.all;
27
 
28
-------------------------------------------------------------------------------
29
-- PACKAGE DECLARATION
30
-------------------------------------------------------------------------------
31
 
32
package ase_mesh1_pkg is
33
 
34
  -----------------------------------------------------------------------------
35
  -- HELPER FUCTIONS
36
  -----------------------------------------------------------------------------
37
 
38
  -- Returns target address (ase_mesh1 network address)
39
  pure function ase_mesh1_address (
40
    src_id    : in integer;    -- Source agent id number
41
    dst_id    : in integer;    -- Destination agent id number
42
    rows      : in positive;
43
    cols      : in positive;
44
    bus_width : in positive)
45
    return std_logic_vector;
46
 
47
end package ase_mesh1_pkg;
48
 
49
-------------------------------------------------------------------------------
50
-- PACKAGE BODY
51
-------------------------------------------------------------------------------
52
 
53
package body ase_mesh1_pkg is
54
 
55
  pure function ase_mesh1_address (
56
    constant src_id    : in integer;    -- Source agent id number
57
    constant dst_id    : in integer;    -- Destination agent id number
58
    constant rows      : in positive;
59
    constant cols      : in positive;
60
    constant bus_width : in positive)
61
    return std_logic_vector is
62
    variable retval             : std_logic_vector(bus_width-1 downto 0);
63
    variable lr_bit             : std_logic;
64
    variable here_bit           : std_logic;
65
    variable first_dir          : std_logic_vector(1 downto 0);
66
    variable src_row            : integer;
67
    variable src_col            : integer;
68
    variable dst_row            : integer;
69
    variable dst_col            : integer;
70
    constant mesh1_row_width_c  : positive := log2_ceil(rows - 1);
71
    constant mesh1_col_width_c  : positive := log2_ceil(cols - 1);
72
    constant mesh1_port_width_c : positive :=
73
      bus_width - mesh1_row_width_c - mesh1_col_width_c - 4;
74
    variable dst_port : integer := 0;
75
  begin
76
 
77
    retval    := (others => '0');
78
    lr_bit    := '0';
79
    here_bit  := '0';
80
    first_dir := "00";
81
    src_row   := (src_id / cols);
82
    src_col   := src_id - (src_row * cols);
83
    dst_row   := (dst_id / cols);
84
    dst_col   := dst_id - (dst_row * cols);
85
 
86
--    if src_id = 7 then
87
--      report "srow " & integer'image(src_row) & ", drow "
88
--        & integer'image(dst_row) & ", scol "
89
--        & integer'image(src_col) & ", dcol "
90
--        & integer'image(dst_col) & ", cols "
91
--        & integer'image(cols)    & ", rows "
92
--        & integer'image(rows)    
93
--        severity note;
94
--    end if;
95
 
96
    retval(bus_width-1 downto bus_width-mesh1_port_width_c) :=
97
      std_logic_vector(to_unsigned(dst_port, mesh1_port_width_c));
98
 
99
    if src_row = dst_row then
100
      if src_col = dst_col then
101
 
102
      elsif src_col < dst_col then
103
        first_dir := "01";
104
        retval(mesh1_row_width_c+mesh1_col_width_c-1 downto mesh1_row_width_c)
105
 := std_logic_vector
106
          (to_unsigned
107
           ((2**mesh1_col_width_c)-(dst_col-src_col), mesh1_col_width_c));
108
      else
109
        first_dir := "11";
110
        retval(mesh1_row_width_c+mesh1_col_width_c-1 downto mesh1_row_width_c)
111
 := std_logic_vector
112
          (to_unsigned
113
           ((2**mesh1_col_width_c)-(src_col-dst_col), mesh1_col_width_c));
114
      end if;
115
    elsif src_row < dst_row then
116
      first_dir                            := "10";
117
      retval(mesh1_row_width_c-1 downto 0) :=
118
        std_logic_vector
119
        (to_unsigned
120
         ((2**mesh1_row_width_c)-(dst_row-src_row), mesh1_row_width_c));
121
      if src_col = dst_col then
122
        here_bit := '1';
123
      elsif src_col < dst_col then
124
        retval(mesh1_row_width_c+mesh1_col_width_c-1 downto mesh1_row_width_c)
125
 := std_logic_vector
126
          (to_unsigned
127
           ((2**mesh1_col_width_c)-(dst_col-src_col), mesh1_col_width_c));
128
      else
129
        lr_bit := '1';
130
        retval(mesh1_row_width_c+mesh1_col_width_c-1 downto mesh1_row_width_c)
131
 := std_logic_vector
132
          (to_unsigned
133
           ((2**mesh1_col_width_c)-(src_col-dst_col), mesh1_col_width_c));
134
      end if;
135
    else
136
      first_dir                            := "00";
137
      retval(mesh1_row_width_c-1 downto 0) :=
138
        std_logic_vector
139
        (to_unsigned
140
         ((2**mesh1_row_width_c)-(src_row-dst_row), mesh1_row_width_c));
141
      if src_col = dst_col then
142
        here_bit := '1';
143
      elsif src_col < dst_col then
144
        retval(mesh1_row_width_c+mesh1_col_width_c-1 downto mesh1_row_width_c)
145
 := std_logic_vector
146
          (to_unsigned
147
           ((2**mesh1_col_width_c)-(dst_col-src_col), mesh1_col_width_c));
148
      else
149
        lr_bit := '1';
150
        retval(mesh1_row_width_c+mesh1_col_width_c-1 downto mesh1_row_width_c)
151
 := std_logic_vector
152
          (to_unsigned
153
           ((2**mesh1_col_width_c)-(src_col-dst_col), mesh1_col_width_c));
154
      end if;
155
    end if;
156
 
157
    retval(mesh1_row_width_c+mesh1_col_width_c+0) := lr_bit;
158
    retval(mesh1_row_width_c+mesh1_col_width_c+1) := here_bit;
159
    retval(mesh1_row_width_c+mesh1_col_width_c+2) := first_dir(0);
160
    retval(mesh1_row_width_c+mesh1_col_width_c+3) := first_dir(1);
161
 
162
    return retval;
163
  end function ase_mesh1_address;
164
 
165
 
166
end package body ase_mesh1_pkg;

powered by: WebSVN 2.1.0

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