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

Subversion Repositories thor

[/] [thor/] [trunk/] [FT64v5/] [rtl/] [common/] [FT64_RMW_alu.v] - Blame information for rev 48

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 48 robfinch
// ============================================================================
2
//        __
3
//   \\__/ o\    (C) 2018  Robert Finch, Waterloo
4
//    \  __ /    All rights reserved.
5
//     \/_//     robfinch<remove>@finitron.ca
6
//       ||
7
//
8
//      FT64_RMW_alu.v
9
//
10
// This source file is free software: you can redistribute it and/or modify 
11
// it under the terms of the GNU Lesser General Public License as published 
12
// by the Free Software Foundation, either version 3 of the License, or     
13
// (at your option) any later version.                                      
14
//                                                                          
15
// This source file is distributed in the hope that it will be useful,      
16
// but WITHOUT ANY WARRANTY; without even the implied warranty of           
17
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            
18
// GNU General Public License for more details.                             
19
//                                                                          
20
// You should have received a copy of the GNU General Public License        
21
// along with this program.  If not, see <http://www.gnu.org/licenses/>.    
22
//
23
//
24
// ALU for atomic memory operations (AMO)
25
// AMO ops have their own limited ALU since they can't wait on the usual
26
// ALU.
27
// ============================================================================
28
//
29
`include "FT64_defines.vh"
30
 
31
module FT64_RMW_alu(instr, a, b, c, res);
32
input [47:0] instr;
33
input [63:0] a;
34
input [63:0] b;
35
input [63:0] c;
36
output reg [63:0] res;
37
 
38
wire [4:0] op = instr[30:26];
39
 
40
always @*
41
begin
42
case(instr[5:0])
43
`R2:
44
        case(instr[31:26])
45
        `INC:           begin
46
                                res[63:0] <= a + b;
47
                                end
48
        default:        res[63:0] <= 64'hDEADDEADDEADDEAD;
49
        endcase
50
`AMO:
51
        case(op)
52
        `AMO_SWAP:      res[63:0] <= b;
53
        `AMO_ADD:       case(instr[23:21])
54
                                3'd0,3'd4:
55
                                        begin
56
                                                res[7:0] <= a[7:0] + b[7:0];
57
                                                res[15:8] <= a[15:8] + b[15:8];
58
                                                res[23:16] <= a[23:16] + b[23:16];
59
                                                res[31:24] <= a[31:24] + b[31:24];
60
                                                res[39:32] <= a[39:32] + b[39:32];
61
                                                res[47:40] <= a[47:40] + b[47:40];
62
                                                res[55:48] <= a[55:48] + b[55:48];
63
                                                res[63:56] <= a[63:56] + b[63:56];
64
                                        end
65
                                3'd1,3'd5:
66
                                        begin
67
                                                res[15:0] <= a[15:0] + b[15:0];
68
                                                res[31:16] <= a[31:16] + b[31:16];
69
                                                res[47:32] <= a[47:32] + b[47:32];
70
                                                res[63:48] <= a[63:48] + b[63:48];
71
                                        end
72
                                3'd2,3'd6:
73
                                        begin
74
                                                res[31:0] <= a[31:0] + b[31:0];
75
                                                res[63:32] <= a[63:32] + b[63:32];
76
                                        end
77
                                3'd3,3'd7:
78
                                                begin
79
                                                res[63:0] <= a + b;
80
                                                end
81
                                endcase
82
        `AMO_AND:
83
                begin
84
                res[63:0] <= a & b;
85
                end
86
        `AMO_OR:        begin
87
                                res[63:0] <= a | b;
88
                                end
89
        `AMO_XOR:       begin
90
                                res[63:0] <= a ^ b;
91
                                end
92
        `AMO_SHL:
93
                case(instr[23:21])
94
                3'd0,3'd4:
95
                        begin
96
                                res[7:0] <= a[7:0] << b[2:0];
97
                                res[15:8] <= a[15:8] << b[2:0];
98
                                res[23:16] <= a[23:16] << b[2:0];
