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

Subversion Repositories altor32

[/] [altor32/] [trunk/] [rtl/] [cpu/] [altor32_icache.v] - Blame information for rev 32

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

Line No. Rev Author Line
1 27 ultra_embe
//-----------------------------------------------------------------
2
//                           AltOR32 
3
//                Alternative Lightweight OpenRisc 
4
//                            V2.0
5
//                     Ultra-Embedded.com
6
//                   Copyright 2011 - 2013
7
//
8
//               Email: admin@ultra-embedded.com
9
//
10
//                       License: LGPL
11
//-----------------------------------------------------------------
12
//
13
// Copyright (C) 2011 - 2013 Ultra-Embedded.com
14
//
15
// This source file may be used and distributed without         
16
// restriction provided that this copyright statement is not    
17
// removed from the file and that any derivative work contains  
18
// the original copyright notice and the associated disclaimer. 
19
//
20
// This source file is free software; you can redistribute it   
21
// and/or modify it under the terms of the GNU Lesser General   
22
// Public License as published by the Free Software Foundation; 
23
// either version 2.1 of the License, or (at your option) any   
24
// later version.
25
//
26
// This source is distributed in the hope that it will be       
27
// useful, but WITHOUT ANY WARRANTY; without even the implied   
28
// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      
29
// PURPOSE.  See the GNU Lesser General Public License for more 
30
// details.
31
//
32
// You should have received a copy of the GNU Lesser General    
33
// Public License along with this source; if not, write to the 
34
// Free Software Foundation, Inc., 59 Temple Place, Suite 330, 
35
// Boston, MA  02111-1307  USA
36
//-----------------------------------------------------------------
37
 
