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

Subversion Repositories altor32

[/] [altor32/] [trunk/] [rtl/] [cpu/] [altor32_dcache_mem_if.v] - Blame information for rev 27

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
// Module - Data Cache Memory Interface
40
//-----------------------------------------------------------------
41
module altor32_dcache_mem_if
42
(
43
    input           clk_i /*verilator public*/,
44
    input           rst_i /*verilator public*/,
45
 
46
    // Cache interface
47
    input [31:0]    address_i /*verilator public*/,
48
    input [31:0]    data_i /*verilator public*/,
49
    output [31:0]   data_o /*verilator public*/,
50
    input           fill_i /*verilator public*/,
51
    input           evict_i /*verilator public*/,
52
    input  [31:0]   evict_addr_i /*verilator public*/,
53
    input           rd_single_i /*verilator public*/,
54
    input [3:0]     wr_single_i /*verilator public*/,
55
    output          done_o /*verilator public*/,
56
 
57
    // Cache memory (fill/evict)
58
    output [31:2]   cache_addr_o /*verilator public*/,
59
    output [31:0]   cache_data_o /*verilator public*/,
60
    input  [31:0]   cache_data_i /*verilator public*/,
61
    output          cache_wr_o /*verilator public*/,
62
 
63
    // Memory interface (slave)
64
    output [31:0]   mem_addr_o /*verilator public*/,
65
    input  [31:0]   mem_data_i /*verilator public*/,
66
    output [31:0]   mem_data_o /*verilator public*/,
67
    output          mem_burst_o /*verilator public*/,
68
    output          mem_rd_o /*verilator public*/,
69
    output [3:0]    mem_wr_o /*verilator public*/,
70
    input           mem_accept_i/*verilator public*/,
71
    input           mem_ack_i/*verilator public*/
72
);
73
 
74
//-----------------------------------------------------------------
75
// Params
76
//-----------------------------------------------------------------
77
parameter CACHE_LINE_SIZE_WIDTH     = 5;                         /* 5-bits -> 32 entries */
78
parameter CACHE_LINE_WORDS_IDX_MAX  = CACHE_LINE_SIZE_WIDTH - 2; /* 3-bit -> 8 words */
79
 
80
//-----------------------------------------------------------------
81
// Registers / Wires
82
//-----------------------------------------------------------------
83
 
84
reg [31:2]                      cache_addr_o;
85
reg [31:0]                      cache_data_o;
86
reg                             cache_wr_o;
87
 
88
reg [31:CACHE_LINE_SIZE_WIDTH]  line_address;
89
reg [CACHE_LINE_SIZE_WIDTH-3:0] line_word;
90
 
91
reg [31:0]                      data_o;
92
reg                             done_o;
93
 
94
reg [31:0]                      mem_addr_o;
95
reg [31:0]                      mem_data_o;
96
reg                             mem_rd_o;
97
reg [3:0]                       mem_wr_o;
98
reg                             mem_burst_o;
99
 
100
// Current state
101
parameter STATE_IDLE        = 0;
102
parameter STATE_FETCH       = 1;
103
parameter STATE_READ_WAIT   = 2;
104
parameter STATE_WRITE       = 3;
105
parameter STATE_WRITE_WAIT  = 4;
106
parameter STATE_READ_SINGLE = 5;
107
parameter STATE_WRITE_SINGLE= 6;
108
 
109
reg [3:0] state;
110
 
111
//-----------------------------------------------------------------
112
// Control logic
113
//-----------------------------------------------------------------
114
reg [CACHE_LINE_SIZE_WIDTH-3:0] v_line_word;
115
 
