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 30

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

powered by: WebSVN 2.1.0

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