99
                                res[31:24] <= a[31:24] << b[2:0];
100
                                res[39:32] <= a[39:32] << b[2:0];
101
                                res[47:40] <= a[47:40] << b[2:0];
102
                                res[55:48] <= a[55:48] << b[2:0];
103
                                res[63:56] <= a[63:56] << b[2:0];
104
                        end
105
                3'd1,3'd5:
106
                        begin
107
                                res[15:0] <= a[15:0] << b[3:0];
108
                                res[31:16] <= a[31:16] << b[3:0];
109
                                res[47:32] <= a[47:32] << b[3:0];
110
                                res[63:48] <= a[63:48] << b[3:0];
111
                        end
112
                3'd2,3'd6:
113
                        begin
114
                                res[31:0] <= a[31:0] << b[4:0];
115
                                res[63:32] <= a[63:32] << b[4:0];
116
                        end
117
                3'd3,3'd7:
118
                        begin
119
                                res[63:0] <= a << b[5:0];
120
                                res[64] <= a[64];
121
                        end
122
                endcase
123
        `AMO_SHR:
124
                case(instr[23:21])
125
                3'd0,3'd4:
126
                        begin
127
                                res[7:0] <= a[7:0] >> b[2:0];
128
                                res[15:8] <= a[15:8] >> b[2:0];
129
                                res[23:16] <= a[23:16] >> b[2:0];
130
                                res[31:24] <= a[31:24] >> b[2:0];
131
                                res[39:32] <= a[39:32] >> b[2:0];
132
                                res[47:40] <= a[47:40] >> b[2:0];
133
                                res[55:48] <= a[55:48] >> b[2:0];
134
                                res[63:56] <= a[63:56] >> b[2:0];
135
                        end
136
                3'd1,3'd5:
137
                        begin
138
                                res[15:0] <= a[15:0] >> b[3:0];
139
                                res[31:16] <= a[31:16] >> b[3:0];
140
                                res[47:32] <= a[47:32] >> b[3:0];
141
                                res[63:48] <= a[63:48] >> b[3:0];
142
                        end
143
                3'd2,3'd6:
144
                        begin
145
                                res[31:0] <= a[31:0] >> b[4:0];
146
                                res[63:32] <= a[63:32] >> b[4:0];
147
                        end
148
                3'd3,3'd7:
149
                        begin
150
                                res[63:0] <= a >> b[5:0];
151
                                res[64] <= a[64];
152
                        end
153
                endcase
154
        `AMO_MIN:
155
                case(instr[23:21])
156
                3'd0,3'd4:
157
                        begin
158
                                res[7:0] <= $signed(a[7:0]) < $signed(b[7:0]) ? a[7:0] : b[7:0];
159
                                res[15:8] <= $signed(a[15:8]) < $signed(b[15:8]) ? a[15:8] : b[15:8];
160
                                res[23:16] <= $signed(a[23:16]) < $signed(b[23:16]) ? a[23:16] : b[23:16];
161
                                res[31:24] <= $signed(a[31:24]) < $signed(b[31:24]) ? a[31:24] : b[31:24];
162
                                res[39:32] <= $signed(a[39:32]) < $signed(b[39:32]) ? a[39:32] : b[39:32];
163
                                res[47:40] <= $signed(a[47:40]) < $signed(b[47:40]) ? a[47:40] : b[47:40];
164
                                res[55:48] <= $signed(a[55:48]) < $signed(b[55:48]) ? a[55:48] : b[55:48];
165
                                res[63:56] <= $signed(a[63:56]) < $signed(b[63:56]) ? a[63:56] : b[63:56];
166
                        end
167
                3'd1,3'd5:
168
                        begin
169
                                res[15:0] <= $signed(a[15:0]) < $signed(b[15:0]) ? a[15:0] : b[15:0];
170
                                res[31:16] <= $signed(a[31:16]) < $signed(b[31:16]) ? a[31:16] : b[31:16];
171
                                res[47:32] <= $signed(a[47:32]) < $signed(b[47:32]) ? a[47:32] : b[47:32];
