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

Subversion Repositories ao486

[/] [ao486/] [trunk/] [rtl/] [ao486/] [memory/] [icache.v] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 alfik
/*
2
 * Copyright (c) 2014, Aleksander Osman
3
 * All rights reserved.
4
 *
5
 * Redistribution and use in source and binary forms, with or without
6
 * modification, are permitted provided that the following conditions are met:
7
 *
8
 * * Redistributions of source code must retain the above copyright notice, this
9
 *   list of conditions and the following disclaimer.
10
 *
11
 * * Redistributions in binary form must reproduce the above copyright notice,
12
 *   this list of conditions and the following disclaimer in the documentation
13
 *   and/or other materials provided with the distribution.
14
 *
15
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18
 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
19
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
21
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
22
 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
23
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25
 */
26
 
27
`include "defines.v"
28
 
29
//PARSED_COMMENTS: this file contains parsed script comments
30
 
31
module icache(
32
    input           clk,
33
    input           rst_n,
34
 
35
    //RESP:
36
    input           pr_reset,
37
    //END
38
 
39
    //RESP:
40
    input           icacheread_do,
41
    input   [31:0]  icacheread_address,
42
    input   [4:0]   icacheread_length, // takes into account: page size and cs segment limit
43
    input           icacheread_cache_disable,
44
    //END
45
 
46
    //REQ:
47
    output              readcode_do,
48
    input               readcode_done,
49
 
50
    output      [31:0]  readcode_address,
51
    input       [127:0] readcode_line,
52
    input       [31:0]  readcode_partial,
53
    input               readcode_partial_done,
54
    //END
55
 
56
    //REQ:
57
    output              dcachetoicache_accept_do,
58
    input [31:0]        dcachetoicache_accept_address,
59
    input               dcachetoicache_accept_empty,
60
    //END
61
 
62
    //REQ:
63
    output              prefetchfifo_write_do,
64
    output  [135:0]     prefetchfifo_write_data,
65
    //END
66
 
67
    //REQ:
68
    output              prefetched_do,
69
    output [4:0]        prefetched_length,
70
    //END
71
 
72
    //RESP:
73
    input               invdcode_do,
74
    output              invdcode_done
75
    //END
76
);
77
 
78
//------------------------------------------------------------------------------
79
 
80
//------------------------------------------------------------------------------
81
 
82
reg [1:0]   state;
83
reg [31:0]  address;
84
reg [4:0]   length;
85
reg         cache_disable;
86
reg [11:0]  partial_length;
87
reg         reset_waiting;
88
 
89
//------------------------------------------------------------------------------
90
 
91
wire [4:0] partial_length_current;
92
 
93
//------------------------------------------------------------------------------
94
 
95
localparam [1:0] STATE_IDLE             = 2'd0;
96
localparam [1:0] STATE_INVALIDATE_WRITE = 2'd1;
97
localparam [1:0] STATE_CHECK            = 2'd2;
98
localparam [1:0] STATE_READ             = 2'd3;
99
 
100
//------------------------------------------------------------------------------
101
 
102
//MIN(partial_length, length_saved)
103
assign partial_length_current =
104
    ({ 2'b0, partial_length[2:0] } > length)? length : { 2'b0, partial_length[2:0] };
105
 
106
 
107
//------------------------------------------------------------------------------
108
 
109
always @(posedge clk or negedge rst_n) begin
110
    if(rst_n == 1'b0)                           reset_waiting <= `FALSE;
111
    else if(pr_reset && state != STATE_IDLE)    reset_waiting <= `TRUE;
112
    else if(state == STATE_IDLE)                reset_waiting <= `FALSE;
113
end
114
 
115
//------------------------------------------------------------------------------
116
 
117
wire [127:0] matched_data_line;
118
wire [6:0]   control_after_invalidate_write;
119
wire [6:0]   control_after_match;
120
wire [6:0]   control_after_line_read;
121
wire         matched;
122
wire [1:0]   plru_index;
123
 
124
//------------------------------------------------------------------------------
125
 
126
wire [11:0]     length_burst;
127
wire [11:0]     length_line;
128
wire [135:0]    prefetch_line;
129
wire [135:0]    prefetch_partial;
130
 