38
//-----------------------------------------------------------------
39
// Includes
40
//-----------------------------------------------------------------
41
`include "altor32_defs.v"
42
 
43
//-----------------------------------------------------------------
44
// Module - Instruction Cache
45
//-----------------------------------------------------------------
46 32 ultra_embe
module altor32_icache
47 27 ultra_embe
(
48
    input                       clk_i /*verilator public*/,
49
    input                       rst_i /*verilator public*/,
50
 
51
    // Processor interface
52
    input                       rd_i /*verilator public*/,
53
    input [31:0]                pc_i /*verilator public*/,
54
    output [31:0]               instruction_o /*verilator public*/,
55
    output                      valid_o /*verilator public*/,
56
    input                       invalidate_i /*verilator public*/,
57
 
58
    // Status
59
    output                      miss_o /*verilator public*/,
60
    output                      busy_o /*verilator public*/,
61
 
62 32 ultra_embe
    // Memory interface
63
    output reg [31:0]           wbm_addr_o /*verilator public*/,
64
    input [31:0]                wbm_dat_i /*verilator public*/,
65
    output reg [2:0]            wbm_cti_o /*verilator public*/,
66
    output reg                  wbm_cyc_o /*verilator public*/,
67
    output reg                  wbm_stb_o /*verilator public*/,
68
    input                       wbm_stall_i/*verilator public*/,
69
    input                       wbm_ack_i/*verilator public*/
70 27 ultra_embe
);
71
 
72
//-----------------------------------------------------------------
73
// Params
74
//-----------------------------------------------------------------
75
parameter BOOT_VECTOR               = 32'h00000000;
76
 
77
parameter CACHE_LINE_SIZE_WIDTH     = 5; /* 5-bits -> 32 entries */
78
parameter CACHE_LINE_SIZE_BYTES     = 2 ** CACHE_LINE_SIZE_WIDTH; /* 32 bytes / 4 words per line */
79
parameter CACHE_LINE_ADDR_WIDTH     = 8; /* 256 lines */
80
parameter CACHE_LINE_WORDS_IDX_MAX  = CACHE_LINE_SIZE_WIDTH - 2; /* 3-bit = 111 */
81
parameter CACHE_TAG_ENTRIES         = 2 ** CACHE_LINE_ADDR_WIDTH ; /* 256 tag entries */
82
parameter CACHE_DSIZE               = CACHE_LINE_ADDR_WIDTH * CACHE_LINE_SIZE_BYTES; /* 8KB data */
83
parameter CACHE_DWIDTH              = CACHE_LINE_ADDR_WIDTH + CACHE_LINE_SIZE_WIDTH - 2; /* 10-bits */
84
 
85
parameter CACHE_TAG_WIDTH           = 16; /* 16-bit tag entry size */
86
parameter CACHE_TAG_LINE_ADDR_WIDTH = CACHE_TAG_WIDTH - 1; /* 15 bits of data (tag entry size minus valid bit) */
87
 
88
parameter CACHE_TAG_ADDR_LOW        = CACHE_LINE_SIZE_WIDTH + CACHE_LINE_ADDR_WIDTH;
89
parameter CACHE_TAG_ADDR_HIGH       = CACHE_TAG_LINE_ADDR_WIDTH + CACHE_LINE_SIZE_WIDTH + CACHE_LINE_ADDR_WIDTH - 1;
90
 
91
// Tag fields
92
parameter CACHE_TAG_VALID_BIT       = 15;
93
 
94
//  31          16 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
95
// |--------------|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
96
//  +--------------------+  +-------------------+   +-----------+      
97
//    Tag entry                     Line address         Address 
98
//       (15-bits)                    (8-bits)           within line 
99
//                                                       (5-bits)
100
 
101
//-----------------------------------------------------------------
102
// Registers / Wires
103
//-----------------------------------------------------------------
104 32 ultra_embe
 
105
// Tag read / write data
106 27 ultra_embe
wire [CACHE_TAG_WIDTH-1:0]      tag_data_out;
107
reg  [CACHE_TAG_WIDTH-1:0]      tag_data_in;
108
reg                             tag_wr;
109
 
110 32 ultra_embe
// Tag address
111 27 ultra_embe
wire [CACHE_LINE_ADDR_WIDTH-1:0] tag_entry;
112 32 ultra_embe
 
113
// Data memory read / write
114 27 ultra_embe
wire [CACHE_DWIDTH-1:0]         cache_address_rd;
115
reg [CACHE_DWIDTH-1:0]          cache_address_wr;
116 32 ultra_embe
reg [31:0]                      cache_data_in;
117 27 ultra_embe
reg                             cache_wr;
118
 
119 32 ultra_embe
// Word currently being fetched within a line
120
reg [CACHE_LINE_SIZE_WIDTH-3:0] mem_fetch_word;
121
reg [CACHE_LINE_SIZE_WIDTH-3:0] mem_resp_idx;
122 27 ultra_embe
 
123 32 ultra_embe
// Current / Miss PC
124 27 ultra_embe
reg [31:0]                      last_pc;
125
reg [31:0]                      miss_pc;
126
 
127 32 ultra_embe
// Flush state
128 27 ultra_embe
reg                             flush_req;
129
reg [CACHE_LINE_ADDR_WIDTH-1:0] flush_addr;
130
reg                             flush_wr;
131
 
132 32 ultra_embe
// Other state
133
reg                             initial_fetch;
134 27 ultra_embe
reg                             read_while_busy;
135
 
136
// Current state
137
parameter STATE_CHECK       = 0;
138
parameter STATE_FETCH       = 1;
139
parameter STATE_WAIT        = 2;
140
parameter STATE_WAIT2       = 3;
141
parameter STATE_FLUSH       = 4;
142 32 ultra_embe
reg [3:0]                   state;
143 27 ultra_embe
 
144 32 ultra_embe
// Tag address from input PC or flopped version of it
145
assign tag_entry        = (state != STATE_CHECK) ?
146
                          miss_pc[CACHE_LINE_ADDR_WIDTH + CACHE_LINE_SIZE_WIDTH - 1:CACHE_LINE_SIZE_WIDTH] :
147
                          pc_i[CACHE_LINE_ADDR_WIDTH + CACHE_LINE_SIZE_WIDTH - 1:CACHE_LINE_SIZE_WIDTH];
148 27 ultra_embe
 
149 32 ultra_embe
// Cache read address
150
assign cache_address_rd   = pc_i[CACHE_LINE_ADDR_WIDTH + CACHE_LINE_SIZE_WIDTH - 1:2];
151 27 ultra_embe
 
152 32 ultra_embe
// Cache miss output if requested PC is not in the tag memory
153
assign miss_o             = (!tag_data_out[CACHE_TAG_VALID_BIT] ||
154
                            (last_pc[CACHE_TAG_ADDR_HIGH:CACHE_TAG_ADDR_LOW] != tag_data_out[14:0])) ? 1'b1: 1'b0;
155
 
156
// Cache output valid
157 30 ultra_embe
assign valid_o            = !miss_o && !busy_o;
158 27 ultra_embe
 
159 32 ultra_embe
// Stall the CPU if cache state machine is not idle!
160
assign busy_o             = (state == STATE_CHECK & ~read_while_busy) ? 1'b0 : 1'b1;
161
 
162
// Final word to fetch from memory
163
wire mem_fetch_final_word = (mem_fetch_word == {CACHE_LINE_WORDS_IDX_MAX{1'b1}});
164
 
165
// Flushing: Last line to flush
166
wire flush_final_line     = (flush_addr == {CACHE_LINE_ADDR_WIDTH{1'b0}});
167
 
168
// Is this a cache miss?
169
wire cache_miss           = (miss_o &&               // Tag lookup failed
170
                            !initial_fetch &&        // NOT initial fetch after reset
171
                            !rd_i &&                 // NOT new read request cycle
172
                            !read_while_busy &&      // NOT pending read whilst busy
173
                            !flush_req &&            // NOT flush request
174
                            !invalidate_i);
175
 
176 27 ultra_embe
//-----------------------------------------------------------------
177 32 ultra_embe
// Next State Logic
178 27 ultra_embe
//-----------------------------------------------------------------
179 32 ultra_embe
reg [3:0] next_state_r;
180
always @ *
181
begin
182
    next_state_r = state;
183 27 ultra_embe
 
184 32 ultra_embe
    case (state)
185
 
186
    //-----------------------------------------
187
    // CHECK - check cache for hit or miss
188
    //-----------------------------------------
189
    STATE_CHECK :
190
    begin
191
        // Cache flush request pending?
192
        if (flush_req || invalidate_i)
193
            next_state_r    = STATE_FLUSH;
194
        // Cache miss (& new read request not pending)
195
        else if (cache_miss)
196
            next_state_r    = STATE_FETCH;
197
        // Cache hit (or new read request)
198
        else
199
            next_state_r    = STATE_CHECK;
200
    end
201
    //-----------------------------------------
202
    // FETCH - Fetch row from memory
203
    //-----------------------------------------
204
    STATE_FETCH :
205
    begin
206
        // Line fetch complete?
207
        if (mem_resp_idx == {CACHE_LINE_SIZE_WIDTH-2{1'b1}} && wbm_ack_i)
208
           next_state_r = STATE_WAIT;
209
    end
210
    //-----------------------------------------
211
    // FLUSH - Invalidate tag memory
212
    //-----------------------------------------
213
    STATE_FLUSH :
214
    begin
215
        if (flush_final_line)
216
            next_state_r = STATE_FETCH;
217
        else
218
            next_state_r = STATE_FLUSH;
219
    end
220
    //-----------------------------------------
221
    // WAIT - Wait cycle
222
    //-----------------------------------------
223
    STATE_WAIT :
224
        // Allow extra wait state to handle write & read collision    
225
        next_state_r = STATE_WAIT2;
226
    //-----------------------------------------
227
    // WAIT2 - Wait cycle
228
    //-----------------------------------------
229
    STATE_WAIT2 :
230
        next_state_r = STATE_CHECK;
231
    default:
232
        ;
233
   endcase
234
end
235
 
236
// Update state
237 27 ultra_embe
always @ (posedge rst_i or posedge clk_i )
238
begin
239
   if (rst_i == 1'b1)
240 32 ultra_embe
        state   <= STATE_CHECK;
241
   else
242
        state   <= next_state_r;
243
end
244
 
245
 
246
//-----------------------------------------------------------------
247
// Check for cache misses
248
//-----------------------------------------------------------------
249
always @ (posedge rst_i or posedge clk_i )
250
begin
251
   if (rst_i == 1'b1)
252 27 ultra_embe
   begin
253
        miss_pc         <= BOOT_VECTOR + `VECTOR_RESET;
