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

Subversion Repositories ao486

[/] [ao486/] [trunk/] [rtl/] [ao486/] [memory/] [avalon_mem.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 avalon_mem(
32
    // global
33
    input               clk,
34
    input               rst_n,
35
 
36
    //RESP:
37
    input               writeburst_do,
38
    output              writeburst_done,
39
 
40
    input       [31:0]  writeburst_address,
41
    input       [1:0]   writeburst_dword_length,
42
    input       [3:0]   writeburst_byteenable_0,
43
    input       [3:0]   writeburst_byteenable_1,
44
    input       [55:0]  writeburst_data,
45
    //END
46
 
47
    //RESP:
48
    input               writeline_do,
49
    output              writeline_done,
50
 
51
    input       [31:0]  writeline_address,
52
    input       [127:0] writeline_line,
53
    //END
54
 
55
    //RESP:
56
    input               readburst_do,
57
    output              readburst_done,
58
 
59
    input       [31:0]  readburst_address,
60
    input       [1:0]   readburst_dword_length,
61
    input       [3:0]   readburst_byte_length,
62
    output      [95:0]  readburst_data,
63
    //END
64
 
65
    //RESP:
66
    input               readline_do,
67
    output              readline_done,
68
 
69
    input       [31:0]  readline_address,
70
    output      [127:0] readline_line,
71
    //END
72
 
73
    //RESP:
74
    input               readcode_do,
75
    output              readcode_done,
76
 
77
    input       [31:0]  readcode_address,
78
    output      [127:0] readcode_line,
79
    output      [31:0]  readcode_partial,
80
    output              readcode_partial_done,
81
    //END
82
 
83
    // avalon master
84
    output reg  [31:0]  avm_address,
85
    output reg  [31:0]  avm_writedata,
86
    output reg  [3:0]   avm_byteenable,
87
    output reg  [2:0]   avm_burstcount,
88
    output reg          avm_write,
89
    output reg          avm_read,
90
 
91
    input               avm_waitrequest,
92
    input               avm_readdatavalid,
93
    input       [31:0]  avm_readdata
94
);
95
 
96
//------------------------------------------------------------------------------
97
 
98
reg [31:0]  bus_0;
99
reg [31:0]  bus_1;
100
reg [31:0]  bus_2;
101
reg [31:0]  bus_3;
102
 
103
reg [3:0]   byteenable_next;
104
reg [1:0]   counter;
105
reg [1:0]   state;
106
 
107
reg         read_burst_done_trigger;
108
reg         read_line_done_trigger;
109
reg         read_code_done_trigger;
110
 
111
reg [31:0]  bus_code_partial;
112
 
113
//------------------------------------------------------------------------------
114
 
115
localparam [1:0] STATE_IDLE      = 2'd0;
116
localparam [1:0] STATE_WRITE     = 2'd1;
117
localparam [1:0] STATE_READ      = 2'd2;
118
localparam [1:0] STATE_READ_CODE = 2'd3;
119
 
120
 
121
//------------------------------------------------------------------------------
122
 
123
assign readburst_data   = { bus_2, bus_1, bus_0 };
124
 
125
assign readline_line    = { bus_3, bus_2, bus_1, bus_0 };
126
 
127
assign readcode_line    = { bus_3, bus_2, bus_1, bus_0 };
128
 
129
assign readcode_partial = bus_code_partial;
130
 
131
//------------------------------------------------------------------------------
132
 
133
// synthesis translate_off
134
wire _unused_ok = &{ 1'b0, writeburst_address[1:0], writeline_address[3:0], readline_address[3:0], readcode_address[1:0],  1'b0 };
135
// synthesis translate_on
136
 
137
//------------------------------------------------------------------------------
138
 
139
wire [3:0] read_burst_byteenable =
140
    (readburst_byte_length == 4'd1 && readburst_address[1:0] == 2'd0)?  4'b0001 :
141
    (readburst_byte_length == 4'd1 && readburst_address[1:0] == 2'd1)?  4'b0010 :
142
    (readburst_byte_length == 4'd1 && readburst_address[1:0] == 2'd2)?  4'b0100 :
143
    (readburst_byte_length == 4'd1 && readburst_address[1:0] == 2'd3)?  4'b1000 :
144
 
145
    (readburst_byte_length == 4'd2 && readburst_address[1:0] == 2'd0)?  4'b0011 :
146
    (readburst_byte_length == 4'd2 && readburst_address[1:0] == 2'd1)?  4'b0110 :
147
    (readburst_byte_length == 4'd2 && readburst_address[1:0] == 2'd2)?  4'b1100 :
148
 
149
    (readburst_byte_length == 4'd3 && readburst_address[1:0] == 2'd0)?  4'b0111 :
150
    (readburst_byte_length == 4'd3 && readburst_address[1:0] == 2'd1)?  4'b1110 :
151
 
152
                                                                        4'b1111;
153
 
154
//------------------------------------------------------------------------------
155
 
156
 
157
/*******************************************************************************SCRIPT
158
 
159
IF(state == STATE_IDLE);
160
 
161
    IF(read_burst_done_trigger);
162
        SET(readburst_done);
163
        SAVE(read_burst_done_trigger, `FALSE);
164
    ENDIF();
165
 
166
    IF(read_line_done_trigger);
167
        SET(readline_done);
168
        SAVE(read_line_done_trigger, `FALSE);
169
    ENDIF();
170
 
171
    IF(read_code_done_trigger);
172
        SET(readcode_done);
173
        SAVE(read_code_done_trigger, `FALSE);
174
    ENDIF();
175
 
176
    IF(writeburst_do);
177
 
178
        SAVE(avm_address,        { writeburst_address[31:2], 2'd0 });
179
        SAVE(avm_byteenable,     writeburst_byteenable_0);
180
        SAVE(byteenable_next,    writeburst_byteenable_1);
181
        SAVE(avm_burstcount,     { 1'b0, writeburst_dword_length });
182
        SAVE(avm_write,          `TRUE);
183
 
184
        SAVE(avm_writedata,         writeburst_data[31:0]);
185
        SAVE(bus_0,         { 8'd0, writeburst_data[55:32] });
186
 
187
        SET(writeburst_done);
188
        SAVE(counter,    writeburst_dword_length - 2'd1);
189
        SAVE(state,      STATE_WRITE);
190
 
191
    ELSE_IF(writeline_do);
192
 
193
        SAVE(avm_address,        { writeline_address[31:4], 4'd0 });
194
        SAVE(avm_byteenable,     4'hF);
195
        SAVE(byteenable_next,    4'hF);
196
        SAVE(avm_burstcount,     3'd4);
197
        SAVE(avm_write,          `TRUE);
198
 
199
        SAVE(avm_writedata, writeline_line[31:0]);
200
        SAVE(bus_0,         writeline_line[63:32]);
201
        SAVE(bus_1,         writeline_line[95:64]);
202
        SAVE(bus_2,         writeline_line[127:96]);
203
 
204
        SET(writeline_done);
205
        SAVE(counter,    2'd3);
206
        SAVE(state,      STATE_WRITE);
207
 
208
    ELSE_IF(readburst_do && ~(readburst_done));
209
 
210
        SAVE(avm_address,    { readburst_address[31:2], 2'd0 });
211
        SAVE(avm_byteenable, read_burst_byteenable);
212
        SAVE(avm_burstcount, { 1'b0, readburst_dword_length });
213
        SAVE(avm_read,      `TRUE);
214
 
215
        SAVE(counter,    readburst_dword_length - 2'd1);
216
        SAVE(state,      STATE_READ);
217
 
218
    ELSE_IF(readline_do && ~(readline_done));
219
 
220
        SAVE(avm_address,    { readline_address[31:4], 4'd0 });
221
        SAVE(avm_byteenable, 4'hF);
222
        SAVE(avm_burstcount, 3'd4);
223
        SAVE(avm_read,      `TRUE);
224
 
225
        SAVE(counter,    2'd3);
226
        SAVE(state,      STATE_READ);
227
 
228
    ELSE_IF(readcode_do && ~(readcode_done));
229
 
230
        SAVE(avm_address,    { readcode_address[31:2], 2'd0 });
231
        SAVE(avm_byteenable, 4'hF);
232
        SAVE(avm_burstcount, 3'd4);
233
        SAVE(avm_read,      `TRUE);
234
 
235
        SAVE(counter,    2'd3);
236
        SAVE(state,      STATE_READ_CODE);
237
    ENDIF();
238
ENDIF();
239
*/
240
 
241
/*******************************************************************************SCRIPT
242
 
243
IF(state == STATE_WRITE);
244
 
245
    IF(~(avm_waitrequest) && counter == 2'd0);
246
        SAVE(avm_write,  `FALSE);
247
        SAVE(state,      STATE_IDLE);
248
    ENDIF();
249
 
250
    IF(~(avm_waitrequest) && counter != 2'd0);
251
        SAVE(avm_writedata, bus_0);
252
        SAVE(bus_0,         bus_1);
253
        SAVE(bus_1,         bus_2);
254
 
255
        SAVE(avm_byteenable, byteenable_next);
256
 
257
        SAVE(counter, counter - 2'd1);
258
    ENDIF();
259
ENDIF();
260
*/
261
 
262
/*******************************************************************************SCRIPT
263
 
264
IF(state == STATE_READ);
265
 
266
    IF(avm_readdatavalid);
267
        IF(avm_burstcount - { 1'b0, counter } == 3'd1); SAVE(bus_0, avm_readdata); ENDIF();
268
        IF(avm_burstcount - { 1'b0, counter } == 3'd2); SAVE(bus_1, avm_readdata); ENDIF();
269
        IF(avm_burstcount - { 1'b0, counter } == 3'd3); SAVE(bus_2, avm_readdata); ENDIF();
270
        IF(avm_burstcount - { 1'b0, counter } == 3'd4); SAVE(bus_3, avm_readdata); ENDIF();
271
 
272
        SAVE(counter, counter - 2'd1);
273
 
274
        IF(counter == 2'd0);
275
            IF(avm_burstcount == 3'd4); SAVE(read_line_done_trigger, `TRUE);
276
            ELSE();                     SAVE(read_burst_done_trigger,`TRUE);
277
            ENDIF();
278
 
279
            SAVE(avm_read, `FALSE);
280
            SAVE(state, STATE_IDLE);
281
        ENDIF();
282
    ENDIF();
283
 
284
    IF(avm_waitrequest == `FALSE);
285
        SAVE(avm_read, `FALSE);
286
    ENDIF();
287
ENDIF();
288
*/
289
 
290
/*******************************************************************************SCRIPT
291
 
292
IF(state == STATE_READ_CODE);
293
 
294
    IF(avm_readdatavalid);
295
        SAVE(bus_code_partial, avm_readdata);
296
 
297
        IF(counter == 2'd3); SAVE(bus_0, avm_readdata); ENDIF();
298
        IF(counter == 2'd2); SAVE(bus_1, avm_readdata); ENDIF();
299
        IF(counter == 2'd1); SAVE(bus_2, avm_readdata); ENDIF();
300
        IF(counter == 2'd0); SAVE(bus_3, avm_readdata); ENDIF();
301
 
302
        SAVE(counter, counter - 2'd1);
303
 
304
        IF(counter < 2'd3); SET(readcode_partial_done); ENDIF();
305
 
306
        IF(counter == 2'd0);
307
            SAVE(read_code_done_trigger, `TRUE);
308
 
309
            SAVE(avm_read, `FALSE);
310
            SAVE(state, STATE_IDLE);
311
        ENDIF();
312
    ENDIF();
313
 
314
    IF(avm_waitrequest == `FALSE);
315
        SAVE(avm_read, `FALSE);
316
    ENDIF();
317
ENDIF();
318
*/
319
 
320
//------------------------------------------------------------------------------
321
 
322
`include "autogen/avalon_mem.v"
323
 
324
endmodule

powered by: WebSVN 2.1.0

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