131
//------------------------------------------------------------------------------
132
 
133
wire        control_ram_read_do;
134
wire [31:0] control_ram_address;
135
wire        control_ram_write_do;
136
wire [6:0]  control_ram_data;
137
wire [6:0]  control_ram_q;
138
 
139
wire            data_ram0_read_do;
140
wire [31:0]     data_ram0_address;
141
wire            data_ram0_write_do;
142
wire [127:0]    data_ram0_data;
143
wire [147:0]    data_ram0_q;
144
 
145
wire            data_ram1_read_do;
146
wire [31:0]     data_ram1_address;
147
wire            data_ram1_write_do;
148
wire [127:0]    data_ram1_data;
149
wire [147:0]    data_ram1_q;
150
 
151
wire            data_ram2_read_do;
152
wire [31:0]     data_ram2_address;
153
wire            data_ram2_write_do;
154
wire [127:0]    data_ram2_data;
155
wire [147:0]    data_ram2_q;
156
 
157
wire            data_ram3_read_do;
158
wire [31:0]     data_ram3_address;
159
wire            data_ram3_write_do;
160
wire [127:0]    data_ram3_data;
161
wire [147:0]    data_ram3_q;
162
 
163
//------------------------------------------------------------------------------
164
 
165
//------------------------------------------------------------------------------
166
 
167
icache_matched icache_matched_inst(
168
 
169
    .address    (address),      //input [31:0]
170
 
171
    .control    (control_ram_q),    //input [6:0]
172
 
173
    .data_0     (data_ram0_q),      //input [147:0]
174
    .data_1     (data_ram1_q),      //input [147:0]
175
    .data_2     (data_ram2_q),      //input [147:0]
176
    .data_3     (data_ram3_q),      //input [147:0]
177
 
178
    .matched                            (matched),              //output
179
    .matched_data_line                  (matched_data_line),    //output [127:0]
180
 
181
    .plru_index                         (plru_index),           //output [1:0]
182
 
183
    .control_after_invalidate_write     (control_after_invalidate_write),   //output [6:0]
184
    .control_after_match                (control_after_match),              //output [6:0]
185
    .control_after_line_read            (control_after_line_read)           //output [6:0]
186
);
187
 
188
 
189
 
190
icache_read icache_read_inst(
191
 
192
    .line           (matched_data_line),        //input [127:0]
193
    .read_data      (readcode_partial),         //input [31:0]
194
    .read_length    (partial_length[2:0]),      //input [2:0]
195
 
196
    .address    ((state == STATE_IDLE)? icacheread_address : address),  //input [31:0]
197
    .length     ((state == STATE_IDLE)? icacheread_length : length),    //input [4:0]
198
 
199
    .length_burst   (length_burst),     //output [11:0]
200
    .length_line    (length_line),      //output [11:0]
201
 
202
    .prefetch_line      (prefetch_line),    //output [135:0]
203
    .prefetch_partial   (prefetch_partial)  //output [135:0]
204
);
205
 
206
icache_control_ram icache_control_ram_inst(
207
    .clk        (clk),
208
    .rst_n      (rst_n),
209
 
210
    .address        (control_ram_address),  //input [31:0]
211
 
212
    //RESP:
213
    .read_do        (control_ram_read_do),      //input
214
    .q              (control_ram_q),            //output [6:0]
215
    //END
216
 
217
    //RESP:
218
    .write_do       (control_ram_write_do),     //input
219
    .data           (control_ram_data),         //input [6:0]  
220
    //END
221
 
222
    //RESP:
223
    .invdcode_do    (invdcode_do && state == STATE_IDLE),       //input
224
    .invdcode_done  (invdcode_done)                             //output
225
    //END
226
);
227
 
228
cache_data_ram cache_data_ram0_inst(
229
    .clk        (clk),
230
    .rst_n      (rst_n),
231
 
232
    .address        (data_ram0_address),        //input [31:0]
233
 
234
    //RESP:
235
    .read_do        (data_ram0_read_do),        //input
236
    .q              (data_ram0_q),              //output [147:0]
237
    //END
238
 
239
    //RESP:
240
    .write_do       (data_ram0_write_do),       //input
241
    .data           (data_ram0_data)            //input [127:0]
242
    //END
243
);
244
 