116
always @ (posedge rst_i or posedge clk_i )
117
begin
118
   if (rst_i == 1'b1)
119
   begin
120
        line_address    <= {32-CACHE_LINE_SIZE_WIDTH{1'b0}};
121
        line_word       <= {CACHE_LINE_SIZE_WIDTH-2{1'b0}};
122
        mem_addr_o      <= 32'h00000000;
123
        mem_data_o      <= 32'h00000000;
124
        mem_wr_o        <= 4'h0;
125
        mem_rd_o        <= 1'b0;
126
        mem_burst_o     <= 1'b0;
127
        cache_addr_o    <= 30'h00000000;
128
        cache_data_o    <= 32'h00000000;
129
        cache_wr_o      <= 1'b0;
130
        done_o          <= 1'b0;
131
        data_o          <= 32'h00000000;
132
        state           <= STATE_IDLE;
133
   end
134
   else
135
   begin
136
 
137
        if (mem_accept_i)
138
        begin
139
            mem_rd_o        <= 1'b0;
140
            mem_wr_o        <= 4'h0;
141
        end
142
 
143
        done_o          <= 1'b0;
144
        cache_wr_o      <= 1'b0;
145
 
146
        case (state)
147
 
148
            //-----------------------------------------
149
            // IDLE
150
            //-----------------------------------------
151
            STATE_IDLE :
152
            begin
153
                // Perform cache evict (write)     
154
                if (evict_i)
155
                begin
156
                    line_address  <= evict_addr_i[31:CACHE_LINE_SIZE_WIDTH];
157
                    line_word     <= {CACHE_LINE_SIZE_WIDTH-2{1'b0}};
158
 
159
                    // Read data from cache
160
                    cache_addr_o  <= {evict_addr_i[31:CACHE_LINE_SIZE_WIDTH], {CACHE_LINE_SIZE_WIDTH-2{1'b0}}};
161
                    state         <= STATE_READ_WAIT;
162
                end
163
                // Perform cache fill (read)
164
                else if (fill_i)
165
                begin
166
                    line_address <= address_i[31:CACHE_LINE_SIZE_WIDTH];
167
                    line_word    <= {CACHE_LINE_SIZE_WIDTH-2{1'b0}};
168
 
169
                    // Start fetch from memory
170
                    mem_addr_o   <= {address_i[31:CACHE_LINE_SIZE_WIDTH], {CACHE_LINE_SIZE_WIDTH{1'b0}}};
171
                    mem_rd_o     <= 1'b1;
172
                    mem_burst_o  <= 1'b1;
173
                    state        <= STATE_FETCH;
174
                end
175
                // Read single
176
                else if (rd_single_i)
177
                begin
178
                    // Start fetch from memory
179
                    mem_addr_o   <= address_i;
180
                    mem_data_o   <= 32'b0;
181
                    mem_rd_o     <= 1'b1;
182
                    mem_burst_o  <= 1'b0;
183
                    state        <= STATE_READ_SINGLE;
184
                end
185
                // Write single
186
                else if (|wr_single_i)
187
                begin
188
                    // Start fetch from memory
189
                    mem_addr_o   <= address_i;
190
                    mem_data_o   <= data_i;
191
                    mem_wr_o     <= wr_single_i;
192
                    mem_burst_o  <= 1'b0;
193
                    state        <= STATE_WRITE_SINGLE;
194
                end
195
            end
196
            //-----------------------------------------
197
            // FETCH - Fetch line from memory
198
            //-----------------------------------------
199
            STATE_FETCH :
200
            begin
201
                // Data ready from memory?
202
                if (mem_ack_i && mem_rd_o == 1'b0)
203
                begin
204
                    // Write data into cache
205
                    cache_addr_o    <= {line_address, line_word};
206
                    cache_data_o    <= mem_data_i;
207
                    cache_wr_o      <= 1'b1;
208
 
209
                    // Line fetch complete?
210
                    if (line_word == {CACHE_LINE_WORDS_IDX_MAX{1'b1}})
211
                    begin
212
                        done_o      <= 1'b1;
213
                        state       <= STATE_IDLE;
214
                    end
215
                    // Fetch next word for line
216
                    else
217
                    begin
218
                        v_line_word = line_word + 1'b1;
219
                        line_word   <= v_line_word;
220
 
221
                        mem_addr_o <= {line_address, v_line_word, 2'b00};
222
                        mem_rd_o   <= 1'b1;
223
 
224
                        if (line_word == ({CACHE_LINE_WORDS_IDX_MAX{1'b1}}-1))
225
                        begin
226
                            mem_burst_o <= 1'b0;
227
                        end
228
                    end
229
                end
230
            end
231
            //-----------------------------------------
232
            // READ_WAIT - Wait for data from cache
233
            //-----------------------------------------
234
            STATE_READ_WAIT :
235
            begin
236
                // Not used yet, but set for start of burst
237
                mem_burst_o  <= 1'b1;
238
                state        <= STATE_WRITE;
239
            end
240
            //-----------------------------------------
241
            // WRITE - Write word to memory
242
            //-----------------------------------------
243
            STATE_WRITE :
244
            begin
245
                // Write data into memory from cache
246
                mem_addr_o   <= {line_address, line_word, 2'b00};
247
                mem_data_o   <= cache_data_i;
248
                mem_wr_o     <= 4'b1111;
249
 
250
                // Setup next word read from cache
251
                v_line_word = line_word + 1'b1;
252
                cache_addr_o <= {line_address, v_line_word};
253
 
254
                state        <= STATE_WRITE_WAIT;
255
            end
256
            //-----------------------------------------
257
            // WRITE_WAIT - Wait for write to complete
258
            //-----------------------------------------
259
            STATE_WRITE_WAIT:
260
            begin
261
                // Write to memory complete
262
                if (mem_ack_i && mem_wr_o == 4'b0)
263
                begin
264
                    // Line write complete?
265
                    if (line_word == {CACHE_LINE_WORDS_IDX_MAX{1'b1}})
266
                    begin
267
                        done_o      <= 1'b1;
268
                        state       <= STATE_IDLE;
269
                    end
270
                    // Fetch next word for line
271
                    else
272
                    begin
273
                        line_word   <= line_word + 1'b1;
274
                        state       <= STATE_WRITE;
275
 
276
                        if (line_word == ({CACHE_LINE_WORDS_IDX_MAX{1'b1}}-1))
277
                            mem_burst_o <= 1'b0;
278
                    end
279
                end
280
            end
281
            //-----------------------------------------
282
            // READ_SINGLE - Single access to memory
283
            //-----------------------------------------
284
            STATE_READ_SINGLE:
285
            begin
286
                // Data ready from memory?
287
                if (mem_ack_i && mem_rd_o == 1'b0)
288
                begin
289
                    data_o      <= mem_data_i;
290
                    done_o      <= 1'b1;
291
                    state       <= STATE_IDLE;
292
                end
293
            end
294
            //-----------------------------------------
295
            // WRITE_SINGLE - Single access to memory
296
            //-----------------------------------------
297
            STATE_WRITE_SINGLE:
298
            begin
299
                if (mem_ack_i && mem_wr_o == 4'b0)
300
                begin
301
                    done_o      <= 1'b1;
302
                    state       <= STATE_IDLE;
303
                end
304
            end
305
            default:
306
                ;
307
           endcase
308
   end
309
end
310
 
311
endmodule

powered by: WebSVN 2.1.0

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