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

Subversion Repositories altor32

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

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

powered by: WebSVN 2.1.0

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