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

Subversion Repositories pavr

[/] [pavr/] [trunk/] [src/] [test_pavr_register_file.vhd] - Blame information for rev 6

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 4 doru
-- <File header>
2
-- Project
3
--    pAVR (pipelined AVR) is an 8 bit RISC controller, compatible with Atmel's
4
--    AVR core, but about 3x faster in terms of both clock frequency and MIPS.
5
--    The increase in speed comes from a relatively deep pipeline. The original
6
--    AVR core has only two pipeline stages (fetch and execute), while pAVR has
7
--    6 pipeline stages:
8
--       1. PM    (read Program Memory)
9
--       2. INSTR (load Instruction)
10
--       3. RFRD  (decode Instruction and read Register File)
11
--       4. OPS   (load Operands)
12
--       5. ALU   (execute ALU opcode or access Unified Memory)
13
--       6. RFWR  (write Register File)
14
-- Version
15
--    0.32
16
-- Date
17
--    2002 August 07
18
-- Author
19
--    Doru Cuturela, doruu@yahoo.com
20
-- License
21
--    This program is free software; you can redistribute it and/or modify
22
--    it under the terms of the GNU General Public License as published by
23
--    the Free Software Foundation; either version 2 of the License, or
24
--    (at your option) any later version.
25
--    This program is distributed in the hope that it will be useful,
26
--    but WITHOUT ANY WARRANTY; without even the implied warranty of
27
--    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
28
--    GNU General Public License for more details.
29
--    You should have received a copy of the GNU General Public License
30
--    along with this program; if not, write to the Free Software
31
--    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
32
-- </File header>
33
 
34
 
35
 
36
-- <File info>
37
-- This tests pAVR's Register File.
38
-- The following tests are done:
39
--    - read all ports, one at a time
40
--       - read port 1 (RFRD1)
41
--       - read port 2 (RFRD2)
42
--       - write port (RFWR)
43
--       - write pointer register X (RFXWR)
44
--       - write pointer register Y (RFYWR)
45
--       - write pointer register Z (RFZWR)
46
--    - combined RFRD1, RFRD2, RFWR
47
--       They should work simultaneousely.
48
--    - combined RFXWR, RFYWR, RFZWR
49
--       They should work simultaneousely.
50
--    - combined RFRD1, RFRD2, RFWR, RFXWR, RFYWR, RFZWR
51
--       That is, all RF ports are accessed simultaneousely. They should work do
52
--       their job.
53
--       However, note that the pointer registers are accessible for writting by
54
--       their own ports but also by the RF write port. Writing them via pointer
55
--       register write ports overwrites writing via general write port.
56
--       Even though concurrent writing could happen in a perfectly legal AVR
57
--       implementation, AVR's behavior is unpredictible (what write port has
58
--       priority). We have chosen for pAVR the priority as mentioned above.
59
-- </File info>
60
 
61
 
62
 
63
-- <File body>
64
library ieee;
65
use ieee.std_logic_1164.all;
66
library work;
67
use work.std_util.all;
68
use work.pavr_util.all;
69
use work.pavr_constants.all;
70
 
71
 
72
entity test_pavr_rf is
73
end;
74
 
75
 
76
architecture test_pavr_rf_arch of test_pavr_rf is
77
   signal clk, res, syncres: std_logic;
78
 
79
   -- Clock counter
80
   signal cnt: std_logic_vector(7 downto 0);
81
 
82
   -- RF read port 1
83
   signal pavr_rf_rd1_addr : std_logic_vector(4 downto 0);
84
   signal pavr_rf_rd1_rd   : std_logic;
85
   signal pavr_rf_rd1_do   : std_logic_vector(7 downto 0);
86
 
87
   -- RF read port 2
88
   signal pavr_rf_rd2_addr : std_logic_vector(4 downto 0);
89
   signal pavr_rf_rd2_rd   : std_logic;
90
   signal pavr_rf_rd2_do   : std_logic_vector(7 downto 0);
91
 
92
   -- RF write port
93
   signal pavr_rf_wr_addr  : std_logic_vector(4 downto 0);
94
   signal pavr_rf_wr_wr    : std_logic;
95
   signal pavr_rf_wr_di    : std_logic_vector(7 downto 0);
96
 
97
   -- X pointer port
98
   signal pavr_rf_x     : std_logic_vector(15 downto 0);
99
   signal pavr_rf_x_wr  : std_logic;
100
   signal pavr_rf_x_di  : std_logic_vector(15 downto 0);