245
cache_data_ram cache_data_ram1_inst(
246
    .clk        (clk),
247
    .rst_n      (rst_n),
248
 
249
    .address        (data_ram1_address),        //input [31:0]
250
 
251
    //RESP:
252
    .read_do        (data_ram1_read_do),        //input
253
    .q              (data_ram1_q),              //output [147:0]
254
    //END
255
 
256
    //RESP:
257
    .write_do       (data_ram1_write_do),       //input
258
    .data           (data_ram1_data)            //input [127:0]
259
    //END
260
);
261
 
262
cache_data_ram cache_data_ram2_inst(
263
    .clk        (clk),
264
    .rst_n      (rst_n),
265
 
266
    .address        (data_ram2_address),        //input [31:0]
267
 
268
    //RESP:
269
    .read_do        (data_ram2_read_do),        //input
270
    .q              (data_ram2_q),              //output [147:0]
271
    //END
272
 
273
    //RESP:
274
    .write_do       (data_ram2_write_do),       //input
275
    .data           (data_ram2_data)            //input [127:0]
276
    //END
277
);
278
 
279
cache_data_ram cache_data_ram3_inst(
280
    .clk        (clk),
281
    .rst_n      (rst_n),
282
 
283
    .address        (data_ram3_address),        //input [31:0]
284
 
285
    //RESP:
286
    .read_do        (data_ram3_read_do),        //input
287
    .q              (data_ram3_q),              //output [147:0]
288
    //END
289
 
290
    //RESP:
291
    .write_do       (data_ram3_write_do),       //input
292
    .data           (data_ram3_data)            //input [127:0]
293
    //END
294
);
295
 
296
 
297
/*******************************************************************************SCRIPT
298
 
299
 
300
IF(state == STATE_IDLE);
301
 
302
    SAVE(length,          icacheread_length);
303
    SAVE(cache_disable,   icacheread_cache_disable);
304
 
305
    IF(invdcode_do);
306
 
307
        //wait
308
 
309
    // check if invalidate needed because of write from dcache
310
    ELSE_IF(~(dcachetoicache_accept_empty));
311
 
312
        SET(control_ram_read_do);
313
        SET(control_ram_address, dcachetoicache_accept_address);
314
 
315
        SET(data_ram0_read_do);
316
        SET(data_ram0_address, dcachetoicache_accept_address);
317
 
318
        SET(data_ram1_read_do);
319
        SET(data_ram1_address, dcachetoicache_accept_address);
320
 
321
        SET(data_ram2_read_do);
322
        SET(data_ram2_address, dcachetoicache_accept_address);
323
 
324
        SET(data_ram3_read_do);
325
        SET(data_ram3_address, dcachetoicache_accept_address);
326
 
327
        SET(dcachetoicache_accept_do);
328
 
329
        SAVE(address, dcachetoicache_accept_address);
330
 
331
        SAVE(state, STATE_INVALIDATE_WRITE);
332
 
333
    ELSE_IF(~(pr_reset) && icacheread_do && icacheread_length > 5'd0);
334
 
335
        SET(control_ram_read_do);
336
        SET(control_ram_address, icacheread_address);
337
 
338
        SET(data_ram0_read_do);
339
        SET(data_ram0_address, icacheread_address);
340
 
341
        SET(data_ram1_read_do);
342
        SET(data_ram1_address, icacheread_address);
343
 
344
        SET(data_ram2_read_do);
345
        SET(data_ram2_address, icacheread_address);
346
 
347
        SET(data_ram3_read_do);
348
        SET(data_ram3_address, icacheread_address);
349
 
350
        SAVE(address, icacheread_address);
351
 
352
        IF(icacheread_do && icacheread_cache_disable);
353
 
354
            SAVE(partial_length, length_burst);
355
 
356
            SAVE(state, STATE_CHECK);
357
        ENDIF();
358
 
359
        IF(icacheread_do && ~(icacheread_cache_disable));
360
 
361
            SAVE(partial_length, length_line);
362
 
363
            SAVE(state, STATE_CHECK);
364
        ENDIF();
365
 
366
    ENDIF();
367
ENDIF();
368
*/
369
 
