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

Subversion Repositories thor

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

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

powered by: WebSVN 2.1.0

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