101
 
102
   -- Y pointer port
103
   signal pavr_rf_y     : std_logic_vector(15 downto 0);
104
   signal pavr_rf_y_wr  : std_logic;
105
   signal pavr_rf_y_di  : std_logic_vector(15 downto 0);
106
 
107
   -- Z pointer port
108
   signal pavr_rf_z     : std_logic_vector(15 downto 0);
109
   signal pavr_rf_z_wr  : std_logic;
110
   signal pavr_rf_z_di  : std_logic_vector(15 downto 0);
111
 
112
   -- Declare the Register File.
113
   component pavr_rf
114
   port(
115
      pavr_rf_clk:     in std_logic;
116
      pavr_rf_res:     in std_logic;
117
      pavr_rf_syncres: in std_logic;
118
 
119
      -- Read port #1
120
      pavr_rf_rd1_addr: in  std_logic_vector(4 downto 0);
121
      pavr_rf_rd1_rd:   in  std_logic;
122
      pavr_rf_rd1_do:   out std_logic_vector(7 downto 0);
123
 
124
      -- Read port #2
125
      pavr_rf_rd2_addr: in  std_logic_vector(4 downto 0);
126
      pavr_rf_rd2_rd:   in  std_logic;
127
      pavr_rf_rd2_do:   out std_logic_vector(7 downto 0);
128
 
129
      -- Write port
130
      pavr_rf_wr_addr: in std_logic_vector(4 downto 0);
131
      pavr_rf_wr_wr:   in std_logic;
132
      pavr_rf_wr_di:   in std_logic_vector(7 downto 0);
133
 
134
      -- Pointer registers
135
      pavr_rf_x:    out std_logic_vector(15 downto 0);
136
      pavr_rf_x_wr: in  std_logic;
137
      pavr_rf_x_di: in  std_logic_vector(15 downto 0);
138
 
139
      pavr_rf_y:    out std_logic_vector(15 downto 0);
140
      pavr_rf_y_wr: in  std_logic;
141
      pavr_rf_y_di: in  std_logic_vector(15 downto 0);
142
 
143
      pavr_rf_z:    out std_logic_vector(15 downto 0);
144
      pavr_rf_z_wr: in  std_logic;
145
      pavr_rf_z_di: in  std_logic_vector(15 downto 0)
146
   );
147
   end component;
148
   for all: pavr_rf use entity work.pavr_rf(pavr_rf_arch);
149
 
150
begin
151
 
152
   -- Instantiate a the Register File.
153
   pavr_rf_instance1: pavr_rf
154
   port map(
155
      clk,
156
      res,
157
      syncres,
158
 
159
      -- Read port #1
160
      pavr_rf_rd1_addr,
161
      pavr_rf_rd1_rd,
162
      pavr_rf_rd1_do,
163
 
164
      -- Read port #2
165
      pavr_rf_rd2_addr,
166
      pavr_rf_rd2_rd,
167
      pavr_rf_rd2_do,
168
 
169
      -- Write port
170
      pavr_rf_wr_addr,
171
      pavr_rf_wr_wr,
172
      pavr_rf_wr_di,
173
 
174
      -- Pointer registers
175
      pavr_rf_x,
176
      pavr_rf_x_wr,
177
      pavr_rf_x_di,
178
 
179
      pavr_rf_y,
180
      pavr_rf_y_wr,
181
      pavr_rf_y_di,
182
 
183
      pavr_rf_z,
184
      pavr_rf_z_wr,
185
      pavr_rf_z_di
186
   );
187
 
188
 
189
   generate_clock:
190
   process
191
   begin
192
      clk <= '1';
193
      wait for 50 ns;
194
      clk <= '0';
195
      wait for 50 ns;
196
   end process generate_clock;
197
 
198
 
199
   generate_reset:
200
   process
201
   begin
202
      res <= '0';
203
      wait for 100 ns;
204
      res <= '1';
205
      wait for 110 ns;
206
      res <= '0';
207
      wait for 1 ms;
208
   end process generate_reset;
209
 
210
 
211
   generate_sync_reset:
212
   process
213
   begin
214
      syncres <= '0';
215
      wait for 300 ns;
216
      syncres <= '1';
217
      wait for 110 ns;
218
      syncres <= '0';
219
      wait for 1 ms;
220
   end process generate_sync_reset;
221
 
222
 
223
   test_main:
