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

Subversion Repositories thor

[/] [thor/] [trunk/] [FT64v5/] [rtl/] [common/] [FT64_idecoder.v] - Blame information for rev 55

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 48 robfinch
// ============================================================================
2
//        __
3
//   \\__/ o\    (C) 2017-2018  Robert Finch, Waterloo
4
//    \  __ /    All rights reserved.
5
//     \/_//     robfinch<remove>@finitron.ca
6
//       ||
7
//
8
//      FT64_idecoder.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
//
25 52 robfinch
`include ".\FT64_config.vh"
26 48 robfinch
`include ".\FT64_defines.vh"
27
 
28
module FT64_idecoder(clk,idv_i,id_i,instr,vl,ven,thrd,predict_taken,Rt,bus,id_o,idv_o);
29
input clk;
30
input idv_i;
31
input [4:0] id_i;
32
input [47:0] instr;
33
input [7:0] vl;
34
input [5:0] ven;
35
input thrd;
36
input predict_taken;
37
input [4:0] Rt;
38 51 robfinch
output reg [143:0] bus;
39 48 robfinch
output reg [4:0] id_o;
40
output reg idv_o;
41
 
42
parameter TRUE = 1'b1;
43
parameter FALSE = 1'b0;
44 50 robfinch
// Memory access sizes
45
parameter byt = 3'd0;
46
parameter wyde = 3'd1;
47
parameter tetra = 3'd2;
48
parameter octa = 3'd3;
49 48 robfinch
 
50
// Really IsPredictableBranch
51
// Does not include BccR's
52
//function IsBranch;
53
//input [47:0] isn;
54
//casez(isn[`INSTRUCTION_OP])
55
//`Bcc:   IsBranch = TRUE;
56
//`BBc:   IsBranch = TRUE;
57
//`BEQI:  IsBranch = TRUE;
58
//`CHK:   IsBranch = TRUE;
59
//default:    IsBranch = FALSE;
60
//endcase
61
//endfunction
62
 
63 53 robfinch
wire [10:0] brdisp = instr[31:21];
64
 
65 48 robfinch
wire iAlu;
66
mIsALU uialu1
67
(
68
        .instr(instr),
69
        .IsALU(iAlu)
70
);
71
 
72
 
73
reg IsALU;
74
always @*
75
case(instr[`INSTRUCTION_OP])
76 50 robfinch
`R2:
77
        if (instr[`INSTRUCTION_L2]==2'b00)
78
                case(instr[`INSTRUCTION_S2])
79
                `VMOV:          IsALU = TRUE;
80
    `RTI:       IsALU = FALSE;
81
    default:    IsALU = TRUE;
82
    endcase
83
  else
84
        IsALU = TRUE;
85 48 robfinch
`BRK:   IsALU = FALSE;
86
`Bcc:   IsALU = FALSE;
87
`BBc:   IsALU = FALSE;
88
`BEQI:  IsALU = FALSE;
89
`CHK:   IsALU = FALSE;
90
`JAL:   IsALU = FALSE;
91
`JMP:   IsALU = FALSE;
92
`CALL:  IsALU = FALSE;
93
`RET:   IsALU = FALSE;
94
`FVECTOR:
95 50 robfinch
        case(instr[`INSTRUCTION_S2])
96
  `VSHL,`VSHR,`VASR:  IsALU = TRUE;
97
  default:    IsALU = FALSE;  // Integer
98
  endcase
99 48 robfinch
`IVECTOR:
100 50 robfinch
        case(instr[`INSTRUCTION_S2])
101
  `VSHL,`VSHR,`VASR:  IsALU = TRUE;
102
  default:    IsALU = TRUE;  // Integer
103
  endcase
104 48 robfinch
`FLOAT:         IsALU = FALSE;
105
default:    IsALU = TRUE;
106
endcase
107
 
108
function IsAlu0Only;
109
input [47:0] isn;
110
begin
111
case(isn[`INSTRUCTION_OP])
112
`R2:
113
        if (isn[`INSTRUCTION_L2]==2'b00)
114
                case(isn[`INSTRUCTION_S2])
115
                `R1:        IsAlu0Only = TRUE;
116
                `SHIFTR,`SHIFT31,`SHIFT63:
117 51 robfinch
                        IsAlu0Only = !(instr[25:23]==`SHL || instr[25:23]==`ASL);
118 48 robfinch
                `MULU,`MULSU,`MUL,
119 50 robfinch
                `MULUH,`MULSUH,`MULH,
120
                `MODU,`MODSU,`MOD: IsAlu0Only = TRUE;
121
                `DIVU,`DIVSU,`DIV: IsAlu0Only = TRUE;
122 48 robfinch
                `MIN,`MAX:  IsAlu0Only = TRUE;
123
                default:    IsAlu0Only = FALSE;
124
                endcase
125
        else
126
                IsAlu0Only = FALSE;
127
`MEMNDX:        IsAlu0Only = TRUE;
128
`IVECTOR,`FVECTOR:
129
        case(isn[`INSTRUCTION_S2])
130
        `VSHL,`VSHR,`VASR:  IsAlu0Only = TRUE;
131
        default: IsAlu0Only = FALSE;
132
        endcase
133
`BITFIELD:  IsAlu0Only = TRUE;
134
`MULUI,`MULI,
135
`DIVUI,`DIVI,
136
`MODI:   IsAlu0Only = TRUE;
137
`CSRRW: IsAlu0Only = TRUE;
138
default:    IsAlu0Only = FALSE;
139
endcase
140
end
141
endfunction
142
 
143
function IsFPU;
144
input [47:0] isn;
145
begin
146
case(isn[`INSTRUCTION_OP])
147
`FLOAT: IsFPU = TRUE;
148
`FVECTOR:
149
                    case(isn[`INSTRUCTION_S2])
150
            `VSHL,`VSHR,`VASR:  IsFPU = FALSE;
151
            default:    IsFPU = TRUE;
152
            endcase
153
default:    IsFPU = FALSE;
154
endcase
155
end
156
endfunction
157
 
158
reg IsFlowCtrl;
159
 
160
always @*
161
case(instr[`INSTRUCTION_OP])
162
`BRK:    IsFlowCtrl <= TRUE;
163 49 robfinch
`R2:    case(instr[`INSTRUCTION_S2])
164 48 robfinch
        `RTI:   IsFlowCtrl <= TRUE;
165
        default:    IsFlowCtrl <= FALSE;
166
        endcase
167
`Bcc:   IsFlowCtrl <= TRUE;
168
`BBc:           IsFlowCtrl <= TRUE;
169
`BEQI:  IsFlowCtrl <= TRUE;
170
`CHK:   IsFlowCtrl <= TRUE;
171
`JAL:   IsFlowCtrl <= TRUE;
172
`JMP:           IsFlowCtrl <= TRUE;
173
`CALL:  IsFlowCtrl <= TRUE;
174
`RET:   IsFlowCtrl <= TRUE;
175
default:    IsFlowCtrl <= FALSE;
176
endcase
177
 
178
//function IsFlowCtrl;
179
//input [47:0] isn;
180
//begin
181
//case(isn[`INSTRUCTION_OP])
182
//`BRK:    IsFlowCtrl = TRUE;
183
//`RR:    case(isn[`INSTRUCTION_S2])
184
//        `RTI:   IsFlowCtrl = TRUE;
185
//        default:    IsFlowCtrl = FALSE;
186
//        endcase
187
//`Bcc:   IsFlowCtrl = TRUE;
188
//`BBc:         IsFlowCtrl = TRUE;
189
//`BEQI:  IsFlowCtrl = TRUE;
190
//`CHK:   IsFlowCtrl = TRUE;
191
//`JAL:   IsFlowCtrl = TRUE;
192
//`JMP:         IsFlowCtrl = TRUE;
193
//`CALL:  IsFlowCtrl = TRUE;
194
//`RET:   IsFlowCtrl = TRUE;
195
//default:    IsFlowCtrl = FALSE;
196
//endcase
197
//end
198
//endfunction
199
 
200
// fnCanException
201
//
202 53 robfinch
// Used by memory issue logic (stores).
203 48 robfinch
// Returns TRUE if the instruction can cause an exception.
204
// In debug mode any instruction could potentially cause a breakpoint exception.
205
// Rather than check all the addresses for potential debug exceptions it's
206
// simpler to just have it so that all instructions could exception. This will
207
// slow processing down somewhat as stores will only be done at the head of the
208
// instruction queue, but it's debug mode so we probably don't care.
209
//
210
function fnCanException;
211
input [47:0] isn;
212
begin
213
// ToDo add debug_on as input
214
`ifdef SUPPORT_DBG
215
if (debug_on)
216
    fnCanException = `TRUE;
217
else
218
`endif
219
case(isn[`INSTRUCTION_OP])
220
`FLOAT:
221
    case(isn[`INSTRUCTION_S2])