172
                                res[63:48] <= $signed(a[63:48]) < $signed(b[63:48]) ? a[63:48] : b[63:48];
173
                        end
174
                3'd2,3'd6:
175
                        begin
176
                                res[31:0] <= $signed(a[31:0]) < $signed(b[31:0]) ? a[31:0] : b[31:0];
177
                                res[63:32] <= $signed(a[63:32]) < $signed(b[63:32]) ? a[63:32] : b[63:32];
178
                        end
179
                3'd3,3'd7:
180
                        begin
181
                        res[63:0] <= $signed(a) < $signed(b) ? a : b;
182
                        end
183
                endcase
184
        `AMO_MAX:
185
                case(instr[23:21])
186
                3'd0,3'd4:
187
                        begin
188
                                res[7:0] <= $signed(a[7:0]) > $signed(b[7:0]) ? a[7:0] : b[7:0];
189
                                res[15:8] <= $signed(a[15:8]) > $signed(b[15:8]) ? a[15:8] : b[15:8];
190
                                res[23:16] <= $signed(a[23:16]) > $signed(b[23:16]) ? a[23:16] : b[23:16];
191
                                res[31:24] <= $signed(a[31:24]) > $signed(b[31:24]) ? a[31:24] : b[31:24];
192
                                res[39:32] <= $signed(a[39:32]) > $signed(b[39:32]) ? a[39:32] : b[39:32];
193
                                res[47:40] <= $signed(a[47:40]) > $signed(b[47:40]) ? a[47:40] : b[47:40];
194
                                res[55:48] <= $signed(a[55:48]) > $signed(b[55:48]) ? a[55:48] : b[55:48];
195
                                res[63:56] <= $signed(a[63:56]) > $signed(b[63:56]) ? a[63:56] : b[63:56];
196
                        end
197
                3'd1,3'd5:
198
                        begin
199
                                res[15:0] <= $signed(a[15:0]) > $signed(b[15:0]) ? a[15:0] : b[15:0];
200
                                res[31:16] <= $signed(a[31:16]) > $signed(b[31:16]) ? a[31:16] : b[31:16];
201
                                res[47:32] <= $signed(a[47:32]) > $signed(b[47:32]) ? a[47:32] : b[47:32];
202
                                res[63:48] <= $signed(a[63:48]) > $signed(b[63:48]) ? a[63:48] : b[63:48];
203
                        end
204
                3'd2,3'd6:
205
                        begin
206
                                res[31:0] <= $signed(a[31:0]) > $signed(b[31:0]) ? a[31:0] : b[31:0];
207
                                res[63:32] <= $signed(a[63:32]) > $signed(b[63:32]) ? a[63:32] : b[63:32];
208
                        end
209
                3'd3,3'd7:
210
                        begin
211
                                res[63:0] <= $signed(a) > $signed(b) ? a : b;
212
                        end
213
                endcase
214
        `AMO_MINU:
215
                case(instr[23:21])
216
                3'd0,3'd4:
217
                        begin
218
                                res[7:0] <= $unsigned(a[7:0]) < $unsigned(b[7:0]) ? a[7:0] : b[7:0];
219
                                res[15:8] <= $unsigned(a[15:8]) < $unsigned(b[15:8]) ? a[15:8] : b[15:8];
220
                                res[23:16] <= $unsigned(a[23:16]) < $unsigned(b[23:16]) ? a[23:16] : b[23:16];
221
                                res[31:24] <= $unsigned(a[31:24]) < $unsigned(b[31:24]) ? a[31:24] : b[31:24];
222
                                res[39:32] <= $unsigned(a[39:32]) < $unsigned(b[39:32]) ? a[39:32] : b[39:32];
223
                                res[47:40] <= $unsigned(a[47:40]) < $unsigned(b[47:40]) ? a[47:40] : b[47:40];
224
                                res[55:48] <= $unsigned(a[55:48]) < $unsigned(b[55:48]) ? a[55:48] : b[55:48];
