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

Subversion Repositories core_arm

[/] [core_arm/] [trunk/] [vhdl/] [mem/] [cache/] [gencmem.vhd] - Blame information for rev 4

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.config.all;
8
use work.cache_config.all;
9
use work.tech_map.all;
10
use work.gencmem_lib.all;
11
use work.gendc_lib.all;
12
use work.genic_lib.all;
13
use work.cache_comp.all;
14
 
15
entity gencmem is
16
  port (
17
    rst    : in  std_logic;
18
    clk    : in  std_logic;
19
    i  : in  gencmem_type_in;
20
    o  : out gencmem_type_out
21
    );
22
end gencmem;
23
 
24
architecture rtl of gencmem is
25
 
26
  type it_data_type_a is array (natural range <>) of std_logic_vector(GCML_IC_TL_BSZ -1 downto 0);
27
  type id_data_type_a is array (natural range <>) of std_logic_vector(GCML_IC_DL_BSZ -1 downto 0);
28
  type dt_data_type_a is array (natural range <>) of std_logic_vector(GCML_DC_TL_BSZ -1 downto 0);
29
  type dd_data_type_a is array (natural range <>) of std_logic_vector(GCML_DC_DL_BSZ -1 downto 0);
30
  type gencmem_tmp_type is record
31
    dummy : std_logic;
32
    o  : gencmem_type_out;
33
 
34
    -- icache tag
35
    it_addr : std_logic_vector(GCML_IC_TADDR_BSZ -1 downto 0);
36
    it_datain  : it_data_type_a(CFG_IC_SETS-1 downto 0);
37
    it_enable : std_logic;
38
    it_write : std_logic_vector(CFG_IC_SETS-1 downto 0);
39
    -- icache data
40
    id_addr : std_logic_vector(GCML_IC_DADDR_BSZ -1 downto 0);
41
    id_datain  : id_data_type_a(CFG_IC_SETS-1 downto 0);
42
    id_enable : std_logic;
43
    id_write : std_logic_vector(CFG_IC_SETS-1 downto 0);
44
 
45
    -- dcache tag
46
    dt_addr : std_logic_vector(GCML_DC_TADDR_BSZ -1 downto 0);
47
    dt_datain  : dt_data_type_a(CFG_DC_SETS-1 downto 0);
48
    dt_enable : std_logic;
49
    dt_write : std_logic_vector(CFG_DC_SETS-1 downto 0);
50
    -- icache data
51
    dd_addr : std_logic_vector(GCML_DC_DADDR_BSZ -1 downto 0);
52
    dd_datain  : dd_data_type_a(CFG_DC_SETS-1 downto 0);
53
    dd_enable : std_logic;
54
    dd_write : std_logic_vector(CFG_DC_SETS-1 downto 0);
55
 
56
  end record;
57
  type gencmem_reg_type is record
58
    dummy : std_logic;
59
  end record;
60
  type gencmem_dbg_type is record
61
     dummy : std_logic;
62
     -- pragma translate_off
63
     dbg : gencmem_tmp_type;
64
     -- pragma translate_on
65
  end record;
66
  signal r, c       : gencmem_reg_type;
67
  signal rdbg, cdbg : gencmem_dbg_type;
68
 
69
  -- icache tag
70
  signal it_addr : std_logic_vector(GCML_IC_TADDR_BSZ -1 downto 0);
71
  signal it_datain  : it_data_type_a(CFG_IC_SETS-1 downto 0);
72
  signal it_dataout : it_data_type_a(CFG_IC_SETS-1 downto 0);
73
  signal it_enable : std_logic;
74
  signal it_write : std_logic_vector(CFG_IC_SETS-1 downto 0);
75
  -- icache data
76
  signal id_addr : std_logic_vector(GCML_IC_DADDR_BSZ -1 downto 0);
77
  signal id_datain  : id_data_type_a(CFG_IC_SETS-1 downto 0);
78
  signal id_dataout : id_data_type_a(CFG_IC_SETS-1 downto 0);
79
  signal id_enable : std_logic;
80
  signal id_write : std_logic_vector(CFG_IC_SETS-1 downto 0);
81
 
82
  -- dcache tag
83
  signal dt_addr : std_logic_vector(GCML_DC_TADDR_BSZ -1 downto 0);
84
  signal dt_datain  : dt_data_type_a(CFG_DC_SETS-1 downto 0);
85
  signal dt_dataout : dt_data_type_a(CFG_DC_SETS-1 downto 0);
86
  signal dt_enable : std_logic;
87
  signal dt_write : std_logic_vector(CFG_DC_SETS-1 downto 0);
88
  -- dcache data
89
  signal dd_addr : std_logic_vector(GCML_DC_DADDR_BSZ -1 downto 0);
90
  signal dd_datain  : dd_data_type_a(CFG_DC_SETS-1 downto 0);
91
  signal dd_dataout : dd_data_type_a(CFG_DC_SETS-1 downto 0);
92
  signal dd_enable : std_logic;
93
  signal dd_write : std_logic_vector(CFG_DC_SETS-1 downto 0);
94
 
95
begin
96
 
97
  p0: process ( clk, rst, r, i,
98
                it_dataout, id_dataout,
99
                dt_dataout, dd_dataout )
100
    variable v    : gencmem_reg_type;
101
    variable t    : gencmem_tmp_type;
102
    variable vdbg : gencmem_dbg_type;
103
  begin
104
 
105
    -- $(init(t:gencmem_tmp_type))
106
 
107
    v := r;