222
    `FDIV,`FMUL,`FADD,`FSUB,`FTX:
223
        fnCanException = `TRUE;
224
    default:    fnCanException = `FALSE;
225
    endcase
226 53 robfinch
`DIVI,`MODI,`MULI:
227 48 robfinch
    fnCanException = `TRUE;
228
`R2:
229
    case(isn[`INSTRUCTION_S2])
230 53 robfinch
    `MUL,
231 50 robfinch
    `DIV,`MULSU,`DIVSU,
232
    `MOD,`MODSU:
233
       fnCanException = TRUE;
234 48 robfinch
    `RTI:   fnCanException = TRUE;
235
    default:    fnCanException = FALSE;
236
    endcase
237 53 robfinch
// Had branches that could exception if looping to self. But in a tight loop
238
// it affects store performance.
239
// -> A branch may only exception if it loops back to itself.
240
`Bcc,`BBc,`BEQI:        fnCanException = isn[7] ? brdisp == 11'h7FF : brdisp == 11'h7FE;
241 48 robfinch
`CHK:   fnCanException = TRUE;
242
default:
243 49 robfinch
// Stores can stil exception if there is a write buffer, but we allow following
244
// stores to be issued by ignoring the fact they can exception because the stores
245
// can be undone by invalidating the write buffer.
246
`ifdef HAS_WB
247 53 robfinch
    fnCanException = IsMem(isn) && !IsStore(isn);
248 49 robfinch
`else
249 48 robfinch
    fnCanException = IsMem(isn);
250 49 robfinch
`endif
251 48 robfinch
endcase
252
end
253
endfunction
254
 
255
function IsLoad;
256
input [47:0] isn;
257
case(isn[`INSTRUCTION_OP])
258
`MEMNDX:
259
        if (isn[`INSTRUCTION_L2]==2'b00)
