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

Subversion Repositories core_arm

[/] [core_arm/] [trunk/] [vhdl/] [mem/] [cache/] [libs/] [gencmem_lib.vhd] - Blame information for rev 2

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

Line No. Rev Author Line
1 2 tarookumic
-- $(lic)
2
-- $(help_generic)
3
-- $(help_local)
4
 
5
library ieee;
6
use ieee.std_logic_1164.all;
7
use work.int.all;
8
use work.config.all;
9
use work.cache_config.all;
10
 
11
-- PREFIX: gcml_xxx
12
package gencmem_lib is
13
 
14
-- ICACHE:
15
--
16
--                      +---------------------+---------------+-------+----+
17
-- addr as data-access: |          xxx        |   DADDR       | DLINE | 00 |
18
--                      +---------------------+---------------+-------+----+
19
--                      
20
--                      +---------------------+-----------+-----------+----+
21
-- addr as tag-access : |        TTAG         |   TADDR   | TLINE     | 00 |   |
22
--                      +---------------------+-----------+-----------+----+
23
--
24
--                  ICACHE TAG                                          ICACHE DATA
25
--        .                    .        .                  .                    .                    . 
26
--  TADDR |                    |        |            DADDR |                    |                    | 
27
--    |   +--------------------+--------+              |   +--------------------+--------------------+..
28
--    +-->|       CTAG         | CVALID |              +-->|       data         |       data         |
29
--        +--------------------+--------+                  +--------------------+--------------------+..
30
--        |                    |        |                  |                    |                    |
31
--        .                    .        .                  .                    .                    .
32
 
33
-- addr as icache tag-access (sizes only)
34
constant GCML_IC_TTAG_BSZ : integer := CFG_IC_ADDR_SZ - (2 + (8 +lin_log2(CFG_IC_SET_SZ)));
35
constant GCML_IC_TADDR_BSZ : integer := ((8 +lin_log2(CFG_IC_SET_SZ))-lin_log2(CFG_IC_TLINE_SZ)); -- (lin_log(1k)-2) + lin_log2(cachesize) - lin_log2(cacheline)
36
constant GCML_IC_TLINE_BSZ : integer := lin_log2(CFG_IC_TLINE_SZ);
37
 
38
-- addr to icache data-access (sizes only)
39
constant GCML_IC_DADDR_BSZ : integer := ((8 +lin_log2(CFG_IC_SET_SZ))-lin_log2(CFG_IC_DLINE_SZ)); -- (lin_log(1k)-2) + lin_log2(cachesize) - lin_log2(cacheline)
40
constant GCML_IC_DLINE_BSZ : integer := lin_log2(CFG_IC_DLINE_SZ);
41
 
42
-- icache cmem-data layout
43
constant GCML_IC_DL_BSZ : integer := CFG_IC_DLINE_SZ*32;
44
 
45
-- icache cmem-tag layout
46
constant GCML_IC_CLOCK_C : integer := (CFG_IC_TLINE_SZ+(CFG_IC_ADDR_SZ-(2+(8+lin_log2(CFG_IC_SET_SZ)))));
47
constant GCML_IC_CTAG_D : integer := CFG_IC_TLINE_SZ;  -- tag to compare addr to
48
constant GCML_IC_CTAG_U : integer := (CFG_IC_TLINE_SZ+(CFG_IC_ADDR_SZ-(2+(8+lin_log2(CFG_IC_SET_SZ)))))-1;
49
constant GCML_IC_CVALID_D : integer := 0;  -- valid bit of line entry
50
constant GCML_IC_CVALID_U : integer := (CFG_IC_TLINE_SZ)-1;
51
constant GCML_IC_TL_BSZ : integer := (CFG_IC_TLINE_SZ+(CFG_IC_ADDR_SZ-(2+(8+lin_log2(CFG_IC_SET_SZ)))))+1; -- complete tag line size
52
 
53
-- icache tag line 
54
type gcml_ic_tline is record
55
  tag   : std_logic_vector(GCML_IC_TTAG_BSZ-1 downto 0);
56
  valid : std_logic_vector(CFG_IC_TLINE_SZ-1 downto 0);
57
  lock : std_logic;
58
end record;
59
type gcml_ic_tline_a is array (natural range <>) of gcml_ic_tline;
60
 
61
-- icache data line 
62
type std_logic_vector_a is array (natural range <>) of std_logic_vector(31 downto 0);
63
type gcml_ic_dline is record
64
  data : std_logic_vector_a(CFG_IC_DLINE_SZ-1 downto 0);
65
end record;
66
type gcml_ic_dline_a is array (natural range <>) of gcml_ic_dline;
67
 
68
 
69
function gcml_icttostd (
70
  line : gcml_ic_tline
71
) return std_logic_vector;
72
 
73
procedure gcml_stdtoict (
74
  data : in std_logic_vector(GCML_IC_TL_BSZ-1 downto 0);
75
  line : inout gcml_ic_tline
76
);
77
 