225
                                res[63:56] <= $unsigned(a[63:56]) < $unsigned(b[63:56]) ? a[63:56] : b[63:56];
226
                        end
227
                3'd1,3'd5:
228
                        begin
229
                                res[15:0] <= $unsigned(a[15:0]) < $unsigned(b[15:0]) ? a[15:0] : b[15:0];
230
                                res[31:16] <= $unsigned(a[31:16]) < $unsigned(b[31:16]) ? a[31:16] : b[31:16];
231
                                res[47:32] <= $unsigned(a[47:32]) < $unsigned(b[47:32]) ? a[47:32] : b[47:32];
232
                                res[63:48] <= $unsigned(a[63:48]) < $unsigned(b[63:48]) ? a[63:48] : b[63:48];
233
                        end
234
                3'd2,3'd6:
235
                        begin
236
                                res[31:0] <= $unsigned(a[31:0]) < $unsigned(b[31:0]) ? a[31:0] : b[31:0];
237
                                res[63:32] <= $unsigned(a[63:32]) < $unsigned(b[63:32]) ? a[63:32] : b[63:32];
238
                        end
239
                3'd3,3'd7:
240
                        begin
241
                                res[63:0] <= $unsigned(a) < $unsigned(b) ? a : b;
242
                        end
243
                endcase
244
        `AMO_MAXU:
245
                case(instr[23:21])
246
                3'd0,3'd4:
247
                        begin
248
                                res[7:0] <= $unsigned(a[7:0]) > $unsigned(b[7:0]) ? a[7:0] : b[7:0];
249
                                res[15:8] <= $unsigned(a[15:8]) > $unsigned(b[15:8]) ? a[15:8] : b[15:8];
250
                                res[23:16] <= $unsigned(a[23:16]) > $unsigned(b[23:16]) ? a[23:16] : b[23:16];
251
                                res[31:24] <= $unsigned(a[31:24]) > $unsigned(b[31:24]) ? a[31:24] : b[31:24];
252
                                res[39:32] <= $unsigned(a[39:32]) > $unsigned(b[39:32]) ? a[39:32] : b[39:32];
253
                                res[47:40] <= $unsigned(a[47:40]) > $unsigned(b[47:40]) ? a[47:40] : b[47:40];
254
                                res[55:48] <= $unsigned(a[55:48]) > $unsigned(b[55:48]) ? a[55:48] : b[55:48];
255
                                res[63:56] <= $unsigned(a[63:56]) > $unsigned(b[63:56]) ? a[63:56] : b[63:56];
256
                        end
257
                3'd1,3'd5:
258
                        begin
259
                                res[15:0] <= $unsigned(a[15:0]) > $unsigned(b[15:0]) ? a[15:0] : b[15:0];
260
                                res[31:16] <= $unsigned(a[31:16]) > $unsigned(b[31:16]) ? a[31:16] : b[31:16];
261
                                res[47:32] <= $unsigned(a[47:32]) > $unsigned(b[47:32]) ? a[47:32] : b[47:32];
262
                                res[63:48] <= $unsigned(a[63:48]) > $unsigned(b[63:48]) ? a[63:48] : b[63:48];
263
                        end
264
                3'd2,3'd6:
265
                        begin
266
                                res[31:0] <= $unsigned(a[31:0]) > $unsigned(b[31:0]) ? a[31:0] : b[31:0];
267
                                res[63:32] <= $unsigned(a[63:32]) > $unsigned(b[63:32]) ? a[63:32] : b[63:32];
268
                        end
269
                3'd3,3'd7:
270
                        begin
271
                                res[63:0] <= $unsigned(a) > $unsigned(b) ? a : b;
272
                        end
273
                endcase
274
        default:        res[63:0] <= 64'hDEADDEADDEADDEAD;
275
        endcase
276
`INC:           begin
277
                        res[63:0] <= a + b;
278
                        end
279
default:        res[63:0] <= 64'hDEADDEADDEADDEAD;
280
endcase
281
end
282
endmodule

powered by: WebSVN 2.1.0

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