260 50 robfinch
    case(isn[`INSTRUCTION_S2])
261
    `LBX:   IsLoad = TRUE;
262
    `LBUX:  IsLoad = TRUE;
263
    `LCX:   IsLoad = TRUE;
264
    `LCUX:  IsLoad = TRUE;
265
    `LHX:   IsLoad = TRUE;
266
    `LHUX:  IsLoad = TRUE;
267
    `LWX:   IsLoad = TRUE;
268
    `LVBX:  IsLoad = TRUE;
269
    `LVBUX: IsLoad = TRUE;
270
    `LVCX:  IsLoad = TRUE;
271
    `LVCUX: IsLoad = TRUE;
272
    `LVHX:  IsLoad = TRUE;
273
    `LVHUX: IsLoad = TRUE;
274
    `LVWX:  IsLoad = TRUE;
275
    `LWRX:  IsLoad = TRUE;
276
    `LVX:   IsLoad = TRUE;
277
    default: IsLoad = FALSE;
278
    endcase
279 48 robfinch
        else
280
                IsLoad = FALSE;
281
`LB:    IsLoad = TRUE;
282
`LBU:   IsLoad = TRUE;
283
`Lx:    IsLoad = TRUE;
284
`LxU:   IsLoad = TRUE;
285
`LWR:   IsLoad = TRUE;
286
`LV:    IsLoad = TRUE;
287
`LVx:   IsLoad = TRUE;
288
default:    IsLoad = FALSE;
289
endcase
290
endfunction
291
 
292 50 robfinch
function IsVolatileLoad;
293
input [47:0] isn;
294
case(isn[`INSTRUCTION_OP])
295
`MEMNDX:
296
        if (isn[`INSTRUCTION_L2]==2'b00)
297
    case(isn[`INSTRUCTION_S2])
298
    `LWRX:      IsVolatileLoad = TRUE;
299
    `LVBX:      IsVolatileLoad = TRUE;
300
    `LVBUX:     IsVolatileLoad = TRUE;
301
    `LVCX:      IsVolatileLoad = TRUE;
302
    `LVCUX:     IsVolatileLoad = TRUE;
303
    `LVHX:      IsVolatileLoad = TRUE;
304
    `LVHUX:     IsVolatileLoad = TRUE;
305
    `LVWX:      IsVolatileLoad = TRUE;
306
    default: IsVolatileLoad = FALSE;
307
    endcase
308
        else
309
                IsVolatileLoad = FALSE;
310
`LWR:   IsVolatileLoad = TRUE;
311
`LVx:   IsVolatileLoad = TRUE;
312
default:    IsVolatileLoad = FALSE;
313
endcase
314
endfunction
315
 
316
function IsStore;
317
input [47:0] isn;
318
case(isn[`INSTRUCTION_OP])
319
`MEMNDX:
320
        if (isn[`INSTRUCTION_L2]==2'b00)
321
    case(isn[`INSTRUCTION_S2])
322
    `SBX:   IsStore = TRUE;
323
    `SCX:   IsStore = TRUE;
324
    `SHX:   IsStore = TRUE;
325
    `SWX:   IsStore = TRUE;
326
    `SWCX:  IsStore = TRUE;
327
    `SVX:   IsStore = TRUE;
328
    `CASX:  IsStore = TRUE;
329
    `INC:       IsStore = TRUE;
330
    default:    IsStore = FALSE;
331
    endcase
332
        else
333
                IsStore = FALSE;
334
`SB:    IsStore = TRUE;
335
`Sx:    IsStore = TRUE;
336
`SWC:   IsStore = TRUE;
337
`INC:   IsStore = TRUE;
338
`SV:    IsStore = TRUE;
339
`CAS:   IsStore = TRUE;
340
`AMO:   IsStore = TRUE;
341
default:    IsStore = FALSE;
342
endcase
343
endfunction
344
 
345 48 robfinch
function [0:0] IsMem;
346
input [47:0] isn;
347
case(isn[`INSTRUCTION_OP])
348
`MEMNDX:        IsMem = TRUE;
349
`AMO:           IsMem = TRUE;
350
`LB:    IsMem = TRUE;
351
`LBU:   IsMem = TRUE;
352
`Lx:    IsMem = TRUE;
353
`LxU:   IsMem = TRUE;
354
`LWR:   IsMem = TRUE;
355
`LV,`SV:    IsMem = TRUE;
356
`INC:           IsMem = TRUE;
357
`SB:    IsMem = TRUE;
358
`Sx:    IsMem = TRUE;
359
`SWC:   IsMem = TRUE;
360
`CAS:   IsMem = TRUE;
361
`LVx:           IsMem = TRUE;
362
default:    IsMem = FALSE;
363
endcase
364
endfunction
365
 
366
function IsMemNdx;
367
input [47:0] isn;
368
case(isn[`INSTRUCTION_OP])
369
`MEMNDX:        IsMemNdx = TRUE;
370
default:    IsMemNdx = FALSE;
371
endcase
372
endfunction
373
 
374 50 robfinch
function [2:0] MemSize;
375
input [47:0] isn;
376
case(isn[`INSTRUCTION_OP])
377
`MEMNDX:
378
        if (isn[`INSTRUCTION_L2]==2'b00)
