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

Subversion Repositories ao486

[/] [ao486/] [trunk/] [rtl/] [ao486/] [memory/] [dcache_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
module dcache_write(
30
 
31
    input [127:0]           line,
32
    input [31:0]            address,
33
    input [2:0]             length,
34
    input [31:0]            write_data,
35
 
36
    output [1:0]            write_burst_dword_length,
37
    output [3:0]            write_burst_byteenable_0,
38
    output [3:0]            write_burst_byteenable_1,
39
    output [55:0]           write_burst_data,
40
    output [127:0]          line_merged
41
);
42
 
43
//------------------------------------------------------------------------------
44
 
45
assign write_burst_dword_length =
46
    (length == 3'd2 && address[1:0] == 2'b11)?  2'd2 :
47
    (length == 3'd3 && address[1]   == 1'b1)?   2'd2 :
48
    (length == 3'd4 && address[1:0] != 2'b00)?  2'd2 :
49
                                                2'd1;
50
 
51
assign write_burst_byteenable_0 =
52
    (address[1:0] == 2'd0 && length == 3'd1)?   4'b0001 :
53
    (address[1:0] == 2'd1 && length == 3'd1)?   4'b0010 :
54
    (address[1:0] == 2'd2 && length == 3'd1)?   4'b0100 :
55
    (address[1:0] == 2'd0 && length == 3'd2)?   4'b0011 :
56
    (address[1:0] == 2'd1 && length == 3'd2)?   4'b0110 :
57
    (address[1:0] == 2'd0 && length == 3'd3)?   4'b0111 :
58
    (address[1:0] == 2'd1 && length >= 3'd3)?   4'b1110 :
59
    (address[1:0] == 2'd2 && length >= 3'd2)?   4'b1100 :
60
    (address[1:0] == 2'd0 && length == 3'd4)?   4'b1111 :
61
                                                4'b1000; //(address[1:0] == 2'd3)?
62
 
63
assign write_burst_byteenable_1 =
64
   (address[1:0] == 2'd3 && length == 3'd2)?   4'b0001 :
65
   (address[1:0] == 2'd2 && length == 3'd3)?   4'b0001 :
66
   (address[1:0] == 2'd3 && length == 3'd3)?   4'b0011 :
67
   (address[1:0] == 2'd1 && length == 3'd4)?   4'b0001 :
68
   (address[1:0] == 2'd2 && length == 3'd4)?   4'b0011 :
69
                                               4'b0111; //(address[1:0] == 2'd3 && length == 3'd4)? 
70
 
71
assign write_burst_data =
72
    (address[1:0] == 2'd0)?   { 24'd0, write_data[31:0] } :