254 32 ultra_embe
        last_pc         <= 32'h00000000;
255 27 ultra_embe
        initial_fetch   <= 1'b1;
256
        read_while_busy <= 1'b0;
257 32 ultra_embe
   end
258
   else
259
   begin
260
        initial_fetch   <= 1'b0;
261
        last_pc         <= pc_i;
262 27 ultra_embe
 
263 32 ultra_embe
        // New request whilst cache busy?
264
        if (rd_i)
265
            read_while_busy <= 1'b1;
266
 
267
        case (state)
268
 
269
        //-----------------------------------------
270
        // CHECK - check cache for hit or miss
271
        //-----------------------------------------
272
        STATE_CHECK :
273
        begin
274
            // Cache miss (& new read request not pending)
275
            if (cache_miss)
276
            begin
277
                read_while_busy <= 1'b0;
278
 
279
`ifdef CONF_CORE_DEBUG
280
                $display("Fetch: Cache miss at 0x%x (last=%x, current=%x)", miss_pc, last_pc, pc_i);
281
`endif
282
            end
283
            // Cache hit (or new read request)
284
            else
285
            begin
286
`ifdef CONF_CORE_DEBUG
287
                $display("Fetch: Cache hit at PC=%x (current=%x)", last_pc, pc_i);
288
                if (read_while_busy)
289
                    $display("Fetch: Read request whilst busy PC=%x (current=%x)", last_pc, pc_i);
290
`endif
291
                // Store fetch PC