78
function gcml_icdtostd (
79
  line : gcml_ic_dline
80
) return std_logic_vector;
81
 
82
procedure gcml_stdtoicd (
83
  data : in std_logic_vector(GCML_IC_DL_BSZ-1 downto 0);
84
  line : inout gcml_ic_dline
85
);
86
 
87
 
88
 
89
-- DCACHE:
90
--
91
--                      +---------------------+---------------+-------+----+
92
-- addr as data-access: |          xxx        |   DADDR       | DLINE | 00 |
93
--                      +---------------------+---------------+-------+----+
94
--                      
95
--                      +---------------------+-----------+-----------+----+
96
-- addr as tag-access : |        TTAG         |   TADDR   | TLINE     | 00 |   |
97
--                      +---------------------+-----------+-----------+----+
98
--
99
--                  ICACHE TAG                                          ICACHE DATA
100
--        .                    .        .                  .                    .                    . 
101
--  TADDR |                    |        |            DADDR |                    |                    | 
102
--    |   +--------------------+--------+              |   +--------------------+--------------------+..
103
--    +-->|       CTAG         | CVALID |              +-->|       data         |       data         |
104
--        +--------------------+--------+                  +--------------------+--------------------+..
105
--        |                    |        |                  |                    |                    |
106
--        .                    .        .                  .                    .                    .
107
 
108
-- addr as dcache tag-access (sizes only)
109
constant GCML_DC_TDIRTY_BSZ : integer := lin_log2(CFG_DC_TLINE_SZ);
110
constant GCML_DC_TTAG_BSZ   : integer := CFG_DC_ADDR_SZ - (2 + (8 +lin_log2(CFG_DC_SET_SZ)));
111
constant GCML_DC_TADDR_BSZ  : integer := ((8 +lin_log2(CFG_DC_SET_SZ))-lin_log2(CFG_DC_TLINE_SZ)); -- (lin_log(1k)-2) + lin_log2(cachesize) - lin_log2(cacheline)
112
constant GCML_DC_TLINE_BSZ  : integer := lin_log2(CFG_DC_TLINE_SZ);
113
 
114
-- addr as dcache data-access (sizes only)
115
constant GCML_DC_DADDR_BSZ : integer := ((8 +lin_log2(CFG_DC_SET_SZ))-lin_log2(CFG_DC_DLINE_SZ)); -- (lin_log(1k)-2) + lin_log2(cachesize) - lin_log2(cacheline)
116
constant GCML_DC_DLINE_BSZ : integer := lin_log2(CFG_DC_DLINE_SZ);
117
 
118
-- writeback to writebuffer
119
constant GCML_DC_DLINEperTLINE_SZ : integer := CFG_DC_TLINE_SZ/CFG_DC_DLINE_SZ;
120
 
121
-- dcache cmem-data layout
122
constant GCML_DC_DL_BSZ   : integer := CFG_DC_DLINE_SZ*32;
123
 
124
-- dcache cmem-tag layout
125
constant GCML_DC_CLOCK_C  : integer := ((CFG_DC_TLINE_SZ*2)+(CFG_DC_ADDR_SZ-(2+(8+lin_log2(CFG_DC_SET_SZ)))));
126
constant GCML_DC_CDIRTY_D : integer :=  (CFG_DC_TLINE_SZ   +(CFG_DC_ADDR_SZ-(2+(8+lin_log2(CFG_DC_SET_SZ)))));
127
constant GCML_DC_CDIRTY_U : integer := ((CFG_DC_TLINE_SZ*2)+(CFG_DC_ADDR_SZ-(2+(8+lin_log2(CFG_DC_SET_SZ)))))-1;
128
constant GCML_DC_CTAG_D   : integer :=   CFG_DC_TLINE_SZ;
129
constant GCML_DC_CTAG_U   : integer :=  (CFG_DC_TLINE_SZ   +(CFG_DC_ADDR_SZ-(2+(8+lin_log2(CFG_DC_SET_SZ)))))-1;
130
constant GCML_DC_CVALID_D : integer :=   0;
131
constant GCML_DC_CVALID_U : integer :=  (CFG_DC_TLINE_SZ)-1;
132
constant GCML_DC_TL_BSZ   : integer := ((CFG_DC_TLINE_SZ*2)+(CFG_DC_ADDR_SZ-(2+(8+lin_log2(CFG_DC_SET_SZ)))))+1;
133
 
134
 
135
-- dcache tag line 
136
type gcml_dc_tline is record
137
  tag   : std_logic_vector(GCML_DC_TTAG_BSZ-1 downto 0);
138
  valid : std_logic_vector(CFG_DC_TLINE_SZ-1 downto 0);
139
  dirty : std_logic_vector(CFG_DC_TLINE_SZ-1 downto 0);
140
  lock : std_logic;
141
end record;
142
type gcml_dc_tline_a is array (natural range <>) of gcml_dc_tline;
143
 
144
-- dcache data line 
145
type gcml_dc_dline is record
146
  data : std_logic_vector_a(CFG_DC_DLINE_SZ-1 downto 0);