108
 
109
    -- icache address
110
    t.it_addr := i.ic.addr(GICL_TADDR_U downto GICL_TADDR_D);
111
    t.id_addr := i.ic.addr(GICL_DADDR_U downto GICL_DADDR_D);
112
 
113
    -- icache inputs
114
    t.it_enable := '1';
115
    for j in 0 to CFG_IC_SETS-1 loop
116
      t.it_datain(j) := gcml_icttostd(i.ic.tag_line);
117
      t.id_datain(j) := gcml_icdtostd(i.ic.dat_line);
118
      t.it_write(j) := i.ic.tag_write(j);
119
      t.id_write(j) := i.ic.dat_write(j);
120
    end loop;
121
    -- icache outputs
122
    for j in 0 to CFG_IC_SETS-1 loop
123
      gcml_stdtoict(it_dataout(j),t.o.ic.tag_line(j));
124
      gcml_stdtoicd(id_dataout(j),t.o.ic.dat_line(j));
125
    end loop;
126
 
127
    -- dcache address
128
    t.dt_addr := i.dc.addr(GDCL_TADDR_U downto GDCL_TADDR_D);
129
    t.dd_addr := i.dc.addr(GDCL_DADDR_U downto GDCL_DADDR_D);
130
 
131
    -- dcache inputs
132
    t.dt_enable := '1';
133
    for j in 0 to CFG_DC_SETS-1 loop
134
      t.dt_datain(j) := gcml_dcttostd(i.dc.tag_line);
135
      t.dd_datain(j) := gcml_dcdtostd(i.dc.dat_line);
136
      t.dt_write(j) := i.dc.tag_write(j);
137
      t.dd_write(j) := i.dc.dat_write(j);
138
    end loop;
139
    -- dcache outputs
140
    for j in 0 to CFG_DC_SETS-1 loop
141
      gcml_stdtodct(dt_dataout(j),t.o.dc.tag_line(j));
142
      gcml_stdtodcd(dd_dataout(j),t.o.dc.dat_line(j));
143
    end loop;
144
 
145
    -- reset
146
    if ( rst = '0' ) then
147
    end if;
148
 
149
    c <= v;
150
 
151
    o <= t.o;
152
 
153
    it_addr <= t.it_addr;
154
    id_addr <= t.id_addr;
155
    it_enable <= t.it_enable;
156
    for j in 0 to CFG_IC_SETS-1 loop
157
      it_datain(j) <= t.it_datain(j);
158
      id_datain(j) <= t.id_datain(j);
159
      it_write(j) <= t.it_write(j);
160
      id_write(j) <= t.id_write(j);
161
    end loop;
162
 
163
    dt_addr <= t.dt_addr;
164
    dd_addr <= t.dd_addr;
165
    dt_enable <= t.dt_enable;
166
    for j in 0 to CFG_DC_SETS-1 loop
167
      dt_datain(j) <= t.dt_datain(j);
168
      dd_datain(j) <= t.dd_datain(j);
169
      dt_write(j) <= t.dt_write(j);
170
      dd_write(j) <= t.dd_write(j);
171
    end loop;
172
 
173
    -- pragma translate_off
174
    vdbg := rdbg;
175
    vdbg.dbg := t;
176
    cdbg <= vdbg;
177
    -- pragma translate_on  end process p0;
178
 
179
  end process p0;
180
 
181
  pregs : process (clk, c)
182
  begin
183
    if rising_edge(clk) then
184
      r <= c;
185
      -- pragma translate_off
186
      rdbg <= cdbg;
187
      -- pragma translate_on
188
    end if;
189
  end process;
190
 
191
  -- icache <tag and data>
192
  icm0 : for i in 0 to CFG_IC_SETS-1 generate
193
    -- <icache tag>
194
    itags0 : syncram
195
      generic map (
196
        dbits => GCML_IC_TL_BSZ,
197
        abits => GCML_IC_TADDR_BSZ
198
      )
199
      port map (
200
        it_addr, clk,
201
        it_datain(i),
202
        it_dataout(i),
203
        it_enable,
204
        it_write(i)
205
      );
206
    -- <icache data>
207
    idata0 : syncram
208
      generic map (
209
        dbits => GCML_IC_DL_BSZ,
210
        abits => GCML_IC_DADDR_BSZ
211
      )
212
      port map (
213
        id_addr, clk,
214
        id_datain(i),
215
        id_dataout(i),
216
        id_enable,
217
        id_write(i)
218
      );
219
  end generate;
220
 
221
  -- dcache <tag and data>
222
  dcm0 : for i in 0 to CFG_DC_SETS-1 generate
223
    -- <dcache tag>
224
    dtags0 : syncram
225
      generic map (
226
        dbits => GCML_DC_TL_BSZ,
227
        abits => GCML_DC_TADDR_BSZ
228
      )
229
      port map (
230
        dt_addr, clk,
231
        dt_datain(i),
232
        dt_dataout(i),
233
        dt_enable,
234
        dt_write(i)
235
      );
236
    -- <dcache data>
237
    ddata0 : syncram
238
      generic map (
239
        dbits => GCML_DC_DL_BSZ,
240
        abits => GCML_DC_DADDR_BSZ
241
      )
242
      port map (
243
        dd_addr, clk,
244
        dd_datain(i),
245
        dd_dataout(i),
246
        dd_enable,
247
        dd_write(i)
248
      );
249
  end generate;
250
 
251
 
252
 
253
end rtl;
254
 

powered by: WebSVN 2.1.0

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