73
    (address[1:0] == 2'd1)?   { 16'd0, write_data[31:0], 8'd0 } :
74
    (address[1:0] == 2'd2)?   { 8'd0,  write_data[31:0], 16'd0 } :
75
                              {        write_data[31:0], 24'd0 };
76
 
77
assign line_merged =
78
    (address[3:0] == 4'd0  && length == 3'd1)? { line[127:8],   write_data[7:0] } :
79
    (address[3:0] == 4'd1  && length == 3'd1)? { line[127:16],  write_data[7:0], line[7:0] } :
80
    (address[3:0] == 4'd2  && length == 3'd1)? { line[127:24],  write_data[7:0], line[15:0] } :
81
    (address[3:0] == 4'd3  && length == 3'd1)? { line[127:32],  write_data[7:0], line[23:0] } :
82
    (address[3:0] == 4'd4  && length == 3'd1)? { line[127:40],  write_data[7:0], line[31:0] } :
83
    (address[3:0] == 4'd5  && length == 3'd1)? { line[127:48],  write_data[7:0], line[39:0] } :
84
    (address[3:0] == 4'd6  && length == 3'd1)? { line[127:56],  write_data[7:0], line[47:0] } :
85
    (address[3:0] == 4'd7  && length == 3'd1)? { line[127:64],  write_data[7:0], line[55:0] } :
86
    (address[3:0] == 4'd8  && length == 3'd1)? { line[127:72],  write_data[7:0], line[63:0] } :
87
    (address[3:0] == 4'd9  && length == 3'd1)? { line[127:80],  write_data[7:0], line[71:0] } :
88
    (address[3:0] == 4'd10 && length == 3'd1)? { line[127:88],  write_data[7:0], line[79:0] } :
89
    (address[3:0] == 4'd11 && length == 3'd1)? { line[127:96],  write_data[7:0], line[87:0] } :
90
    (address[3:0] == 4'd12 && length == 3'd1)? { line[127:104], write_data[7:0], line[95:0] } :
91
    (address[3:0] == 4'd13 && length == 3'd1)? { line[127:112], write_data[7:0], line[103:0] } :
92
    (address[3:0] == 4'd14 && length == 3'd1)? { line[127:120], write_data[7:0], line[111:0] } :
93
    (address[3:0] == 4'd15 && length == 3'd1)? {                write_data[7:0], line[119:0] } :
94
 
95
    (address[3:0] == 4'd0   && length == 3'd2)? { line[127:16],  write_data[15:0] } :
96
    (address[3:0] == 4'd1   && length == 3'd2)? { line[127:24],  write_data[15:0], line[7:0] } :
97
    (address[3:0] == 4'd2   && length == 3'd2)? { line[127:32],  write_data[15:0], line[15:0] } :
98
    (address[3:0] == 4'd3   && length == 3'd2)? { line[127:40],  write_data[15:0], line[23:0] } :
99
    (address[3:0] == 4'd4   && length == 3'd2)? { line[127:48],  write_data[15:0], line[31:0] } :
100
    (address[3:0] == 4'd5   && length == 3'd2)? { line[127:56],  write_data[15:0], line[39:0] } :
101
    (address[3:0] == 4'd6   && length == 3'd2)? { line[127:64],  write_data[15:0], line[47:0] } :
102
    (address[3:0] == 4'd7   && length == 3'd2)? { line[127:72],  write_data[15:0], line[55:0] } :
103
    (address[3:0] == 4'd8   && length == 3'd2)? { line[127:80],  write_data[15:0], line[63:0] } :
104
    (address[3:0] == 4'd9   && length == 3'd2)? { line[127:88],  write_data[15:0], line[71:0] } :
105
    (address[3:0] == 4'd10  && length == 3'd2)? { line[127:96],  write_data[15:0], line[79:0] } :
106
    (address[3:0] == 4'd11  && length == 3'd2)? { line[127:104], write_data[15:0], line[87:0] } :
107
    (address[3:0] == 4'd12  && length == 3'd2)? { line[127:112], write_data[15:0], line[95:0] } :
108
    (address[3:0] == 4'd13  && length == 3'd2)? { line[127:120], write_data[15:0], line[103:0] } :
109
    (address[3:0] == 4'd14  && length == 3'd2)? {                write_data[15:0], line[111:0] } :
110
 
111
    (address[3:0] == 4'd0   && length == 3'd3)? { line[127:24],  write_data[23:0] } :
112
    (address[3:0] == 4'd1   && length == 3'd3)? { line[127:32],  write_data[23:0], line[7:0] } :
113
    (address[3:0] == 4'd2   && length == 3'd3)? { line[127:40],  write_data[23:0], line[15:0] } :
114
    (address[3:0] == 4'd3   && length == 3'd3)? { line[127:48],  write_data[23:0], line[23:0] } :
115
    (address[3:0] == 4'd4   && length == 3'd3)? { line[127:56],  write_data[23:0], line[31:0] } :
116
    (address[3:0] == 4'd5   && length == 3'd3)? { line[127:64],  write_data[23:0], line[39:0] } :
117
    (address[3:0] == 4'd6   && length == 3'd3)? { line[127:72],  write_data[23:0], line[47:0] } :
118
    (address[3:0] == 4'd7   && length == 3'd3)? { line[127:80],  write_data[23:0], line[55:0] } :
119
    (address[3:0] == 4'd8   && length == 3'd3)? { line[127:88],  write_data[23:0], line[63:0] } :
120
    (address[3:0] == 4'd9   && length == 3'd3)? { line[127:96],  write_data[23:0], line[71:0] } :
121
    (address[3:0] == 4'd10  && length == 3'd3)? { line[127:104], write_data[23:0], line[79:0] } :
122
    (address[3:0] == 4'd11  && length == 3'd3)? { line[127:112], write_data[23:0], line[87:0] } :
123
    (address[3:0] == 4'd12  && length == 3'd3)? { line[127:120], write_data[23:0], line[95:0] } :
124
    (address[3:0] == 4'd13  && length == 3'd3)? {                write_data[23:0], line[103:0] } :
125
    (address[3:0] == 4'd0   && length == 3'd4)? { line[127:32],  write_data[31:0] } :
126
    (address[3:0] == 4'd1   && length == 3'd4)? { line[127:40],  write_data[31:0], line[7:0] } :
127
    (address[3:0] == 4'd2   && length == 3'd4)? { line[127:48],  write_data[31:0], line[15:0] } :
128
    (address[3:0] == 4'd3   && length == 3'd4)? { line[127:56],  write_data[31:0], line[23:0] } :
129
    (address[3:0] == 4'd4   && length == 3'd4)? { line[127:64],  write_data[31:0], line[31:0] } :
130
    (address[3:0] == 4'd5   && length == 3'd4)? { line[127:72],  write_data[31:0], line[39:0] } :
131
    (address[3:0] == 4'd6   && length == 3'd4)? { line[127:80],  write_data[31:0], line[47:0] } :
132
    (address[3:0] == 4'd7   && length == 3'd4)? { line[127:88],  write_data[31:0], line[55:0] } :
133
    (address[3:0] == 4'd8   && length == 3'd4)? { line[127:96],  write_data[31:0], line[63:0] } :
134
    (address[3:0] == 4'd9   && length == 3'd4)? { line[127:104], write_data[31:0], line[71:0] } :
135
    (address[3:0] == 4'd10  && length == 3'd4)? { line[127:112], write_data[31:0], line[79:0] } :
136
    (address[3:0] == 4'd11  && length == 3'd4)? { line[127:120], write_data[31:0], line[87:0] } :
137
                                                {                write_data[31:0], line[95:0] }; //(address[3:0] == 3'd12  && dlength == 3'd4)?  
138
 
139
//------------------------------------------------------------------------------
140
 
141
//------------------------------------------------------------------------------
142
 
143
// synthesis translate_off
144
wire _unused_ok = &{ 1'b0, address[31:4], 1'b0 };
145
// synthesis translate_on
146
 
147
//------------------------------------------------------------------------------
148
 
149
//------------------------------------------------------------------------------
150
 
151
 
152
endmodule

powered by: WebSVN 2.1.0

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