147
end record;
148
type gcml_dc_dline_a is array (natural range <>) of gcml_dc_dline;
149
 
150
 
151
function gcml_dcttostd (
152
  line : gcml_dc_tline
153
) return std_logic_vector;
154
 
155
procedure gcml_stdtodct (
156
  data : in std_logic_vector(GCML_DC_TL_BSZ-1 downto 0);
157
  line : inout gcml_dc_tline
158
);
159
 
160
function gcml_dcdtostd (
161
  line : gcml_dc_dline
162
) return std_logic_vector;
163
 
164
procedure gcml_stdtodcd (
165
  data : in std_logic_vector(GCML_DC_DL_BSZ-1 downto 0);
166
  line : inout gcml_dc_dline
167
);
168
 
169
 
170
 
171
end gencmem_lib;
172
 
173
package body gencmem_lib is
174
 
175
-- icache conversions
176
function gcml_icttostd (
177
  line : gcml_ic_tline
178
) return std_logic_vector is
179
  variable tmp : std_logic_vector(GCML_IC_TL_BSZ-1 downto 0);
180
begin
181
  tmp(GCML_IC_CTAG_U downto GCML_IC_CTAG_D) := line.tag;
182
  tmp(GCML_IC_CVALID_U downto GCML_IC_CVALID_D) := line.valid;
183
  tmp(GCML_IC_CLOCK_C) := line.lock;
184
  return tmp;
185
end;
186
 
187
procedure gcml_stdtoict (
188
  data : in std_logic_vector(GCML_IC_TL_BSZ-1 downto 0);
189
  line : inout gcml_ic_tline
190
) is
191
begin
192
  line.tag := data(GCML_IC_CTAG_U downto GCML_IC_CTAG_D);
193
  line.valid := data(GCML_IC_CVALID_U downto GCML_IC_CVALID_D);
194
  line.lock := data(GCML_IC_CLOCK_C);
195
end;
196
 
197
function gcml_icdtostd (
198
  line : gcml_ic_dline
199
) return std_logic_vector is
200
  variable tmp : std_logic_vector(GCML_IC_DL_BSZ-1 downto 0);
201
begin
202
  for i in CFG_IC_DLINE_SZ-1 downto 0 loop
203
    tmp((i*32)+31 downto (i*32)) := line.data(i);
204
  end loop;
205
  return tmp;
206
end;
207
 
208
procedure gcml_stdtoicd (
209
  data : in std_logic_vector(GCML_IC_DL_BSZ-1 downto 0);
210
  line : inout gcml_ic_dline
211
) is
212
begin
213
  for i in CFG_IC_DLINE_SZ-1 downto 0 loop
214
    line.data(i) := data((i*32)+31 downto (i*32));
215
  end loop;
216
end;
217
 
218
-- dcache conversions
219
function gcml_dcttostd (
220
  line : gcml_dc_tline
221
) return std_logic_vector is
222
  variable tmp : std_logic_vector(GCML_DC_TL_BSZ-1 downto 0);
223
begin
224
  tmp(GCML_DC_CTAG_U downto GCML_DC_CTAG_D) := line.tag;
225
  tmp(GCML_DC_CVALID_U downto GCML_DC_CVALID_D) := line.valid;
226
  tmp(GCML_DC_CDIRTY_U downto GCML_DC_CDIRTY_D) := line.dirty;
227
  tmp(GCML_DC_CLOCK_C) := line.lock;
228
  return tmp;
229
end;
230
 
231
procedure gcml_stdtodct (
232
  data : in std_logic_vector(GCML_DC_TL_BSZ-1 downto 0);
233
  line : inout gcml_dc_tline
234
) is
235
begin
236
  line.tag := data(GCML_DC_CTAG_U downto GCML_DC_CTAG_D);
237
  line.valid := data(GCML_DC_CVALID_U downto GCML_DC_CVALID_D);
238
  line.dirty := data(GCML_DC_CDIRTY_U downto GCML_DC_CDIRTY_D);
239
  line.lock := data(GCML_DC_CLOCK_C);
240
end;
241
 
242
function gcml_dcdtostd (
243
  line : gcml_dc_dline
244
) return std_logic_vector is
245
  variable tmp : std_logic_vector(GCML_DC_DL_BSZ-1 downto 0);
246
begin
247
  for i in CFG_DC_DLINE_SZ-1 downto 0 loop
248
    tmp((i*32)+31 downto (i*32)) := line.data(i);
249
  end loop;
250
  return tmp;
251
end;
252
 
253
procedure gcml_stdtodcd (
254
  data : in std_logic_vector(GCML_DC_DL_BSZ-1 downto 0);
255
  line : inout gcml_dc_dline
256
) is
257
begin
258
  for i in CFG_DC_DLINE_SZ-1 downto 0 loop
259
    line.data(i) := data((i*32)+31 downto (i*32));
260
  end loop;
261
end;
262
 
263
end gencmem_lib;

powered by: WebSVN 2.1.0

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