292
                miss_pc     <= pc_i;
293
                read_while_busy <= 1'b0;
294
            end
295
        end
296
        //-----------------------------------------
297
        // FLUSH - Invalidate tag memory
298
        //-----------------------------------------
299
        STATE_FLUSH :
300
        begin
301
            // Last line, clear pending reads whilst busy
302
            if (flush_final_line)
303
                read_while_busy <= 1'b0;
304
        end
305
        default:
306
            ;
307
       endcase
308
   end
309
end
310
 
311
//-----------------------------------------------------------------
312
// Cache Tag Write
313
//-----------------------------------------------------------------
314
always @ (posedge rst_i or posedge clk_i )
315
begin
316
   if (rst_i == 1'b1)
317
   begin
318
        tag_data_in     <= {CACHE_TAG_WIDTH{1'b0}};
319
        tag_wr          <= 1'b0;
320
   end
321
   else
322
   begin
323
        tag_wr          <= 1'b0;
324
 
325
        case (state)
326
 
327
        //-----------------------------------------
328
        // CHECK - check cache for hit or miss
329
        //-----------------------------------------
330
        STATE_CHECK :
331
        begin
332
            // Cache miss (& new read request not pending)
333
            if (cache_miss)
334
            begin
335
                // Update tag memory with this line's details   
336
                tag_data_in <= {1'b1, miss_pc[CACHE_TAG_ADDR_HIGH:CACHE_TAG_ADDR_LOW]};
337
                tag_wr      <= 1'b1;
338
            end
339
        end
340
        //-----------------------------------------
341
        // FLUSH - Invalidate tag memory
342
        //-----------------------------------------
343
        STATE_FLUSH :
344
        begin
345
            if (flush_final_line)
346
            begin
347
                // Update tag memory with this line's details   
348
                tag_data_in <= {1'b1, pc_i[CACHE_TAG_ADDR_HIGH:CACHE_TAG_ADDR_LOW]};
349
                tag_wr      <= 1'b1;
350
            end
351
        end
352
        default:
353
            ;
354
       endcase
355
   end
356
end
357
 
358
//-----------------------------------------------------------------
359
// Cache Data Write
360
//-----------------------------------------------------------------
361
always @ (posedge rst_i or posedge clk_i )
362
begin
363
   if (rst_i == 1'b1)
364
   begin
365
        cache_address_wr<= {CACHE_DWIDTH{1'b0}};
366
        cache_data_in    <= 32'h00000000;
367
        cache_wr        <= 1'b0;
368
   end
369
   else
370
   begin
371
        cache_wr        <= 1'b0;
372
 
373
        // FETCH - Fetch row from memory
374
        if (state == STATE_FETCH)
375
        begin
376
            // Data ready from memory?
377
            if (wbm_ack_i)
378
            begin
379
                // Write data into cache
380
                cache_address_wr <= {miss_pc[CACHE_LINE_ADDR_WIDTH + CACHE_LINE_SIZE_WIDTH - 1:CACHE_LINE_SIZE_WIDTH], mem_resp_idx};
381
                cache_data_in    <= wbm_dat_i;
382
                cache_wr         <= 1'b1;
383
            end
384
        end
385
   end
386
end
387
 
388
//-----------------------------------------------------------------
389
// Flush Logic
390
//-----------------------------------------------------------------
391
always @ (posedge rst_i or posedge clk_i )
392
begin
393
   if (rst_i == 1'b1)
394
   begin
395 27 ultra_embe
        flush_addr      <= {CACHE_LINE_ADDR_WIDTH{1'b0}};
396
        flush_wr        <= 1'b0;
397
        flush_req       <= 1'b0;
398
   end
399
   else
400
   begin
401
        flush_wr        <= 1'b0;
402
 
403
        // Latch invalidate request even if can't be actioned now...
404
        if (invalidate_i)
405
            flush_req <= 1'b1;
406
 
407
        case (state)
408
 
409 32 ultra_embe
        //-----------------------------------------
410
        // CHECK - check cache for hit or miss
411
        //-----------------------------------------
412
        STATE_CHECK :
413
        begin
414
            // Cache flush request pending?
415
            if (flush_req || invalidate_i)
416 27 ultra_embe
            begin
417 32 ultra_embe
                flush_req       <= 1'b0;
418
                flush_addr      <= {CACHE_LINE_ADDR_WIDTH{1'b1}};
419
                flush_wr        <= 1'b1;
420 27 ultra_embe
 
421
`ifdef CONF_CORE_DEBUG
422 32 ultra_embe
                $display("Fetch: Cache flush request");
423
`endif
424
            end
425
        end
426
        //-----------------------------------------
427
        // FLUSH - Invalidate tag memory
428
        //-----------------------------------------
429
        STATE_FLUSH :
430
        begin
431
            if (~flush_final_line)
432
            begin
433
                flush_addr  <= flush_addr - 1;
434
                flush_wr    <= 1'b1;
435
            end
436
        end
437
        default:
438
            ;
439
       endcase
440
   end
441
end
442 27 ultra_embe
 
443 32 ultra_embe
//-----------------------------------------------------------------
444
// External Mem Access
445
//-----------------------------------------------------------------
446 27 ultra_embe
 
447 32 ultra_embe
// Next fetch address
448
wire [CACHE_LINE_SIZE_WIDTH-3:0] mem_next_word = mem_fetch_word + 1;
449 27 ultra_embe
 
450 32 ultra_embe
// Last word to fetch
451
wire mem_resp_idx_word = (mem_fetch_word == ({CACHE_LINE_WORDS_IDX_MAX{1'b1}}-1));
452
 
453
always @ (posedge rst_i or posedge clk_i )
454
begin
455
   if (rst_i == 1'b1)
456
   begin
457
        wbm_addr_o      <= 32'h00000000;
458
        wbm_cti_o       <= 3'b0;
459
        wbm_stb_o       <= 1'b0;
460
 
461
        mem_fetch_word  <= {CACHE_LINE_SIZE_WIDTH-2{1'b0}};
462
   end
463
   else
464
   begin
465
        if (~wbm_stall_i)
466
            wbm_stb_o   <= 1'b0;
467
 
468
        case (state)
469
 
470
        //-----------------------------------------
471
        // CHECK - check cache for hit or miss
472
        //-----------------------------------------
473
        STATE_CHECK :
474
        begin
475
            // Cache miss (& new read request not pending)
476
            if (cache_miss)
477 27 ultra_embe
            begin
478 32 ultra_embe
                // Start fetch from memory
479
                wbm_addr_o      <= {miss_pc[31:CACHE_LINE_SIZE_WIDTH], {CACHE_LINE_SIZE_WIDTH{1'b0}}};
480 27 ultra_embe
 
481 32 ultra_embe
                // Incrementing linear burst
482
                wbm_cti_o       <= 3'b010;
483
 
484
                // Start of cycle
485
                wbm_stb_o       <= 1'b1;
486
 
487
                mem_fetch_word  <= {CACHE_LINE_SIZE_WIDTH-2{1'b0}};
488 27 ultra_embe
            end
489 32 ultra_embe
        end
490
        //-----------------------------------------
491
        // FETCH - Fetch row from memory
492
        //-----------------------------------------
493
        STATE_FETCH :
494
        begin
495
            // Command accepted
496
            if (~wbm_stall_i)
497
            begin
498
                // Fetch next word for line
499
                if (!mem_fetch_final_word)
500 27 ultra_embe
                begin
501 32 ultra_embe
                    wbm_addr_o      <= {wbm_addr_o[31:CACHE_LINE_SIZE_WIDTH], mem_next_word, 2'b00};
502
 
503
                    // Final word to read?
504
                    if (mem_resp_idx_word)
505
                        wbm_cti_o       <= 3'b111;
506 27 ultra_embe
 
507 32 ultra_embe
                    mem_fetch_word  <= mem_next_word;
508 27 ultra_embe
 
509 32 ultra_embe
                    // Still fetching...
510
                    wbm_stb_o       <= 1'b1;
511
                end
512
            end
513
        end
514
        //-----------------------------------------
515
        // FLUSH - Invalidate tag memory
516
        //-----------------------------------------
517
        STATE_FLUSH :
518
        begin
519
            // Fetch current PC line again
520
            if (flush_final_line)
521
            begin
522
                wbm_addr_o      <= {pc_i[31:CACHE_LINE_SIZE_WIDTH], {CACHE_LINE_SIZE_WIDTH{1'b0}}};
523
 
524
                // Incrementing linear burst
525
                wbm_cti_o       <= 3'b010;
526
 
527
                // Start of cycle
528
                wbm_stb_o       <= 1'b1;
529
 
530
                // Start of line
531
                mem_fetch_word  <= {CACHE_LINE_SIZE_WIDTH-2{1'b0}};
532
            end
533
        end
534
        default:
535
            ;
536
       endcase
537 27 ultra_embe
   end
538
end
539
 
540 32 ultra_embe
//-----------------------------------------------------------------
541
// CYC_O
542
//-----------------------------------------------------------------
543
always @ (posedge rst_i or posedge clk_i )
544
begin
545
   if (rst_i == 1'b1)
546
        wbm_cyc_o   <= 1'b0;
547
   else
548
   begin
549
        case (state)
550 27 ultra_embe
 
551 32 ultra_embe
        //-----------------------------------------
552
        // CHECK - check cache for hit or miss
553
        //-----------------------------------------
554
        STATE_CHECK :
555
        begin
556
            // Cache miss (& new read request not pending)
557
            if (cache_miss)
558
                wbm_cyc_o       <= 1'b1;
559
        end
560
        //-----------------------------------------
561
        // FLUSH - Invalidate tag memory
562
        //-----------------------------------------
563
        STATE_FLUSH :
564
        begin
565
            // Fetch current PC line again
566
            if (flush_final_line)
567
                wbm_cyc_o       <= 1'b1;
568
        end
569
        //-----------------------------------------
570
        // FETCH - Fetch row from memory
571
        //-----------------------------------------
572
        STATE_FETCH :
573
        begin
574
            // Last response?
575
            if (wbm_ack_i && (mem_resp_idx == {CACHE_LINE_SIZE_WIDTH-2{1'b1}}))
576
                wbm_cyc_o   <= 1'b0;
577
        end
578
        default:
579
            ;
580
       endcase
581
   end
582
end
583
 
584 27 ultra_embe
//-----------------------------------------------------------------
585 32 ultra_embe
// Memory response counter
586 27 ultra_embe
//-----------------------------------------------------------------
587 32 ultra_embe
always @ (posedge rst_i or posedge clk_i )
588
begin
589
   if (rst_i == 1'b1)
590
        mem_resp_idx  <= {CACHE_LINE_SIZE_WIDTH-2{1'b0}};
591
   else
592
   begin
593
        case (state)
594
 
595
        //-----------------------------------------
596
        // CHECK - check cache for hit or miss
597
        //-----------------------------------------
598
        STATE_CHECK :
599
        begin
600
            // Cache miss (& new read request not pending)
601
            if (cache_miss)
602
                mem_resp_idx  <= {CACHE_LINE_SIZE_WIDTH-2{1'b0}};
603
        end
604
        //-----------------------------------------
605
        // FLUSH - Invalidate tag memory
606
        //-----------------------------------------
607
        STATE_FLUSH :
608
        begin
609
            // Fetch current PC line again
610
            if (flush_final_line)
611
                mem_resp_idx  <= {CACHE_LINE_SIZE_WIDTH-2{1'b0}};
612
        end
613
        //-----------------------------------------
614
        // FETCH - Fetch row from memory
615
        //-----------------------------------------
616
        STATE_FETCH :
617
        begin
618
            // Response
619
            if (wbm_ack_i)
620
                mem_resp_idx <= mem_resp_idx + 1;
621
        end
622
        default:
623
            ;
624
       endcase
625
   end
626
end
627
 
628
//-----------------------------------------------------------------
629
// Tag memory
630
//-----------------------------------------------------------------
631 27 ultra_embe
altor32_ram_dp
632
#(
633
    .WIDTH(CACHE_TAG_WIDTH),
634
    .SIZE(CACHE_LINE_ADDR_WIDTH)
635
)
636
u1_tag_mem
637
(
638 32 ultra_embe
    // Tag read/write port
639 27 ultra_embe
    .aclk_i(clk_i),
640
    .adat_o(tag_data_out),
641
    .adat_i(tag_data_in),
642
    .aadr_i(tag_entry),
643
    .awr_i(tag_wr),
644
 
645 32 ultra_embe
    // Tag invalidate port
646 27 ultra_embe
    .bclk_i(clk_i),
647
    .badr_i(flush_addr),
648
    .bdat_o(/*open*/),
649
    .bdat_i({CACHE_TAG_WIDTH{1'b0}}),
650
    .bwr_i(flush_wr)
651
);
652 32 ultra_embe
 
653
//-----------------------------------------------------------------
654 27 ultra_embe
// Data memory
655 32 ultra_embe
//-----------------------------------------------------------------
656 27 ultra_embe
altor32_ram_dp
657
#(
658
    .WIDTH(32),
659
    .SIZE(CACHE_DWIDTH)
660
)
661
u2_data_mem
662
(
663 32 ultra_embe
    // Data read port
664 27 ultra_embe
    .aclk_i(clk_i),
665
    .aadr_i(cache_address_rd),
666
    .adat_o(instruction_o),
667
    .adat_i(32'h00),
668
    .awr_i(1'b0),
669
 
670 32 ultra_embe
    // Data write port
671 27 ultra_embe
    .bclk_i(clk_i),
672
    .badr_i(cache_address_wr),
673
    .bdat_o(/*open*/),
674 32 ultra_embe
    .bdat_i(cache_data_in),
675 27 ultra_embe
    .bwr_i(cache_wr)
676
);
677
 
678
endmodule
679
 

powered by: WebSVN 2.1.0

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