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

Subversion Repositories ao486

[/] [ao486/] [trunk/] [rtl/] [ao486/] [memory/] [memory_write.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 memory_write(
32
    input               clk,
33
    input               rst_n,
34
 
35
    // write step
36
    input               wr_reset,
37
 
38
    //RESP:
39
    input               write_do,
40
    output              write_done,
41
    output              write_page_fault,
42
    output              write_ac_fault,
43
 
44
    input       [1:0]   write_cpl,
45
    input       [31:0]  write_address,
46
    input       [2:0]   write_length,
47
    input               write_lock,
48
    input               write_rmw,
49
    input       [31:0]  write_data,
50
    //END
51
 
52
    //REQ: done at least one cycle later, do has to wait for doing
53
    output              tlbwrite_do,
54
    input               tlbwrite_done,
55
    input               tlbwrite_page_fault,
56
    input               tlbwrite_ac_fault,
57
 
58
    output      [1:0]   tlbwrite_cpl,
59
    output      [31:0]  tlbwrite_address,
60
    output      [2:0]   tlbwrite_length,
61
    output      [2:0]   tlbwrite_length_full,
62
    output              tlbwrite_lock,
63
    output              tlbwrite_rmw,
64
    output      [31:0]  tlbwrite_data
65
    //END
66
);
67
 
68
 
69
//------------------------------------------------------------------------------
70
 
71
//------------------------------------------------------------------------------
72
 
73
reg [1:0]   state;
74
 
75
reg [23:0]  buffer;
76
 
77
reg [2:0]   length_2_reg;
78
 
79
reg [31:0]  address_2_reg;
80
 
81
reg         reset_waiting;
82
 
83
reg         page_fault;
84
reg         ac_fault;
85
 
86
//------------------------------------------------------------------------------
87
 
88
wire [4:0]  left_in_line;
89
 
90
wire [2:0]  length_1;
91
 
92
wire [2:0]  length_2;
93
 
94
wire [31:0] address_2;
95
 
96
//------------------------------------------------------------------------------
97
 
98
assign write_page_fault = tlbwrite_page_fault || page_fault;
99
 
100
assign write_ac_fault   = tlbwrite_ac_fault || ac_fault;
101
 
102
assign left_in_line = 5'd16 - { 1'b0, write_address[3:0] };
103
 
104
assign length_1 = (left_in_line >= { 2'd0, write_length })? write_length : left_in_line[2:0];
105
 
106
assign length_2 = write_length - length_1;
107
 
108
assign address_2 = { write_address[31:4], 4'd0 } + 32'd16;
109
 
110
assign tlbwrite_cpl         = write_cpl;
111
assign tlbwrite_length_full = write_length;
112
assign tlbwrite_lock        = write_lock;
113
assign tlbwrite_rmw         = write_rmw;
114
 
115
//------------------------------------------------------------------------------
116
 
117
always @(posedge clk or negedge rst_n) begin
118
    if(rst_n == 1'b0)                           reset_waiting <= `FALSE;
119
    else if(wr_reset && state != STATE_IDLE)    reset_waiting <= `TRUE;
120
    else if(state == STATE_IDLE)                reset_waiting <= `FALSE;
121
end
122
 
123
always @(posedge clk or negedge rst_n) begin
124
    if(rst_n == 1'b0)                                   page_fault <= `FALSE;
125
    else if(wr_reset)                                   page_fault <= `FALSE;
126
    else if(tlbwrite_page_fault && ~(reset_waiting))    page_fault <= `TRUE;
127
end
128
 
129
always @(posedge clk or negedge rst_n) begin
130
    if(rst_n == 1'b0)                               ac_fault <= `FALSE;
131
    else if(wr_reset)                               ac_fault <= `FALSE;
132
    else if(tlbwrite_ac_fault && ~(reset_waiting))  ac_fault <= `TRUE;
133
end
134
 
135
//------------------------------------------------------------------------------
136
 
137
localparam [1:0] STATE_IDLE        = 2'd0;
138
localparam [1:0] STATE_FIRST_WAIT  = 2'd1;
139
localparam [1:0] STATE_SECOND      = 2'd2;
140
 
141
//------------------------------------------------------------------------------
142
 
143
// synthesis translate_off
144
wire _unused_ok = &{ 1'b0, address_2[3:0], 1'b0 };
145
// synthesis translate_on
146
 
147
//------------------------------------------------------------------------------
148
 
149
/*
150
tlbwrite_cpl             -- constant assign from read
151
tlbwrite_address         -- set
152
tlbwrite_length          -- set
153
tlbwrite_length_full     -- constant assign from read
154
tlbwrite_lock            -- constant assign from read
155
tlbwrite_rmw             -- constant assign from read
156
tlbwrite_data            -- set
157
*/
158
 
159
 
160
/*******************************************************************************SCRIPT
161
 
162
IF(state == STATE_IDLE);
163
 
164
    IF(length_1 == 3'd1);      SAVE(buffer, write_data[31:8]);
165
    ELSE_IF(length_1 == 3'd2); SAVE(buffer, { 8'd0,  write_data[31:16] });
166
    ELSE();                       SAVE(buffer, { 16'd0, write_data[31:24] });
167
    ENDIF();
168
 
169
    SAVE(length_2_reg,  length_2);
170
    SAVE(address_2_reg, { address_2[31:4], 4'd0 });
171
 
172
    SET(tlbwrite_address, write_address);
173
    SET(tlbwrite_length,  length_1);
174
    SET(tlbwrite_data,    write_data);
175
 
176
    IF(write_do && ~(wr_reset) && ~(write_page_fault) && ~(write_ac_fault));
177
 
178
        SET(tlbwrite_do);
179
 
180
        SAVE(state, STATE_FIRST_WAIT);
181
    ENDIF();
182
ENDIF();
183
*/
184
 
185
/*******************************************************************************SCRIPT
186
 
187
IF(state == STATE_FIRST_WAIT);
188
 
189
    SET(tlbwrite_do);
190
 
191
    SET(tlbwrite_address, write_address);
192
    SET(tlbwrite_length,  length_1);
193
    SET(tlbwrite_data,    write_data);
194
 
195
    IF(tlbwrite_page_fault || tlbwrite_ac_fault);
196
        SAVE(state, STATE_IDLE);
197
 
198
    ELSE_IF(tlbwrite_done && length_2_reg != 3'd0);
199
        SAVE(state, STATE_SECOND);
200
 
201
    ELSE_IF(tlbwrite_done);
202
        IF(reset_waiting == `FALSE); SET(write_done); ENDIF(); //does not depend on: wr_reset == `FALSE
203
        SAVE(state, STATE_IDLE);
204
 
205
    ENDIF();
206
ENDIF();
207
*/
208
 
209
/*******************************************************************************SCRIPT
210
 
211
IF(state == STATE_SECOND);
212
 
213
    SET(tlbwrite_do);
214
 
215
    SET(tlbwrite_address, address_2_reg);
216
    SET(tlbwrite_length,  length_2_reg);
217
    SET(tlbwrite_data,    { 8'd0, buffer });
218
 
219
    IF(tlbwrite_page_fault || tlbwrite_ac_fault || tlbwrite_done);
220
        SAVE(state, STATE_IDLE);
221
    ENDIF();
222
 
223
    IF(tlbwrite_done && reset_waiting == `FALSE); //does not depend on: wr_reset == `FALSE
224
        SET(write_done);
225
    ENDIF();
226
ENDIF();
227
*/
228
 
229
//------------------------------------------------------------------------------
230
 
231
`include "autogen/memory_write.v"
232
 
233
endmodule

powered by: WebSVN 2.1.0

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