224
   process(clk, res, syncres,
225
           cnt,
226
           pavr_rf_rd1_addr,
227
           pavr_rf_rd2_addr,
228
           pavr_rf_wr_addr, pavr_rf_wr_di,
229
           pavr_rf_x_di,
230
           pavr_rf_y_di,
231
           pavr_rf_z_di
232
          )
233
   begin
234
      if res='1' then
235
         -- Async reset
236
         -- The Register File should take care of reseting its registers. Check
237
         --    this too.
238
         cnt <= int_to_std_logic_vector(0, cnt'length);
239
      elsif clk'event and clk='1' then
240
         -- Clock counter
241
         cnt <= cnt+1;
242
 
243
         -- Initialize inputs.
244
         pavr_rf_rd1_addr  <= int_to_std_logic_vector(3, pavr_rf_rd1_addr'length);
245
         pavr_rf_rd1_rd    <= '0';
246
         pavr_rf_rd2_addr  <= int_to_std_logic_vector(4, pavr_rf_rd2_addr'length);
247
         pavr_rf_rd2_rd    <= '0';
248
         pavr_rf_wr_addr   <= int_to_std_logic_vector(5, pavr_rf_wr_addr'length);
249
         pavr_rf_wr_wr     <= '0';
250
         pavr_rf_wr_di     <= int_to_std_logic_vector(6, pavr_rf_wr_di'length);
251
 
252
         pavr_rf_x_wr   <= '0';
253
         pavr_rf_x_di   <= int_to_std_logic_vector(7, pavr_rf_x_di'length);
254
         pavr_rf_y_wr   <= '0';
255
         pavr_rf_y_di   <= int_to_std_logic_vector(8, pavr_rf_y_di'length);
256
         pavr_rf_z_wr   <= '0';
257
         pavr_rf_z_di   <= int_to_std_logic_vector(9, pavr_rf_z_di'length);
258
 
259
         case std_logic_vector_to_nat(cnt) is
260
 
261
            -- TEST 1
262
            -- Test RFWR, RFRD1 and RFRD1, one port at a time. Access RF registers
263
            --    others than pointer registers.
264
            -- RFWR
265
            when 5 =>
266
               pavr_rf_wr_addr   <= int_to_std_logic_vector(10, pavr_rf_wr_addr'length);
267
               pavr_rf_wr_wr     <= '1';
268
               pavr_rf_wr_di     <= int_to_std_logic_vector(50, pavr_rf_wr_di'length);
269
            -- RFWR
270
            when 6 =>
271
               pavr_rf_wr_addr   <= int_to_std_logic_vector(11, pavr_rf_wr_addr'length);
272
               pavr_rf_wr_wr     <= '1';
273
               pavr_rf_wr_di     <= int_to_std_logic_vector(51, pavr_rf_wr_di'length);
274
            -- RFRD1
275
            when 7 =>
276
               pavr_rf_rd1_addr  <= int_to_std_logic_vector(10, pavr_rf_rd1_addr'length);
277
               pavr_rf_rd1_rd    <= '1';
278
            -- RFRD2
279
            when 8 =>
280
               pavr_rf_rd2_addr  <= int_to_std_logic_vector(11, pavr_rf_rd2_addr'length);
281
               pavr_rf_rd2_rd    <= '1';
282
 
283
 
284
 
285
            -- TEST 2
286
            -- Test RFWR, RFRD1 and RFRD1, one port at a time. Access RF pointer
287
            --    registers.
288
            -- RFWR
289
            when 12 =>
290
               pavr_rf_wr_addr   <= int_to_std_logic_vector(26, pavr_rf_wr_addr'length);
291
               pavr_rf_wr_wr     <= '1';
292
               pavr_rf_wr_di     <= int_to_std_logic_vector(60, pavr_rf_wr_di'length);
293
            when 13 =>
294
               pavr_rf_wr_addr   <= int_to_std_logic_vector(27, pavr_rf_wr_addr'length);
295
               pavr_rf_wr_wr     <= '1';
296
               pavr_rf_wr_di     <= int_to_std_logic_vector(61, pavr_rf_wr_di'length);
297
            when 14 =>
298
               pavr_rf_wr_addr   <= int_to_std_logic_vector(28, pavr_rf_wr_addr'length);
299
               pavr_rf_wr_wr     <= '1';
300
               pavr_rf_wr_di     <= int_to_std_logic_vector(62, pavr_rf_wr_di'length);
301
            when 15 =>
302
               pavr_rf_wr_addr   <= int_to_std_logic_vector(29, pavr_rf_wr_addr'length);
303
               pavr_rf_wr_wr     <= '1';
304
               pavr_rf_wr_di     <= int_to_std_logic_vector(63, pavr_rf_wr_di'length);
305
            when 16 =>
306
               pavr_rf_wr_addr   <= int_to_std_logic_vector(30, pavr_rf_wr_addr'length);
307
               pavr_rf_wr_wr     <= '1';
308
               pavr_rf_wr_di     <= int_to_std_logic_vector(64, pavr_rf_wr_di'length);
309
            when 17 =>
310
               pavr_rf_wr_addr   <= int_to_std_logic_vector(31, pavr_rf_wr_addr'length);
311
               pavr_rf_wr_wr     <= '1';
312
               pavr_rf_wr_di     <= int_to_std_logic_vector(65, pavr_rf_wr_di'length);
313
            -- RFRD1
314
            when 18 =>
315
               pavr_rf_rd1_addr  <= int_to_std_logic_vector(26, pavr_rf_rd1_addr'length);
316
               pavr_rf_rd1_rd    <= '1';
317
            -- RFRD2
318
            when 19 =>
319
               pavr_rf_rd2_addr  <= int_to_std_logic_vector(27, pavr_rf_rd2_addr'length);
320
               pavr_rf_rd2_rd    <= '1';
321
            -- RFRD1
322
            when 20 =>
323
               pavr_rf_rd1_addr  <= int_to_std_logic_vector(28, pavr_rf_rd1_addr'length);
324
               pavr_rf_rd1_rd    <= '1';
325
            -- RFRD1
326
            when 21 =>
327
               pavr_rf_rd1_addr  <= int_to_std_logic_vector(29, pavr_rf_rd1_addr'length);
328
               pavr_rf_rd1_rd    <= '1';
329
            -- RFRD2
330
            when 22 =>
331
               pavr_rf_rd2_addr  <= int_to_std_logic_vector(30, pavr_rf_rd2_addr'length);
332
               pavr_rf_rd2_rd    <= '1';
333
            -- RFRD2
334
            when 23 =>
335
               pavr_rf_rd2_addr  <= int_to_std_logic_vector(31, pavr_rf_rd2_addr'length);
336
               pavr_rf_rd2_rd    <= '1';
337
 
338
 
339
 
340
            -- TEST 3
341
            -- Test RFWR, RFRD1 and RFRD1, combined accesses. Write RF registers
342
            --    others than pointer registers.
343
            -- Note: RFWR and RFRD1 access the same location.
344
            when 26 =>
345
               pavr_rf_wr_addr   <= int_to_std_logic_vector(10, pavr_rf_wr_addr'length);
346
               pavr_rf_wr_wr     <= '1';
347
               pavr_rf_wr_di     <= int_to_std_logic_vector(70, pavr_rf_wr_di'length);
348
               pavr_rf_rd1_addr  <= int_to_std_logic_vector(10, pavr_rf_rd1_addr'length);
349
               pavr_rf_rd1_rd    <= '1';
350
               pavr_rf_rd2_addr  <= int_to_std_logic_vector(11, pavr_rf_rd2_addr'length);
351
               pavr_rf_rd2_rd    <= '1';
352
 
353
 
354
 
355
            -- TEST 4
356
            -- Test RFWR, RFRD1 and RFRD1, combined accesses. Write RF pointer
357
            --    registers.
358
            -- Note: RFWR, RFRD1 and RFRD2 access the same location.
359
            when 29 =>
360
               pavr_rf_wr_addr   <= int_to_std_logic_vector(26, pavr_rf_wr_addr'length);
361
               pavr_rf_wr_wr     <= '1';
362
               pavr_rf_wr_di     <= int_to_std_logic_vector(80, pavr_rf_wr_di'length);
363
               pavr_rf_rd1_addr  <= int_to_std_logic_vector(26, pavr_rf_rd1_addr'length);
364
               pavr_rf_rd1_rd    <= '1';
365
               pavr_rf_rd2_addr  <= int_to_std_logic_vector(26, pavr_rf_rd2_addr'length);
366
               pavr_rf_rd2_rd    <= '1';
367
 
368
 
369
 
370
            -- TEST 5
371
            -- Test RFWR, RFRD1 and RFRD1, combined accesses. Write RF pointer
372
            --    registers.
373
            -- Note: RFWR, RFRD1 and RFRD2 each access a different location.
374
            -- RFWR
375
            when 32 =>
376
               pavr_rf_wr_addr   <= int_to_std_logic_vector(27, pavr_rf_wr_addr'length);
377
               pavr_rf_wr_wr     <= '1';
378
               pavr_rf_wr_di     <= int_to_std_logic_vector(90, pavr_rf_wr_di'length);
379
               pavr_rf_rd1_addr  <= int_to_std_logic_vector(28, pavr_rf_rd1_addr'length);
380
               pavr_rf_rd1_rd    <= '1';
381
               pavr_rf_rd2_addr  <= int_to_std_logic_vector(31, pavr_rf_rd2_addr'length);
382
               pavr_rf_rd2_rd    <= '1';
383
 
384
 
385
 
386
            -- TEST 6
387
            -- Test pointer register write ports.
388
            when 35 =>
389
               pavr_rf_x_wr   <= '1';
390
               pavr_rf_x_di   <= int_to_std_logic_vector(16#1111#, pavr_rf_x_di'length);
391
               pavr_rf_y_wr   <= '1';
392
               pavr_rf_y_di   <= int_to_std_logic_vector(16#2222#, pavr_rf_y_di'length);
393
               pavr_rf_z_wr   <= '1';
394
               pavr_rf_z_di   <= int_to_std_logic_vector(16#3333#, pavr_rf_z_di'length);
395
 
396
 
397
 
398
            -- TEST 7
399
            -- Test RFWR, RFRD1, RFRD2 and pointer register write ports, all at
400
            --    the same time. No writes compete for the same location.
401
            when 38 =>
402
               pavr_rf_wr_addr   <= int_to_std_logic_vector(10, pavr_rf_wr_addr'length);
403
               pavr_rf_wr_wr     <= '1';
404
               pavr_rf_wr_di     <= int_to_std_logic_vector(110, pavr_rf_wr_di'length);
405
               pavr_rf_rd1_addr  <= int_to_std_logic_vector(10, pavr_rf_rd1_addr'length);
406
               pavr_rf_rd1_rd    <= '1';
407
               pavr_rf_rd2_addr  <= int_to_std_logic_vector(11, pavr_rf_rd2_addr'length);
408
               pavr_rf_rd2_rd    <= '1';
409
               pavr_rf_x_wr   <= '1';
410
               pavr_rf_x_di   <= int_to_std_logic_vector(111, pavr_rf_x_di'length);
411
               pavr_rf_y_wr   <= '1';
412
               pavr_rf_y_di   <= int_to_std_logic_vector(112, pavr_rf_y_di'length);
413
               pavr_rf_z_wr   <= '1';
414
               pavr_rf_z_di   <= int_to_std_logic_vector(113, pavr_rf_z_di'length);
415
 
416
 
417
 
418
            -- TEST 8
419
            -- Test RFWR, RFRD1, RFRD2 and pointer register write ports, all at
420
            --    the same time. RFWR and RFZWR try to write the same location.
421
            --    RFZWR should win.
422
            when 41 =>
423
               pavr_rf_wr_addr   <= int_to_std_logic_vector(31, pavr_rf_wr_addr'length);
424
               pavr_rf_wr_wr     <= '1';
425
               pavr_rf_wr_di     <= int_to_std_logic_vector(120, pavr_rf_wr_di'length);
426
               pavr_rf_rd1_addr  <= int_to_std_logic_vector(30, pavr_rf_rd1_addr'length);
427
               pavr_rf_rd1_rd    <= '1';
428
               pavr_rf_rd2_addr  <= int_to_std_logic_vector(31, pavr_rf_rd2_addr'length);
429
               pavr_rf_rd2_rd    <= '1';
430
               pavr_rf_x_wr   <= '1';
431
               pavr_rf_x_di   <= int_to_std_logic_vector(121, pavr_rf_x_di'length);
432
               pavr_rf_y_wr   <= '1';
433
               pavr_rf_y_di   <= int_to_std_logic_vector(122, pavr_rf_y_di'length);
434
               pavr_rf_z_wr   <= '1';
435
               pavr_rf_z_di   <= int_to_std_logic_vector(123, pavr_rf_z_di'length);
436
 
437
 
438
 
439
            when others =>
440
               null;
441
         end case;
442
 
443
         if syncres='1' then
444
            -- Sync reset
445
            -- The Register File should take care of reseting its registers. Check
446
            --    this too.
447
            cnt <= int_to_std_logic_vector(0, cnt'length);
448
         end if;
449
      end if;
450
   end process test_main;
451
 
452
 
453
end;
454
-- </File body>

powered by: WebSVN 2.1.0

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