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

Subversion Repositories core_arm

[/] [core_arm/] [trunk/] [vhdl/] [arm/] [tbench_armcache.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.int.all;
8
use work.memdef.all;
9
use work.corelib.all;
10
use work.arm_comp.all;
11
use work.armpctrl.all;
12
use work.cache_comp.all;
13
use work.gendc_lib.all;
14
use work.genic_lib.all;
15
use IEEE.std_logic_arith.all;
16
use IEEE.Std_Logic_unsigned.conv_integer;
17
use STD.TEXTIO.all;
18
 
19
entity tbench_armcache is
20
  port (
21
    rst     : in  std_logic;
22
    clk     : in  std_logic;
23
    clkn    : in  std_logic;
24
    hold    : in cli_hold;
25
    ici     : out genic_type_in;
26
    ico     : in genic_type_out;
27
    dci     : out gendc_type_in;
28
    dco     : in gendc_type_out;
29
    i       : in  armiu_typ_in;
30
    o       : out armiu_typ_out
31
    );
32
end tbench_armcache;
33
 
34
architecture rtl of tbench_armcache is
35
 
36
 
37
  type dcache_test is record
38
    addr : std_logic_vector(31 downto 0);
39
    data : std_logic_vector(31 downto 0);
40
    param : gdcl_param;
41
    annul : std_logic;
42
  end record;
43
  type icache_test is record
44
    addr : std_logic_vector(31 downto 0);
45
    bra : std_logic;
46
    annul : std_logic;
47
  end record;
48
 
49
  type dcache_test_a is array (natural range <>) of dcache_test;
50
  type icache_test_a is array (natural range <>) of icache_test;
51
 
52
  type armiu_itmp_type is record
53
    ici : genic_type_in;
54
  end record;
55
  type armiu_dtmp_type is record
56
    dci : gendc_type_in;
57
  end record;
58
 
59
  type armiu_ireg_type is record
60
    ici : icache_test_a(1 downto 0);
61
    ici_valid : std_logic_vector(1 downto 0);
62
  end record;
63
  type armiu_dreg_type is record
64
    dci : dcache_test_a(3 downto 0);
65
    dci_valid : std_logic_vector(3 downto 0);
66
  end record;
67
  type armiu_ddbg_type is record
68
     dummy : std_logic;
69
     -- pragma translate_off
70
     dbg : armiu_dtmp_type;
71
     -- pragma translate_on
72
  end record;
73
  type armiu_idbg_type is record
74
     dummy : std_logic;
75
     -- pragma translate_off
76
     dbg : armiu_itmp_type;
77
     -- pragma translate_on
78
  end record;
79
  signal dr, dc       : armiu_dreg_type;
80
  signal drdbg, dcdbg : armiu_ddbg_type;
81
  signal ir, ic       : armiu_ireg_type;
82
  signal irdbg, icdbg : armiu_idbg_type;
83
  signal din : dcache_test;
84
  signal iin : icache_test;
85
  signal iin_next, din_next : std_logic;
86
 
87
  procedure dstore(signal din : out dcache_test;
88
                  signal din_next : in std_logic;
89
                  addr : in integer;
90
                  data : in integer;
91
                  size : in lmd_memsize;
92
                  signed : in std_logic;
93
                  lock : in std_logic) is
94
    variable addr_vec : std_logic_vector(31 downto 0);
95
    variable data_vec : std_logic_vector(31 downto 0);
96
    variable lasttime : time;
97
  begin
98
 
99
    wait until falling_edge(clk) and din_next = '1';
100
    wait for 1 ns;
101
 
102
    addr_vec := std_logic_vector(conv_unsigned(addr, 32));
103
    data_vec := (others => 'U');
104
    din.addr <= addr_vec;
105
    din.data <= data_vec;
106
    din.annul <= '0';
107
    din.param.size <= size;
108
    din.param.signed <= signed;
109
    din.param.lock <= lock;
110
    din.param.read <= '0';
111
    din.param.addrin <= '1';
112
    din.param.writedata <= '0';
113
 
114
    wait until falling_edge(clk) and din_next = '1';
115
    wait for 1 ns;
116
 
117
    addr_vec := std_logic_vector(conv_unsigned(addr, 32));
118
    data_vec := std_logic_vector(conv_unsigned(data, 32));
119
    din.addr <= addr_vec;
120
    din.data <= data_vec;
121
    din.annul <= '0';
122
    din.param.size <= size;
123
    din.param.lock <= lock;
124
    din.param.signed <= signed;
125
    din.param.read <= '0';
126
    din.param.addrin <= '0';
127
    din.param.writedata <= '1';
128
 
129
  end;
130
 
131
    procedure dload(signal din : out dcache_test;
132
                  signal din_next : in std_logic;
133
                  addr : in integer;
134
                  size : in lmd_memsize;
135
                  signed : in std_logic;
136
                  lock : in std_logic) is
137
    variable addr_vec : std_logic_vector(31 downto 0);
138
    variable data_vec : std_logic_vector(31 downto 0);
139
    variable lasttime : time;
140
  begin
141
 
142
    wait until falling_edge(clk) and din_next = '1';
143
    wait for 1 ns;
144
 
145
    addr_vec := std_logic_vector(conv_unsigned(addr, 32));
146
    din.addr <= addr_vec;
147
    din.data <= (others => 'U');
148
    din.annul <= '0';
149
    din.param.size <= size;
150
    din.param.signed <= signed;
151
    din.param.lock <= lock;
152
    din.param.read <= '1';
153
    din.param.addrin <= '1';
154
    din.param.writedata <= '0';
155
 
156
  end;
157
 
158
    procedure iload(signal iin : out icache_test;
159
                    signal iin_next : in std_logic;
160
                    addr_start : in integer;
161
                    addr_end : in integer ) is
162
    variable addr_vec : std_logic_vector(31 downto 0);
163
    variable data_vec : std_logic_vector(31 downto 0);
164
    variable lasttime : time;
165
    variable bra : std_logic;
166
  begin
167
    bra := '1';
168
    iin.annul <= '0';
169
    for i in 0 to ((addr_end - addr_start)/4)-1 loop
170
 
171
      wait until falling_edge(clk) and iin_next = '1';
172
      wait for 1 ns;
173
 
174
      addr_vec := std_logic_vector(conv_unsigned(addr_start+(i*4), 32));
175
      iin.addr <= addr_vec;
176
      iin.bra <= bra;
177
      bra := '0';
178
    end loop;  -- i
179
 
180
  end;
181
 
182
begin
183
 
184
  dip0: process
185
  begin
186
    wait for 1 ns;
187
    wait until rst = '1';
188
    dstore (din, din_next, 16#80000014#, 16#0081000f#, lmd_word, '0', '0');
189
    dstore (din, din_next, 16#80000000#, 16#04080300#, lmd_word, '0', '0');
190
    dstore (din, din_next, 16#80000004#, 16#d5384830#, lmd_word, '0', '0');
191
    dstore (din, din_next, 16#80000008#, 16#000f0000#, lmd_word, '0', '0');
192
    dstore (din, din_next, 16#8000000c#, 16#00000000#, lmd_word, '0', '0');
193
    dstore (din, din_next, 16#40000000#, 16#01020304#, lmd_word, '0', '0');
194
    dstore (din, din_next, 16#40000004#, 16#05060708#, lmd_word, '0', '0');
195
    dload  (din, din_next, 16#40000000#, lmd_word, '0', '0');
196
    dload  (din, din_next, 16#40000004#, lmd_word, '0', '0');
197
    dstore (din, din_next, 16#40004000#, 16#10111213#, lmd_byte, '0', '0');
198
    dload  (din, din_next, 16#40004000#, lmd_word, '0', '0');
199
    wait;
200
 
201
  end process dip0;
202
 
203
  iip0: process
204
    variable iv    : armiu_ireg_type;
205
    variable it    : armiu_itmp_type;
206
    variable ivdbg : armiu_idbg_type;
207
  begin
208
    wait for 1 ns;
209
    wait until rst = '1';
210
    iload (iin, iin_next, 16#00000000#, 16#00001000#);
211
    wait;
212
  end process iip0;
213
 
214
  ip0: process (clk, clkn, rst, ir, hold, i, ico, dco, iin )
215
    variable iv    : armiu_ireg_type;
216
    variable it    : armiu_itmp_type;
217
    variable ivdbg : armiu_idbg_type;
218
  begin
219
 
220
    iv := ir;
221
 
222
    -- reset
223
    if ( rst = '0' ) then
224
      iv.ici_valid := (others => '0');
225
    end if;
226
 
227
    iin_next <= '0';
228
    if hold.hold = '0' then
229
      iv.ici(1) := iin;
230
      iv.ici(0) := ir.ici(1);
231
      iv.ici_valid(1) := '1';
232
      iv.ici_valid(0) := ir.ici_valid(1);
233
      iin_next <= '1';
234
    end if;
235
 
236
    it.ici.pc_r := ir.ici(0).addr;
237
    it.ici.pc_v := ir.ici(1).addr;
238
    it.ici.bra_r := ir.ici(0).bra;
239
    it.ici.bra_v := ir.ici(1).bra;
240
    it.ici.annul := ir.ici(0).annul or (not ir.ici_valid(0));
241
    it.ici.flush := '0';
242
 
243
    ic <= iv;
244
    ici <= it.ici;
245
 
246
    -- pragma translate_off
247
    ivdbg := irdbg;
248
    ivdbg.dbg := it;
249
    icdbg <= ivdbg;
250
    -- pragma translate_on  
251
 
252
  end process ip0;
253
 
254
 
255
 
256
  dp0: process (clk, clkn, rst, dr, hold, i, ico, dco, din )
257
    variable dv    : armiu_dreg_type;
258
    variable dt    : armiu_dtmp_type;
259
    variable dvdbg : armiu_ddbg_type;
260
  begin
261
 
262
    dv := dr;
263
 
264
    -- reset
265
    if ( rst = '0' ) then
266
      dv.dci_valid := (others => '0');
267
    end if;
268
 
269
    din_next <= '0';
270
    if hold.hold = '0' then
271
      dv.dci(3) := din;
272
      dv.dci(2 downto 0) := dr.dci(3 downto 1);
273
      dv.dci_valid(3) := '1';
274
      dv.dci_valid(2 downto 0) := dr.dci_valid(3 downto 1);
275
      din_next <= '1';
276
    end if;
277
 
278
    dt.dci.addr_in := dr.dci(2).addr;
279
    dt.dci.data_in := dr.dci(2).data;
280
    dt.dci.addr_re := dr.dci(1).addr;
281
    dt.dci.data_re := dr.dci(1).data;
282
    dt.dci.addrin_re := dr.dci(1).param.addrin and dr.dci_valid(1);
283
    dt.dci.param_r := dr.dci(1).param;
284
    dt.dci.annul := dr.dci(1).annul;
285
 
286
    dc <= dv;
287
    dci <= dt.dci;
288
 
289
    -- pragma translate_off
290
    dvdbg := drdbg;
291
    dvdbg.dbg := dt;
292
    dcdbg <= dvdbg;
293
    -- pragma translate_on  
294
 
295
  end process dp0;
296
 
297
  pregs : process (clk, dc, ic)
298
  begin
299
    if rising_edge(clk) then
300
      ir <= ic;
301
      dr <= dc;
302
      -- pragma translate_off
303
      irdbg <= icdbg;
304
      drdbg <= dcdbg;
305
      -- pragma translate_on
306
    end if;
307
  end process;
308
 
309
 
310
end rtl;

powered by: WebSVN 2.1.0

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