370
/*******************************************************************************SCRIPT
371
 
372
 
373
IF(state == STATE_INVALIDATE_WRITE);
374
 
375
    SET(control_ram_write_do);
376
    SET(control_ram_address, address);
377
    SET(control_ram_data,    control_after_invalidate_write);
378
 
379
    SAVE(state, STATE_IDLE);
380
ENDIF();
381
*/
382
 
383
/*******************************************************************************SCRIPT
384
 
385
IF(state == STATE_CHECK);
386
 
387
    IF(matched);
388
 
389
        IF(pr_reset == `FALSE && reset_waiting == `FALSE);
390
 
391
            //write to prefetch fifo
392
            SET(prefetchfifo_write_do);
393
            SET(prefetchfifo_write_data, prefetch_line);
394
 
395
            //inform prefetch
396
            SET(prefetched_do);
397
            SET(prefetched_length, 5'd16 - { 1'b0, address[3:0] });
398
 
399
            //update pLRU
400
            SET(control_ram_write_do);
401
            SET(control_ram_address, address);
402
            SET(control_ram_data,    control_after_match);
403
        ENDIF();
404
 
405
        SAVE(state, STATE_IDLE);
406
 
407
    ELSE_IF(~(cache_disable)); //cache enabled
408
 
409
        SET(readcode_do);
410
        SET(readcode_address, { address[31:4], 4'd0 });
411
 
412
        SAVE(state, STATE_READ);
413
 
414
    ELSE(); //cache disabled
415
 
416
        SET(readcode_do);
417
        SET(readcode_address, { address[31:2], 2'd0 });
418
 
419
        SAVE(state, STATE_READ);
420
    ENDIF();
421
ENDIF();
422
*/
423
 
424
/*******************************************************************************SCRIPT
425
 
426
IF(state == STATE_READ);
427
 
428
    IF(pr_reset == `FALSE && reset_waiting == `FALSE);
429
 
430
        IF(readcode_partial_done || readcode_done);
431
 
432
            IF(partial_length[2:0] > 3'd0 && length > 5'd0);
433
                //write to prefetch fifo
434
                SET(prefetchfifo_write_do);
435
                SET(prefetchfifo_write_data, prefetch_partial);
436
 
437
                //inform prefetch
438
                SET(prefetched_do);
439
                SET(prefetched_length, partial_length_current);
440
 
441
                SAVE(length, length - partial_length_current);
442
            ENDIF();
443
 
444
            SAVE(partial_length, { 3'd0, partial_length[11:3] });
445
 
446
        ENDIF();
447
 
448
        IF(readcode_done && ~(cache_disable));
449
 
450
            //update icache control
451
            SET(control_ram_write_do);
452
            SET(control_ram_address, address);
453
            SET(control_ram_data,    control_after_line_read);
454
 
455
            //update icache data
456
            IF(plru_index[1:0] == 2'd0);
457
                SET(data_ram0_write_do);
458
                SET(data_ram0_address,   address);
459
                SET(data_ram0_data,      readcode_line);
460
            ENDIF();
461
 
462
            IF(plru_index[1:0] == 2'd1);
463
                SET(data_ram1_write_do);
464
                SET(data_ram1_address,   address);
465
                SET(data_ram1_data,      readcode_line);
466
            ENDIF();
467
 
468
            IF(plru_index[1:0] == 2'd2);
469
                SET(data_ram2_write_do);
470
                SET(data_ram2_address,   address);
471
                SET(data_ram2_data,      readcode_line);
472
            ENDIF();
473
 
474
            IF(plru_index[1:0] == 2'd3);
475
                SET(data_ram3_write_do);
476
                SET(data_ram3_address,   address);
477
                SET(data_ram3_data,      readcode_line);
478
            ENDIF();
479
 
480
        ENDIF();
481
    ENDIF();
482
 
483
    IF(readcode_done);
484
        SAVE(state, STATE_IDLE);
485
    ENDIF();
486
 
487
ENDIF();
488
*/
489
 
490
//------------------------------------------------------------------------------
491
 
492
`include "autogen/icache.v"
493
 
494
endmodule

powered by: WebSVN 2.1.0

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