379
    case(isn[`INSTRUCTION_S2])
380
    `LVBX,`LVBUX:       MemSize = byt;
381
    `LBX,`LBUX,`SBX:   MemSize = byt;
382
    `LVCX,`LVCUX:                        MemSize = wyde;
383
    `LCX,`LCUX,`SCX:   MemSize = wyde;
384
    `LVHX,`LVHUX:               MemSize = tetra;
385
    `LHX,`SHX:   MemSize = tetra;
386
    `LHUX: MemSize = tetra;
387
    `LVWX:                       MemSize = octa;
388
    `LWX,`SWX:   MemSize = octa;
389
    `LWRX,`SWCX: MemSize = octa;
390
    `LVX,`SVX:   MemSize = octa;
391
    `LVx:
392
        case(isn[25:23])
393
        3'd0,3'd1:      MemSize = byt;
394
        3'd2,3'd3:      MemSize = wyde;
395
        3'd4,3'd5:      MemSize = tetra;
396
        default:        MemSize = octa;
397
        endcase
398
    default: MemSize = octa;
399
    endcase
400
        else
401
                MemSize = octa;
402
`LB,`LBU,`SB:    MemSize = byt;
403
`Lx,`LxU,`Sx,`LVx:
404
        casez(isn[20:18])
405
        3'b100: MemSize = octa;
406
        3'b?10: MemSize = tetra;
407
        3'b??1: MemSize = wyde;
408
        default:        MemSize = octa;
409
        endcase
410
`LWR,`SWC:  MemSize = octa;
411
`LV,`SV:    MemSize = octa;
412
`AMO:
413
        case(isn[23:21])
414
        3'd0:   MemSize = byt;
415
        3'd1:   MemSize = wyde;
416
        3'd2:   MemSize = tetra;
417
        3'd3:   MemSize = octa;
418
        default:        MemSize = octa;
419
        endcase
420
default:    MemSize = octa;
421
endcase
422
endfunction
423
 
424 48 robfinch
function IsCAS;
425
input [47:0] isn;
426
case(isn[`INSTRUCTION_OP])
427
`MEMNDX:
428
        if (isn[`INSTRUCTION_L2]==2'b00)
429
            case(isn[`INSTRUCTION_S2])
430
            `CASX:   IsCAS = TRUE;
431
            default:    IsCAS = FALSE;
432
            endcase
433
        else
434
                IsCAS = FALSE;
435
`CAS:       IsCAS = TRUE;
436
default:    IsCAS = FALSE;
437
endcase
438
endfunction
439
 
440
function IsAMO;
441
input [47:0] isn;
442
case(isn[`INSTRUCTION_OP])
443
`AMO:       IsAMO = TRUE;
444
default:    IsAMO = FALSE;
445
endcase
446
endfunction
447
 
448
function IsInc;
449
input [47:0] isn;
450
case(isn[`INSTRUCTION_OP])
451
`MEMNDX:
452
        if (isn[`INSTRUCTION_L2]==2'b00)
453
                case(isn[`INSTRUCTION_S2])
454
            `INC:   IsInc = TRUE;
455
            default:    IsInc = FALSE;
456
            endcase
457
        else
458
                IsInc = FALSE;
459
`INC:    IsInc = TRUE;
460
default:    IsInc = FALSE;
461
endcase
462
endfunction
463
 
464
function IsSync;
465
input [47:0] isn;
466
IsSync = (isn[`INSTRUCTION_OP]==`R2 && isn[`INSTRUCTION_L2]==2'b00 && isn[`INSTRUCTION_S2]==`R1 && isn[22:18]==`SYNC);
467
endfunction
468
 
469
function IsFSync;
470
input [47:0] isn;
471
IsFSync = (isn[`INSTRUCTION_OP]==`FLOAT && isn[`INSTRUCTION_L2]==2'b00 && isn[`INSTRUCTION_S2]==`FSYNC);
472
endfunction
473
 
474
function IsMemdb;
475
input [47:0] isn;
476
IsMemdb = (isn[`INSTRUCTION_OP]==`R2 && isn[`INSTRUCTION_L2]==2'b00 && isn[`INSTRUCTION_S2]==`R1 && isn[22:18]==`MEMDB);
477
endfunction
478
 
479
function IsMemsb;
480
input [47:0] isn;
481
IsMemsb = (isn[`INSTRUCTION_OP]==`RR && isn[`INSTRUCTION_L2]==2'b00 && isn[`INSTRUCTION_S2]==`R1 && isn[22:18]==`MEMSB);
482
endfunction
483
 
484
function IsSEI;
485
input [47:0] isn;
486
IsSEI = (isn[`INSTRUCTION_OP]==`R2 && isn[`INSTRUCTION_L2]==2'b00 && isn[`INSTRUCTION_S2]==`SEI);
487
endfunction
488
 
489
function IsShift48;
490
input [47:0] isn;
491
case(isn[`INSTRUCTION_OP])
492
`R2:
493
        if (isn[`INSTRUCTION_L2]==2'b01)
494
            case(isn[47:42])
495
            `SHIFTR: IsShift48 = TRUE;
496
            default: IsShift48 = FALSE;
497
            endcase
498
    else
499
        IsShift48 = FALSE;
500
default: IsShift48 = FALSE;
501
endcase
502
endfunction
503
 
504
function IsLWRX;
505
input [47:0] isn;
506
case(isn[`INSTRUCTION_OP])
507
`MEMNDX:
508
        if (isn[`INSTRUCTION_L2]==2'b00)
509
            case(isn[`INSTRUCTION_S2])
510
            `LWRX:   IsLWRX = TRUE;
511
            default:    IsLWRX = FALSE;
512
            endcase
513
        else
514
                IsLWRX = FALSE;
515
default:    IsLWRX = FALSE;
516
endcase
517
endfunction
518
 
519
// Aquire / release bits are only available on indexed SWC / LWR
520
function IsSWCX;
521
input [47:0] isn;
522
case(isn[`INSTRUCTION_OP])
523
`MEMNDX:
524
        if (isn[`INSTRUCTION_L2]==2'b00)
525
            case(isn[`INSTRUCTION_S2])
526
            `SWCX:   IsSWCX = TRUE;
527
            default:    IsSWCX = FALSE;
528
            endcase
529
        else
530
                IsSWCX = FALSE;
531
default:    IsSWCX = FALSE;
532
endcase
533
endfunction
534
 
535
function IsJmp;
536
input [47:0] isn;
537 51 robfinch
IsJmp = isn[`INSTRUCTION_OP]==`JMP;// && isn[7]==1'b0;
538 48 robfinch
endfunction
539
 
540
// Really IsPredictableBranch
541
// Does not include BccR's
542
function IsBranch;
543
input [47:0] isn;
544
casez(isn[`INSTRUCTION_OP])
545
`Bcc:   IsBranch = TRUE;
546
`BBc:   IsBranch = TRUE;
547
`BEQI:  IsBranch = TRUE;
548
`CHK:   IsBranch = TRUE;
549
default:    IsBranch = FALSE;
550
endcase
551
endfunction
552
 
553 51 robfinch
function IsJAL;
554
input [47:0] isn;
555
IsJAL = isn[`INSTRUCTION_OP]==`JAL;// && isn[7]==1'b0;
556
endfunction
557
 
558
function IsRet;
559
input [47:0] isn;
560
IsRet = isn[`INSTRUCTION_OP]==`RET;// && isn[7]==1'b0;
561
endfunction
562
 
563
function IsIrq;
564
input [47:0] isn;
565
IsIrq = isn[`INSTRUCTION_OP]==`BRK /*&& isn[`INSTRUCTION_L2]==2'b00*/ && isn[23:20]==4'h0;
566
endfunction
567
 
568 48 robfinch
function IsBrk;
569
input [47:0] isn;
570 51 robfinch
IsBrk = isn[`INSTRUCTION_OP]==`BRK;// && isn[`INSTRUCTION_L2]==2'b00;
571 48 robfinch
endfunction
572
 
573
function IsRti;
574
input [47:0] isn;
575 51 robfinch
IsRti = isn[`INSTRUCTION_OP]==`RR /*&& isn[`INSTRUCTION_L2]==2'b00*/ && isn[`INSTRUCTION_S2]==`RTI;
576 48 robfinch
endfunction
577
 
578
// Has an extendable 14-bit constant
579
function HasConst;
580
input [47:0] isn;
581
casez(isn[`INSTRUCTION_OP])
582
`ADDI:  HasConst = TRUE;
583
`SLTI:  HasConst = TRUE;
584
`SLTUI: HasConst = TRUE;
585
`SGTI:  HasConst = TRUE;
586
`SGTUI: HasConst = TRUE;
587
`ANDI:  HasConst = TRUE;
588
`ORI:   HasConst = TRUE;
589
`XORI:  HasConst = TRUE;
590
`XNORI: HasConst = TRUE;
591
`MULUI: HasConst = TRUE;
592
`MULI:  HasConst = TRUE;
593
`DIVUI: HasConst = TRUE;
594
`DIVI:  HasConst = TRUE;
595
`MODI:  HasConst = TRUE;
596
`LB:    HasConst = TRUE;
597
`LBU:   HasConst = TRUE;
598
`Lx:    HasConst = TRUE;
599
`LWR:           HasConst = TRUE;
600
`LV:    HasConst = TRUE;
601
`SB:    HasConst = TRUE;
602
`Sx:    HasConst = TRUE;
603
`SWC:   HasConst = TRUE;
604
`INC:           HasConst = TRUE;
605
`SV:    HasConst = TRUE;
606
`CAS:   HasConst = TRUE;
607
`JAL:   HasConst = TRUE;
608
`CALL:  HasConst = TRUE;
609
`RET:   HasConst = TRUE;
610
`LVx:           HasConst = TRUE;
611
default:    HasConst = FALSE;
612
endcase
613
endfunction
614
 
615 50 robfinch
function IsOddball;
616
input [47:0] instr;
617
//if (|iqentry_exc[head])
618
//    IsOddball = TRUE;
619
//else
620
case(instr[`INSTRUCTION_OP])
621
`BRK:   IsOddball = TRUE;
622
`IVECTOR:
623
    case(instr[`INSTRUCTION_S2])
624
    `VSxx:  IsOddball = TRUE;
625
    default:    IsOddball = FALSE;
626
    endcase
627
`RR:
628
    case(instr[`INSTRUCTION_S2])
629
    `VMOV:  IsOddball = TRUE;
630
    `SEI,`RTI: IsOddball = TRUE;
631
    default:    IsOddball = FALSE;
632
    endcase
633
`MEMNDX:
634
    case(instr[`INSTRUCTION_S2])
635
    `CACHEX: IsOddball = TRUE;
636
    default:    IsOddball = FALSE;
637
    endcase
638
`CSRRW,`REX,`CACHE,`FLOAT:  IsOddball = TRUE;
639
default:    IsOddball = FALSE;
640
endcase
641
endfunction
642
 
643 48 robfinch
function IsRFW;
644
input [47:0] isn;
645
casez(isn[`INSTRUCTION_OP])
646
`IVECTOR:   IsRFW = TRUE;
647
`FVECTOR:   IsRFW = TRUE;
648
`R2:
649
        if (isn[`INSTRUCTION_L2]==2'b00)
650 50 robfinch
    case(isn[`INSTRUCTION_S2])
651
    `R1:    IsRFW = TRUE;
652
    `ADD:   IsRFW = TRUE;
653
    `SUB:   IsRFW = TRUE;
654
    `SLT:   IsRFW = TRUE;
655
    `SLTU:  IsRFW = TRUE;
656
    `SLE:   IsRFW = TRUE;
657
    `SLEU:  IsRFW = TRUE;
658
    `AND:   IsRFW = TRUE;
659
    `OR:    IsRFW = TRUE;
660
    `XOR:   IsRFW = TRUE;
661
    `MULU:  IsRFW = TRUE;
662
    `MULSU: IsRFW = TRUE;
663
    `MUL:   IsRFW = TRUE;
664
    `MULUH:  IsRFW = TRUE;
665
    `MULSUH: IsRFW = TRUE;
666
    `MULH:   IsRFW = TRUE;
667
    `DIVU:  IsRFW = TRUE;
668
    `DIVSU: IsRFW = TRUE;
669
    `DIV:IsRFW = TRUE;
670
    `MODU:  IsRFW = TRUE;
671
    `MODSU: IsRFW = TRUE;
672
    `MOD:IsRFW = TRUE;
673
    `MOV:       IsRFW = TRUE;
674
    `VMOV:      IsRFW = TRUE;
675
    `SHIFTR,`SHIFT31,`SHIFT63:
676
                IsRFW = TRUE;
677
    `MIN,`MAX:    IsRFW = TRUE;
678
    `SEI:       IsRFW = TRUE;
679
    default:    IsRFW = FALSE;
680
    endcase
681 48 robfinch
        else
682
                IsRFW = FALSE;
683
`MEMNDX:
684
        if (isn[`INSTRUCTION_L2]==2'b00)
685 50 robfinch
    case(isn[`INSTRUCTION_S2])
686
    `LBX:   IsRFW = TRUE;
687
    `LBUX:  IsRFW = TRUE;
688
    `LCX:   IsRFW = TRUE;
689
    `LCUX:  IsRFW = TRUE;
690
    `LHX:   IsRFW = TRUE;
691
    `LHUX:  IsRFW = TRUE;
692
    `LWX:   IsRFW = TRUE;
693
    `LVBX:  IsRFW = TRUE;
694
    `LVBUX: IsRFW = TRUE;
695
    `LVCX:  IsRFW = TRUE;
696
    `LVCUX: IsRFW = TRUE;
697
    `LVHX:  IsRFW = TRUE;
698
    `LVHUX: IsRFW = TRUE;
699
    `LVWX:  IsRFW = TRUE;
700
    `LWX:   IsRFW = TRUE;
701
    `LWRX:  IsRFW = TRUE;
702
    `LVX:   IsRFW = TRUE;
703
    `CASX:  IsRFW = TRUE;
704
    default:    IsRFW = FALSE;
705
    endcase
706 48 robfinch
        else
707
                IsRFW = FALSE;
708
`BBc:
709
        case(isn[20:19])
710
        `IBNE:  IsRFW = TRUE;
711
        `DBNZ:  IsRFW = TRUE;
712
        default:        IsRFW = FALSE;
713
        endcase
714
`BITFIELD:  IsRFW = TRUE;
715
`ADDI:      IsRFW = TRUE;
716
`SLTI:      IsRFW = TRUE;
717
`SLTUI:     IsRFW = TRUE;
718
`SGTI:      IsRFW = TRUE;
719
`SGTUI:     IsRFW = TRUE;
720
`ANDI:      IsRFW = TRUE;
721
`ORI:       IsRFW = TRUE;
722
`XORI:      IsRFW = TRUE;
723
`MULUI:     IsRFW = TRUE;
724
`MULI:      IsRFW = TRUE;
725
`DIVUI:     IsRFW = TRUE;
726
`DIVI:      IsRFW = TRUE;
727
`MODI:      IsRFW = TRUE;
728
`JAL:       IsRFW = TRUE;
729
`CALL:      IsRFW = TRUE;
730
`RET:       IsRFW = TRUE;
731
`LB:        IsRFW = TRUE;
732
`LBU:       IsRFW = TRUE;
733
`Lx:        IsRFW = TRUE;
734
`LWR:       IsRFW = TRUE;
735
`LV:        IsRFW = TRUE;
736
`LVx:                           IsRFW = TRUE;
737
`CAS:       IsRFW = TRUE;
738
`AMO:                           IsRFW = TRUE;
739
`CSRRW:                 IsRFW = TRUE;
740 55 robfinch
`LUI:                           IsRFW = TRUE;
741 48 robfinch
default:    IsRFW = FALSE;
742
endcase
743
endfunction
744
 
745
// Determines which lanes of the target register get updated.
746
function [7:0] fnWe;
747
input [47:0] isn;
748
casez(isn[`INSTRUCTION_OP])
749
`R2:
750
        case(isn[`INSTRUCTION_S2])
751
        `R1:
752
                case(isn[22:18])
753
                `ABS,`CNTLZ,`CNTLO,`CNTPOP:
754
                        case(isn[25:23])
755
                        3'b000: fnWe = 8'h01;
756
                        3'b001: fnWe = 8'h03;
757
                        3'b010: fnWe = 8'h0F;
758
                        3'b011: fnWe = 8'hFF;
759
                        default:        fnWe = 8'hFF;
760
                        endcase
761
                default: fnWe = 8'hFF;
762
                endcase
763
        `SHIFT31:       fnWe = (~isn[25] & isn[21]) ? 8'hFF : 8'hFF;
764
        `SHIFT63:       fnWe = (~isn[25] & isn[21]) ? 8'hFF : 8'hFF;
765
        `SLT,`SLTU,`SLE,`SLEU,
766
        `ADD,`SUB,
767
        `AND,`OR,`XOR,
768
        `NAND,`NOR,`XNOR,
769 50 robfinch
        `DIV,`DIVU,`DIVSU,
770
        `MOD,`MODU,`MODSU,
771
        `MUL,`MULU,`MULSU,
772
        `MULH,`MULUH,`MULSUH:
773 48 robfinch
                case(isn[25:23])
774
                3'b000: fnWe = 8'h01;
775
                3'b001: fnWe = 8'h03;
776
                3'b010: fnWe = 8'h0F;
777
                3'b011: fnWe = 8'hFF;
778
                default:        fnWe = 8'hFF;
779
                endcase
780
        default: fnWe = 8'hFF;
781
        endcase
782
default:        fnWe = 8'hFF;
783
endcase
784
endfunction
785
 
786
// Detect if a source is automatically valid
787
function Source1Valid;
788
input [47:0] isn;
789
casez(isn[`INSTRUCTION_OP])
790
`BRK:   Source1Valid = TRUE;
791
`Bcc:   Source1Valid = isn[`INSTRUCTION_RA]==5'd0;
792
`BBc:   Source1Valid = isn[`INSTRUCTION_RA]==5'd0;
793
`BEQI:  Source1Valid = isn[`INSTRUCTION_RA]==5'd0;
794
`CHK:   Source1Valid = isn[`INSTRUCTION_RA]==5'd0;
795
`R2:    case(isn[`INSTRUCTION_S2])
796
        `SHIFT31:  Source1Valid = isn[`INSTRUCTION_RA]==5'd0;
797
        `SHIFT63:  Source1Valid = isn[`INSTRUCTION_RA]==5'd0;
798
        `SHIFTR:   Source1Valid = isn[`INSTRUCTION_RA]==5'd0;
799
        default:   Source1Valid = isn[`INSTRUCTION_RA]==5'd0;
800
        endcase
801
`MEMNDX:        Source1Valid = isn[`INSTRUCTION_RA]==5'd0;
802
`ADDI:  Source1Valid = isn[`INSTRUCTION_RA]==5'd0;
803
`SLTI:  Source1Valid = isn[`INSTRUCTION_RA]==5'd0;
804
`SLTUI: Source1Valid = isn[`INSTRUCTION_RA]==5'd0;
805
`SGTI:  Source1Valid = isn[`INSTRUCTION_RA]==5'd0;
806
`SGTUI: Source1Valid = isn[`INSTRUCTION_RA]==5'd0;
807
`ANDI:  Source1Valid = isn[`INSTRUCTION_RA]==5'd0;
808
`ORI:   Source1Valid = isn[`INSTRUCTION_RA]==5'd0;
809
`XORI:  Source1Valid = isn[`INSTRUCTION_RA]==5'd0;
810
`XNORI: Source1Valid = isn[`INSTRUCTION_RA]==5'd0;
811
`MULUI: Source1Valid = isn[`INSTRUCTION_RA]==5'd0;
812
`AMO:   Source1Valid = isn[`INSTRUCTION_RA]==5'd0;
813
`LB:    Source1Valid = isn[`INSTRUCTION_RA]==5'd0;
814
`LBU:   Source1Valid = isn[`INSTRUCTION_RA]==5'd0;
815
`Lx:    Source1Valid = isn[`INSTRUCTION_RA]==5'd0;
816
`LxU:   Source1Valid = isn[`INSTRUCTION_RA]==5'd0;
817
`LWR:   Source1Valid = isn[`INSTRUCTION_RA]==5'd0;
818
`LV:    Source1Valid = isn[`INSTRUCTION_RA]==5'd0;
819
`LVx:   Source1Valid = isn[`INSTRUCTION_RA]==5'd0;
820
`SB:    Source1Valid = isn[`INSTRUCTION_RA]==5'd0;
821
`Sx:    Source1Valid = isn[`INSTRUCTION_RA]==5'd0;
822
`SWC:   Source1Valid = isn[`INSTRUCTION_RA]==5'd0;
823
`SV:    Source1Valid = isn[`INSTRUCTION_RA]==5'd0;
824
`INC:   Source1Valid = isn[`INSTRUCTION_RA]==5'd0;
825
`CAS:   Source1Valid = isn[`INSTRUCTION_RA]==5'd0;
826
`JAL:   Source1Valid = isn[`INSTRUCTION_RA]==5'd0;
827
`RET:   Source1Valid = isn[`INSTRUCTION_RA]==5'd0;
828
`CSRRW: Source1Valid = isn[`INSTRUCTION_RA]==5'd0;
829
`BITFIELD:      case(isn[31:28])
830
                        `BFINSI:        Source1Valid = TRUE;
831
                        default:        Source1Valid = isn[`INSTRUCTION_RA]==5'd0;
832
                        endcase
833
`IVECTOR:
834
                        Source1Valid = FALSE;
835
default:    Source1Valid = TRUE;
836
endcase
837
endfunction
838
 
839
function Source2Valid;
840
input [47:0] isn;
841
casez(isn[`INSTRUCTION_OP])
842
`BRK:   Source2Valid = TRUE;
843
`Bcc:   Source2Valid = isn[`INSTRUCTION_RB]==5'd0;
844
`BBc:   Source2Valid = TRUE;
845
`BEQI:  Source2Valid = TRUE;
846
`CHK:   Source2Valid = isn[`INSTRUCTION_RB]==5'd0;
847
`R2:    case(isn[`INSTRUCTION_S2])
848
        `R1:       Source2Valid = TRUE;
849
        `SHIFTR:   Source2Valid = isn[25] ? 1'b1 : isn[`INSTRUCTION_RB]==5'd0;
850
        `SHIFT31:  Source2Valid = isn[25] ? 1'b1 : isn[`INSTRUCTION_RB]==5'd0;
851
        `SHIFT63:  Source2Valid = isn[25] ? 1'b1 : isn[`INSTRUCTION_RB]==5'd0;
852
        default:   Source2Valid = isn[`INSTRUCTION_RB]==5'd0;
853
        endcase
854
`MEMNDX: case(isn[`INSTRUCTION_S2])
855
        `LVX,`SVX: Source2Valid = FALSE;
856
        default:   Source2Valid = isn[`INSTRUCTION_RB]==5'd0;
857
        endcase
858
`ADDI:  Source2Valid = TRUE;
859
`SLTI:  Source2Valid = TRUE;
860
`SLTUI: Source2Valid = TRUE;
861
`SGTI:  Source2Valid = TRUE;
862
`SGTUI: Source2Valid = TRUE;
863
`ANDI:  Source2Valid = TRUE;
864
`ORI:   Source2Valid = TRUE;
865
`XORI:  Source2Valid = TRUE;
866
`XNORI: Source2Valid = TRUE;
867
`MULUI: Source2Valid = TRUE;
868
`LB:    Source2Valid = TRUE;
869
`LBU:   Source2Valid = TRUE;
870
`Lx:    Source2Valid = TRUE;
871
`LxU:   Source2Valid = TRUE;
872
`LWR:   Source2Valid = TRUE;
873
`LVx:   Source2Valid = TRUE;
874
`INC:           Source2Valid = TRUE;
875
`SB:    Source2Valid = isn[`INSTRUCTION_RB]==5'd0;
876
`Sx:    Source2Valid = isn[`INSTRUCTION_RB]==5'd0;
877
`SWC:   Source2Valid = isn[`INSTRUCTION_RB]==5'd0;
878
`CAS:   Source2Valid = isn[`INSTRUCTION_RB]==5'd0;
879
`JAL:   Source2Valid = TRUE;
880
`RET:   Source2Valid = isn[`INSTRUCTION_RB]==5'd0;
881
`IVECTOR:
882
                    case(isn[`INSTRUCTION_S2])
883
            `VABS:  Source2Valid = TRUE;
884
            `VMAND,`VMOR,`VMXOR,`VMXNOR,`VMPOP:
885
                Source2Valid = FALSE;
886
            `VADDS,`VSUBS,`VANDS,`VORS,`VXORS:
887
                Source2Valid = isn[`INSTRUCTION_RB]==5'd0;
888
            `VBITS2V:   Source2Valid = TRUE;
889
            `V2BITS:    Source2Valid = isn[`INSTRUCTION_RB]==5'd0;
890
            `VSHL,`VSHR,`VASR:  Source2Valid = isn[22:21]==2'd2;
891
            default:    Source2Valid = FALSE;
892
            endcase
893
`LV:        Source2Valid = TRUE;
894
`SV:        Source2Valid = FALSE;
895
`AMO:           Source2Valid = isn[31] || isn[`INSTRUCTION_RB]==5'd0;
896
default:    Source2Valid = TRUE;
897
endcase
898
endfunction
899
 
900
function Source3Valid;
901
input [47:0] isn;
902
case(isn[`INSTRUCTION_OP])
903
`IVECTOR:
904
    case(isn[`INSTRUCTION_S2])
905
    `VEX:       Source3Valid = TRUE;
906
    default:    Source3Valid = TRUE;
907
    endcase
908
`CHK:   Source3Valid = isn[`INSTRUCTION_RC]==5'd0;
909
`R2:
910
        if (isn[`INSTRUCTION_L2]==2'b01)
911
                case(isn[47:42])
912
    `CMOVEZ,`CMOVNZ:  Source3Valid = isn[`INSTRUCTION_RC]==5'd0;
913
                default:        Source3Valid = TRUE;
914
                endcase
915
        else
916
    case(isn[`INSTRUCTION_S2])
917
    `MAJ:               Source3Valid = isn[`INSTRUCTION_RC]==5'd0;
918
    default:    Source3Valid = TRUE;
919
    endcase
920
`MEMNDX:
921
        if (isn[`INSTRUCTION_L2]==2'b00)
922
    case(isn[`INSTRUCTION_S2])
923
    `SBX:   Source3Valid = isn[`INSTRUCTION_RC]==5'd0;
924
    `SCX:   Source3Valid = isn[`INSTRUCTION_RC]==5'd0;
925
    `SHX:   Source3Valid = isn[`INSTRUCTION_RC]==5'd0;
926
    `SWX:   Source3Valid = isn[`INSTRUCTION_RC]==5'd0;
927
    `SWCX:  Source3Valid = isn[`INSTRUCTION_RC]==5'd0;
928
    `CASX:  Source3Valid = isn[`INSTRUCTION_RC]==5'd0;
929
    default:    Source3Valid = TRUE;
930
    endcase
931
default:    Source3Valid = TRUE;
932
endcase
933
endfunction
934
 
935 52 robfinch
`ifdef REGISTER_DECODE
936 48 robfinch
always @(posedge clk)
937 52 robfinch
`else
938
always @*
939
`endif
940 48 robfinch
begin
941 51 robfinch
        bus <= 144'h0;
942
        bus[`IB_CONST] <= instr[6]==1'b1 ? {{34{instr[47]}},instr[47:18]} :
943
                                                                                                                                                        {{50{instr[31]}},instr[31:18]};
944 55 robfinch
        if (instr[`INSTRUCTION_OP]==`CMPRSSD)
945
                bus[`IB_LN] <= 3'd2;
946
        else
947
                case(instr[7:6])
948
                2'b00:  bus[`IB_LN] <= 3'd4;
949
                2'b01:  bus[`IB_LN] <= 3'd6;
950
                default: bus[`IB_LN] <= 3'd2;
951
                endcase
952 48 robfinch
//      bus[`IB_RT]              <= fnRt(instr,ven,vl,thrd) | {thrd,7'b0};
953
//      bus[`IB_RC]              <= fnRc(instr,ven,thrd) | {thrd,7'b0};
954
//      bus[`IB_RA]              <= fnRa(instr,ven,vl,thrd) | {thrd,7'b0};
955
        bus[`IB_IMM]     <= HasConst(instr);
956 50 robfinch
//      bus[`IB_A3V]   <= Source3Valid(instr);
957
//      bus[`IB_A2V]   <= Source2Valid(instr);
958
//      bus[`IB_A1V]   <= Source1Valid(instr);
959 51 robfinch
        bus[`IB_IRQ]     <= IsIrq(instr);
960
        bus[`IB_BRK]     <= IsBrk(instr);
961
        bus[`IB_RTI]     <= IsRti(instr);
962
        bus[`IB_RET]     <= IsRet(instr);
963
        bus[`IB_JAL]     <= IsJAL(instr);
964 48 robfinch
        bus[`IB_BT]    <= (IsBranch(instr) && predict_taken);
965
        bus[`IB_ALU]   <= IsALU;
966
        bus[`IB_ALU0]  <= IsAlu0Only(instr);
967
        bus[`IB_FPU]   <= IsFPU(instr);
968
        bus[`IB_FC]              <= IsFlowCtrl;
969
        bus[`IB_CANEX] <= fnCanException(instr);
970 50 robfinch
        bus[`IB_LOADV] <= IsVolatileLoad(instr);
971 48 robfinch
        bus[`IB_LOAD]    <= IsLoad(instr);
972
        bus[`IB_PRELOAD] <=   IsLoad(instr) && Rt==5'd0;
973 50 robfinch
        bus[`IB_STORE]  <= IsStore(instr);
974
        bus[`IB_ODDBALL] <= IsOddball(instr);
975
        bus[`IB_MEMSZ]  <= MemSize(instr);
976 48 robfinch
        bus[`IB_MEM]            <= IsMem(instr);
977
        bus[`IB_MEMNDX] <= IsMemNdx(instr);
978
        bus[`IB_RMW]            <= IsCAS(instr) || IsAMO(instr) || IsInc(instr);
979
        bus[`IB_MEMDB]  <= IsMemdb(instr);
980
        bus[`IB_MEMSB]  <= IsMemsb(instr);
981
        bus[`IB_SHFT48] <= IsShift48(instr);
982
        bus[`IB_SEI]            <= IsSEI(instr);
983
        bus[`IB_AQ]                     <= (IsAMO(instr)|IsLWRX(instr)|IsSWCX(instr)) & instr[25];
984
        bus[`IB_RL]                     <= (IsAMO(instr)|IsLWRX(instr)|IsSWCX(instr)) & instr[24];
985
        bus[`IB_JMP]            <= IsJmp(instr);
986
        bus[`IB_BR]                     <= IsBranch(instr);
987
        bus[`IB_SYNC]           <= IsSync(instr)||IsBrk(instr)||IsRti(instr);
988
        bus[`IB_FSYNC]  <= IsFSync(instr);
989
        bus[`IB_RFW]            <= Rt==5'd0 ? 1'b0 : IsRFW(instr);
990
        bus[`IB_WE]                     <= fnWe(instr);
991
        id_o <= id_i;
992
        idv_o <= idv_i;
993
end
994
 
995
endmodule
996
 
997
module mIsALU(instr, IsALU);
998
input [47:0] instr;
999
output reg IsALU;
1000
parameter TRUE = 1'b1;
1001
parameter FALSE = 1'b0;
1002
 
1003
always @*
1004
casez(instr[`INSTRUCTION_OP])
1005 50 robfinch
`R2:
1006
  if (instr[`INSTRUCTION_L2]==2'b00)
1007
                case(instr[`INSTRUCTION_S2])
1008
                `VMOV:          IsALU = TRUE;
1009
    `RTI:       IsALU = FALSE;
1010
    default:    IsALU = TRUE;
1011
    endcase
1012
    else
1013
        IsALU = TRUE;
1014 48 robfinch
`BRK:   IsALU = FALSE;
1015
`Bcc:   IsALU = FALSE;
1016
`BBc:   IsALU = FALSE;
1017
`BEQI:  IsALU = FALSE;
1018
`CHK:   IsALU = FALSE;
1019
`JAL:   IsALU = FALSE;
1020
`JMP:   IsALU = FALSE;
1021
`CALL:  IsALU = FALSE;
1022
`RET:   IsALU = FALSE;
1023
`FVECTOR:
1024 50 robfinch
        case(instr[`INSTRUCTION_S2])
1025
  `VSHL,`VSHR,`VASR:  IsALU = TRUE;
1026
  default:    IsALU = FALSE;  // Integer
1027
  endcase
1028 48 robfinch
`IVECTOR:
1029 50 robfinch
        case(instr[`INSTRUCTION_S2])
1030
  `VSHL,`VSHR,`VASR:  IsALU = TRUE;
1031
  default:    IsALU = TRUE;  // Integer
1032
  endcase
1033 48 robfinch
`FLOAT:         IsALU = FALSE;
1034
default:    IsALU = TRUE;
1035
endcase
1036
 
1037
endmodule

powered by: WebSVN 2.1.0

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