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

Subversion Repositories raptor64

[/] [raptor64/] [trunk/] [rtl/] [verilog/] [Raptor64sc.v] - Blame information for rev 16

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

Line No. Rev Author Line
1 13 robfinch
// ============================================================================
2
// (C) 2012 Robert Finch
3
// All Rights Reserved.
4
// robfinch<remove>@opencores.org
5
//
6
// Raptor64.v
7
//  - 64 bit CPU
8
//
9
// This source file is free software: you can redistribute it and/or modify 
10
// it under the terms of the GNU Lesser General Public License as published 
11
// by the Free Software Foundation, either version 3 of the License, or     
12
// (at your option) any later version.                                      
13
//                                                                          
14
// This source file is distributed in the hope that it will be useful,      
15
// but WITHOUT ANY WARRANTY; without even the implied warranty of           
16
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            
17
// GNU General Public License for more details.                             
18
//                                                                          
19
// You should have received a copy of the GNU General Public License        
20
// along with this program.  If not, see <http://www.gnu.org/licenses/>.    
21
//                                                                          
22
// ============================================================================
23
//
24
`define RESET_VECTOR    64'hFFFF_FFFF_FFFF_FFF0
25
`define NMI_VECTOR              64'hFFFF_FFFF_FFFF_FFE0
26
`define IRQ_VECTOR              64'hFFFF_FFFF_FFFF_FFD0
27
`define TRAP_VECTOR             64'h0000_0000_0000_0000
28
 
29
`define TLBMissPage             52'hFFFF_FFFF_FFFF_F
30
`define ITLB_MissHandler        64'hFFFF_FFFF_FFFF_FFC0
31
`define DTLB_MissHandler        64'hFFFF_FFFF_FFFF_FFB0
32
 
33
`define GEN_TRAP_OFFSET         13'h0200
34
`define DBZ_TRAP_OFFSET         13'h0050
35
`define OFL_TRAP_OFFSET         13'h0070
36 14 robfinch
`define PRIV_OFFSET                     13'h0080
37 13 robfinch
 
38
`define EX_NON          8'd0
39
`define EX_RST          8'd1
40
`define EX_NMI          8'd2
41
`define EX_IRQ          8'd3
42
`define EX_TRAP         8'd4
43 14 robfinch
`define EX_PRIV         8'd5    // priviledge violation
44 13 robfinch
`define EX_OFL          8'd16   // overflow
45
`define EX_DBZ          8'd17   // divide by zero
46
`define EX_TLBI         8'd19   // TLB exception - ifetch
47
`define EX_TLBD         8'd20   // TLB exception - data
48
 
49
`define EXCEPT_Int              5'd00
50
`define EXCEPT_Mod              5'd01   // TLB modification
51
`define EXCEPT_TLBL             5'd02   // TLB exception - load or ifetch
52
`define EXCEPT_TLBS             5'd03   // TLB exception - store
53
`define EXCEPT_AdEL             5'd04   // Address error - load or ifetch
54
`define EXCEPT_AdES             5'd05   // Address error - store
55
`define EXCEPT_IBE              5'd06   // Bus Error - instruction fetch
56
`define EXCEPT_DBE              5'd07   // Bus Error - load or store
57
`define EXCEPT_Sys              5'd08
58
`define EXCEPT_Bp               5'd09
59
`define EXCEPT_RI               5'd10   // reserved instruction
60
`define EXCEPT_CpU              5'd11   // Coprocessor unusable
61
`define EXCEPT_Ov               5'd12   // Integer Overflow
62
`define EXCEPT_Tr               5'd13   // Trap exception
63
// 14-22 Reserved
64
`define EXCEPT_WATCH    5'd23
65
`define EXCEPT_MCheck   5'd24   // Machine check
66
// 25-31 Reserved
67
 
68
 
69
`define MISC    7'd0
70
`define         BRK             7'd0
71
`define         IRQ             7'd1
72
`define     FIP         7'd20
73
`define         IRET    7'd32
74
`define         ERET    7'd33
75
`define         WAIT    7'd40
76 14 robfinch
`define         TLBP    7'd49
77 13 robfinch
`define     TLBR        7'd50
78
`define     TLBWI       7'd51
79
`define     TLBWR       7'd52
80
`define         CLI             7'd64
81
`define         SEI             7'd65
82
`define R               7'd1
83
`define         COM             7'd4
84
`define         NOT             7'd5
85
`define         NEG             7'd6
86
`define         ABS             7'd7
87
`define         SWAP    7'd13
88
`define         CTLZ    7'd16
89
`define         CTLO    7'd17
90
`define         CTPOP   7'd18
91
`define         SEXT8   7'd19
92
`define         SEXT16  7'd20
93
`define         SEXT32  7'd21
94
`define         SQRT    7'd24
95
`define         REDOR   7'd30
96
`define         REDAND  7'd31
97
`define     MFSPR       7'd40
98
`define     MTSPR       7'd41
99
`define         TLBIndex        6'd01
100
`define         TLBRandom               6'd02
101
`define         PageTableAddr   6'd04
102
`define         BadVAddr        6'd08
103 14 robfinch
`define         TLBPhysPage0    6'd10
104
`define         TLBPhysPage1    6'd11
105
`define         TLBVirtPage             6'd12
106
`define                 TLBPageMask             6'd13
107
`define                 TLBASID                 6'd14
108
`define         ASID                    6'd15
109
`define                 Wired                   6'd16
110
`define         EP0             6'd17
111
`define         EP1             6'd18
112
`define         EP2             6'd19
113
`define         EP3             6'd20
114
`define         AXC             6'd21
115
`define                 Tick                    6'd22
116
`define                 EPC                             6'd23
117
`define                 CauseCode               6'd24
118
`define                 TBA                             6'd25
119 13 robfinch
`define         OMG             7'd50
120
`define         CMG             7'd51
121
`define         OMGI    7'd52
122
`define         CMGI    7'd53
123
`define         MFTBA   7'd58
124
`define         MTTBA   7'd59
125
`define RR      7'd2
126
`define         ADD             7'd2
127
`define         ADDU    7'd3
128
`define         SUB             7'd4
129
`define         SUBU    7'd5
130
`define         CMP             7'd6
131
`define         CMPU    7'd7
132
`define         AND             7'd8
133
`define         OR              7'd9
134
`define         XOR             7'd10
135
`define         ANDC    7'd11
136
`define         NAND    7'd12
137
`define         NOR             7'd13
138
`define         XNOR    7'd14
139
`define         ORC             7'd15
140
`define         MIN             7'd20
141
`define         MAX             7'd21
142
`define         MULU    7'd24
143
`define         MULS    7'd25
144
`define         DIVU    7'd26
145
`define         DIVS    7'd27
146
`define         MOD             7'd28
147
`define         MOVZ    7'd30
148
`define         MOVNZ   7'd31
149
 
150
`define         SHL             7'd40
151
`define         SHRU    7'd41
152
`define         ROL             7'd42
153
`define         ROR             7'd43
154
`define         SHR             7'd44
155
`define         ROLAM   7'd45
156
 
157
`define         NOP             7'd60
158
 
159
`define         SLT             7'd96
160
`define         SLE             7'd97
161
`define         SGT             7'd98
162
`define         SGE             7'd99
163
`define         SLTU    7'd100
164
`define         SLEU    7'd101
165
`define         SGTU    7'd102
166
`define         SGEU    7'd103
167
`define         SEQ             7'd104
168
`define         SNE             7'd105
169
 
170
`define     BCD_ADD     7'd110
171
`define     BCD_SUB 7'd111
172
 
173
`define SHFTI   7'd3
174
`define SHLI            7'd0
175
`define SHRUI           7'd1
176
`define ROLI            7'd2
177
`define SHRI            7'd3
178
`define RORI            7'd4
179
`define ROLAMI          7'd5
180
`define BFINS           7'd8
181
`define BFSET           7'd9
182
`define BFCLR           7'd10
183
`define BFCHG           7'd11
184
 
185
`define ADDI    7'd4
186
`define ADDUI   7'd5
187
`define SUBI    7'd6
188 14 robfinch
`define SUBUI   7'd7
189
`define CMPI    7'd8
190
`define CMPUI   7'd9
191
`define ANDI    7'd10
192
`define ORI             7'd11
193
`define XORI    7'd12
194 13 robfinch
 
195 14 robfinch
`define MULUI   7'd13
196
`define MULSI   7'd14
197
`define DIVUI   7'd15
198
`define DIVSI   7'd16
199 13 robfinch
 
200
`define TRAPcc  7'd17
201
`define         TEQ             7'd0
202
`define         TNE             7'd1
203
`define         TLT             7'd2
204 14 robfinch
`define         TGE             7'd3
205
`define         TLE             7'd4
206
`define         TGT             7'd5
207
`define         TLTU    7'd6
208
`define         TGEU    7'd7
209
`define         TLEU    7'd8
210
`define         TGTU    7'd9
211 13 robfinch
`define         TRAP    7'd10
212
`define         TRN             7'd11
213
`define TRAPcci 7'd18
214
`define         TEQI    5'd0
215
`define         TNEI    5'd1
216
`define         TLTI    5'd2
217 14 robfinch
`define         TGEI    5'd3
218
`define         TLEI    5'd4
219
`define         TGTI    5'd5
220
`define         TLTUI   5'd6
221
`define         TGEUI   5'd7
222
`define         TLEUI   5'd8
223
`define         TGTUI   5'd9
224 13 robfinch
`define         TRAI    5'd10
225
`define         TRNI    5'd11
226 14 robfinch
// SETLO=20 to 23
227
`define SETLO   7'b00101xx
228 13 robfinch
`define CALL    7'd24
229
`define JMP             7'd25
230
`define JAL             7'd26
231
`define RET             7'd27
232 14 robfinch
// SETLO=28 to 31
233
`define SETHI   7'b00111xx
234 13 robfinch
`define LB              7'd32
235
`define LC              7'd33
236
`define LH              7'd34
237
`define LW              7'd35
238
`define LP              7'd36
239
`define LBU             7'd37
240
`define LCU             7'd38
241
`define LHU             7'd39
242
`define LSH             7'd40
243
`define LSW             7'd41
244
`define LF              7'd42
245
`define LFD             7'd43
246
`define LFP             7'd44
247
`define LFDP    7'd45
248
`define LWR             7'd46
249
`define LDONE   7'd47
250
 
251
`define SB              7'd48
252
`define SC              7'd49
253
`define SH              7'd50
254
`define SW              7'd51
255
`define SP              7'd52
256
`define MEMNDX  7'd53
257
`define SSH             7'd56
258
`define SSW             7'd57
259
`define SF              7'd58
260
`define SFD             7'd59
261
`define SFP             7'd60
262
`define SFDP    7'd61
263
`define SWC             7'd62
264
 
265
`define INB             7'd64
266
`define INCH    7'd65
267
`define INH             7'd66
268
`define INW             7'd67
269 14 robfinch
`define INBU    7'd68
270
`define INCU    7'd69
271
`define INHU    7'd70
272 13 robfinch
`define OUTB    7'd72
273
`define OUTC    7'd73
274
`define OUTH    7'd74
275
`define OUTW    7'd75
276
 
277
`define BLTI    7'd80
278
`define BGEI    7'd81
279
`define BLEI    7'd82
280
`define BGTI    7'd83
281
`define BLTUI   7'd84
282
`define BGEUI   7'd85
283
`define BLEUI   7'd86
284
`define BGTUI   7'd87
285
`define BEQI    7'd88
286
`define BNEI    7'd89
287
`define BRAI    7'd90
288
`define BRNI    7'd91
289
 
290
`define BTRI    7'd94
291
`define         BLTRI   5'd0
292
`define         BGERI   5'd1
293
`define         BLERI   5'd2
294
`define         BGTRI   5'd3
295
`define         BLTURI  5'd4
296
`define         BGEURI  5'd5
297
`define         BLEURI  5'd6
298
`define         BGTURI  5'd7
299
`define         BEQRI   5'd8
300
`define         BNERI   5'd9
301
`define         BRARI   5'd10
302
`define         BRNRI   5'd11
303
`define         BANDRI  5'd12
304
`define         BORRI   5'd13
305
`define BTRR    7'd95
306
`define         BLT             5'd0
307
`define         BGE             5'd1
308
`define         BLE             5'd2
309
`define         BGT             5'd3
310
`define         BLTU    5'd4
311
`define         BGEU    5'd5
312
`define         BLEU    5'd6
313
`define         BGTU    5'd7
314
`define         BEQ             5'd8
315
`define         BNE             5'd9
316
`define         BRA             5'd10
317
`define         BRN             5'd11
318
`define         BAND    5'd12
319
`define         BOR             5'd13
320
`define         BNR             5'd14
321
`define         BLTR    5'd16
322
`define         BGER    5'd17
323
`define         BLER    5'd18
324
`define         BGTR    5'd19
325
`define         BLTUR   5'd20
326
`define         BGEUR   5'd21
327
`define         BLEUR   5'd22
328
`define         BGTUR   5'd23
329
`define         BEQR    5'd24
330
`define         BNER    5'd25
331
`define         BRAR    5'd26
332
`define         BRNR    5'd27
333
 
334
 
335
`define SLTI    7'd96
336
`define SLEI    7'd97
337
`define SGTI    7'd98
338
`define SGEI    7'd99
339
`define SLTUI   7'd100
340
`define SLEUI   7'd101
341
`define SGTUI   7'd102
342
`define SGEUI   7'd103
343
`define SEQI    7'd104
344
`define SNEI    7'd105
345
 
346
`define FPLOO   7'd109
347
`define FPZL    7'd110
348
`define NOPI    7'd111
349
 
350
`define IMM             3'd7
351
 
352
`define NOP_INSN        42'b1101111_000_00000000_00000000_00000000_00000000
353
 
354 14 robfinch
module Raptor64sc(rst_i, clk_i, nmi_i, irq_i, bte_o, cti_o, bl_o,
355
        cyc_o, stb_o, ack_i, we_o, sel_o, rsv_o, adr_o, dat_i, dat_o, sys_adv, sys_adr
356 13 robfinch
);
357
parameter IDLE = 5'd1;
358
parameter ICACT = 5'd2;
359
parameter ICACT0 = 5'd3;
360
parameter ICACT1 = 5'd4;
361
parameter ICACT2 = 5'd5;
362
parameter ICACT3 = 5'd6;
363
parameter ICACT4 = 5'd7;
364
parameter ICACT5 = 5'd8;
365
parameter ICACT6 = 5'd9;
366
parameter ICACT7 = 5'd10;
367
parameter ICDLY = 5'd11;
368
parameter DCIDLE = 5'd20;
369
parameter DCACT = 5'd21;
370
parameter DCACT0 = 5'd22;
371
parameter DCACT1 = 5'd23;
372
parameter DCACT2 = 5'd24;
373
parameter DCACT3 = 5'd25;
374
parameter DCACT4 = 5'd26;
375
parameter DCACT5 = 5'd27;
376
parameter DCACT6 = 5'd28;
377
parameter DCACT7 = 5'd29;
378
parameter DCDLY = 5'd30;
379
 
380
input rst_i;
381
input clk_i;
382
input nmi_i;
383
input irq_i;
384
 
385
output [1:0] bte_o;
386
reg [1:0] bte_o;
387
output [2:0] cti_o;
388
reg [2:0] cti_o;
389 14 robfinch
output [4:0] bl_o;
390
reg [4:0] bl_o;
391 13 robfinch
output cyc_o;
392
reg cyc_o;
393
output stb_o;
394
reg stb_o;
395
input ack_i;
396
output we_o;
397
reg we_o;
398 14 robfinch
output [7:0] sel_o;
399
reg [7:0] sel_o;
400 13 robfinch
output rsv_o;
401
reg rsv_o;
402 14 robfinch
output [63:0] adr_o;
403
reg [63:0] adr_o;
404
input [63:0] dat_i;
405
output [63:0] dat_o;
406
reg [63:0] dat_o;
407 13 robfinch
 
408
input sys_adv;
409
input [63:5] sys_adr;
410
 
411
reg resetA;
412 14 robfinch
reg im,bu_im;                   // interrupt mask
413 13 robfinch
reg [1:0] rm;            // fp rounding mode
414
reg [41:0] dIR;
415
reg [41:0] xIR;
416
reg [63:0] pc;
417 14 robfinch
reg [63:0] ErrorEPC,EPC,IPC;
418 13 robfinch
reg [63:0] dpc,m1pc,m2pc,m3pc,m4pc,wpc;
419 16 robfinch
reg dpcv,xpcv,m1pcv,m2pcv,m3pcv,m4pcv,wpcv;     // PC valid indicators
420 13 robfinch
reg [63:0] xpc;
421
reg [63:0] tlbra;                // return address for a TLB exception
422
reg [8:0] dRa,dRb,dRc;
423
reg [8:0] wRt,mRt,m1Rt,m2Rt,m3Rt,m4Rt,tRt,dRt;
424
reg [8:0] xRt;
425
reg [63:0] dImm;
426
reg [63:0] ea;
427
reg [63:0] iadr_o;
428
reg [31:0] idat;
429
reg [4:0] cstate;
430
reg dbranch_taken,xbranch_taken;
431
reg [63:0] mutex_gate;
432
reg [63:0] TBA;
433 14 robfinch
reg [1:0] dhwxtype,xhwxtype,m1hwxtype,m2hwxtype,m3hwxtype,m4hwxtype,whwxtype;
434
reg [3:0] AXC,dAXC,xAXC;
435
reg dtinit;
436 13 robfinch
 
437
//reg wr_icache;
438
reg dccyc;
439
wire [63:0] cdat;
440
reg [63:0] wr_addr;
441 14 robfinch
reg [41:0] insn;
442 13 robfinch
wire [63:0] rfoa,rfob;
443
reg clk_en;
444
reg cpu_clk_en;
445
reg StatusERL;          // 1= in error processing
446
reg StatusEXL;          // 1= in exception processing
447 14 robfinch
reg StatusHWI;          // 1= in interrupt processing
448
reg StatusUM;           // 1= user mode
449 13 robfinch
reg [7:0] CauseCode;
450
reg [7:0] ASID;          // address space identifier (process ID)
451
integer n;
452
reg [63:13] BadVAddr;
453
reg [63:13] PageTableAddr;
454
 
455
function [63:0] fnIncPC;
456
input [63:0] fpc;
457
begin
458
case(fpc[3:2])
459
2'd0:   fnIncPC = {fpc[63:4],4'b0100};
460
2'd1:   fnIncPC = {fpc[63:4],4'b1000};
461
2'd2:   fnIncPC = {fpc[63:4]+60'd1,4'b0000};
462
2'd3:   fnIncPC = {fpc[63:4]+60'd1,4'b0000};
463
endcase
464
end
465
endfunction
466
 
467 14 robfinch
wire KernelMode = StatusEXL;
468
 
469 13 robfinch
//-----------------------------------------------------------------------------
470 14 robfinch
// TLB
471 13 robfinch
//-----------------------------------------------------------------------------
472
 
473 14 robfinch
reg [24:13] TLBPageMask;
474
reg [63:13] TLBVirtPage;
475
reg [63:13] TLBPhysPage0;
476
reg [63:13] TLBPhysPage1;
477
reg [7:0] TLBASID;
478
reg TLBG;
479
reg TLBD;
480
reg TLBValid;
481
reg [63:0] Index;
482
reg [3:0] Random;
483
reg [3:0] Wired;
484
reg [15:0] IMatch,DMatch;
485
 
486 13 robfinch
reg [4:0] m;
487
reg [3:0] i;
488
reg [24:13] ITLBPageMask [15:0];
489
reg [63:13] ITLBVirtPage [15:0];
490 14 robfinch
reg [63:13] ITLBPhysPage0 [15:0];
491
reg [63:13] ITLBPhysPage1 [15:0];
492 13 robfinch
reg [15:0] ITLBG;
493 14 robfinch
reg [15:0] ITLBD;
494 13 robfinch
reg [7:0] ITLBASID [15:0];
495
reg [15:0] ITLBValid;
496
initial begin
497
        for (n = 0; n < 16; n = n + 1)
498
        begin
499
                ITLBPageMask[n] = 0;
500
                ITLBVirtPage[n] = 0;
501 14 robfinch
                ITLBPhysPage0[n] = 0;
502
                ITLBPhysPage1[n] = 0;
503 13 robfinch
                ITLBG[n] = 0;
504
                ITLBASID[n] = 0;
505
                ITLBValid[n] = 0;
506
        end
507
end
508
always @*
509
for (n = 0; n < 16; n = n + 1)
510
        IMatch[n] = ((pc[63:13]|ITLBPageMask[n])==(ITLBVirtPage[n]|ITLBPageMask[n])) &&
511
                                ((ITLBASID[n]==ASID) || ITLBG[n]) &&
512
                                ITLBValid[n];
513
always @(IMatch)
514
if (IMatch[0]) m <= 5'd0;
515
else if (IMatch[1]) m <= 5'd1;
516
else if (IMatch[2]) m <= 5'd2;
517
else if (IMatch[3]) m <= 5'd3;
518
else if (IMatch[4]) m <= 5'd4;
519
else if (IMatch[5]) m <= 5'd5;
520
else if (IMatch[6]) m <= 5'd6;
521
else if (IMatch[7]) m <= 5'd7;
522
else if (IMatch[8]) m <= 5'd8;
523
else if (IMatch[9]) m <= 5'd9;
524
else if (IMatch[10]) m <= 5'd10;
525
else if (IMatch[11]) m <= 5'd11;
526
else if (IMatch[12]) m <= 5'd12;
527
else if (IMatch[13]) m <= 5'd13;
528
else if (IMatch[14]) m <= 5'd14;
529
else if (IMatch[15]) m <= 5'd15;
530
else m <= 5'd31;
531
 
532 14 robfinch
wire ioddpage = |({ITLBPageMask[q]+19'd1,13'd0}&pc);
533
wire [63:13] IPFN = ioddpage ? ITLBPhysPage1[q] : ITLBPhysPage0[q];
534
 
535 13 robfinch
wire unmappedArea = pc[63:52]==12'hFFD || pc[63:52]==12'hFFE || pc[63:52]==12'hFFF;
536
wire [63:0] ppc;
537
wire ITLBMiss = !unmappedArea & m[4];
538
 
539 14 robfinch
assign ppc[63:13] = unmappedArea ? pc[63:13] : m[4] ? `TLBMissPage: IPFN;
540 13 robfinch
assign ppc[12:0] = pc[12:0];
541
 
542
reg [4:0] q;
543
always @(ea)
544
for (n = 0; n < 16; n = n + 1)
545 14 robfinch
        DMatch[n] = ((ea[63:13]|ITLBPageMask[n])==(ITLBVirtPage[n]|ITLBPageMask[n])) &&
546
                                ((ITLBASID[n]==ASID) || ITLBG[n]) &&
547
                                ITLBValid[n];
548 13 robfinch
always @(DMatch)
549
if (DMatch[0]) q <= 5'd0;
550
else if (DMatch[1]) q <= 5'd1;
551
else if (DMatch[2]) q <= 5'd2;
552
else if (DMatch[3]) q <= 5'd3;
553
else if (DMatch[4]) q <= 5'd4;
554
else if (DMatch[5]) q <= 5'd5;
555
else if (DMatch[6]) q <= 5'd6;
556
else if (DMatch[7]) q <= 5'd7;
557
else if (DMatch[8]) q <= 5'd8;
558
else if (DMatch[9]) q <= 5'd9;
559
else if (DMatch[10]) q <= 5'd10;
560
else if (DMatch[11]) q <= 5'd11;
561
else if (DMatch[12]) q <= 5'd12;
562
else if (DMatch[13]) q <= 5'd13;
563
else if (DMatch[14]) q <= 5'd14;
564
else if (DMatch[15]) q <= 5'd15;
565
else q <= 5'd31;
566
 
567 14 robfinch
wire doddpage = |({ITLBPageMask[q]+19'd1,13'd0}&ea);
568
wire [63:13] DPFN = doddpage ? ITLBPhysPage1[q] : ITLBPhysPage0[q];
569
 
570 13 robfinch
wire unmappedDataArea = ea[63:52]==12'hFFD || ea[63:52]==12'hFFE || ea[63:52]==12'hFFF;
571
wire DTLBMiss = !unmappedDataArea & q[4];
572 14 robfinch
wire m1UnmappedDataArea = pea[63:13]>=12'hFFD;
573 13 robfinch
 
574
wire [63:0] pea;
575 14 robfinch
assign pea[63:13] = unmappedDataArea ? ea[63:13] : q[4] ? `TLBMissPage: DPFN;
576 13 robfinch
assign pea[12:0] = ea[12:0];
577 14 robfinch
wire dram_bus = !pea[63];
578
wire m2_dram_bus = !m2Addr[63];
579
wire m3_dram_bus = !m3Addr[63];
580
wire m4_dram_bus = !m4Addr[63];
581 13 robfinch
 
582
//-----------------------------------------------------------------------------
583
// Clock control
584
// - reset or NMI reenables the clock
585
// - this circuit must be under the clk_i domain
586
//-----------------------------------------------------------------------------
587
//
588
BUFGCE u20 (.CE(cpu_clk_en), .I(clk_i), .O(clk) );
589
 
590
always @(posedge clk_i)
591
if (rst_i) begin
592
        cpu_clk_en <= 1'b1;
593
end
594
else begin
595
        if (nmi_i)
596
                cpu_clk_en <= 1'b1;
597
        else
598
                cpu_clk_en <= clk_en;
599
end
600
 
601
//-----------------------------------------------------------------------------
602
// Instruction Cache
603
// 8kB
604
// 
605
//-----------------------------------------------------------------------------
606 14 robfinch
reg icaccess;
607 13 robfinch
 
608 14 robfinch
//Raptor64_icache_ram_x32 u1
609
//(
610
//      .clk(clk),
611
//      .wr(icaccess & ack_i),
612
//      .adr_i(adr_o[12:0]),
613
//      .dat_i(dat_i),
614
//      .pc(pc),
615
//      .insn(insn)
616
//);
617
wire [127:0] insnbundle;
618
 
619
Raptor64_icache_ram u1
620 13 robfinch
(
621 14 robfinch
        .clka(clk), // input clka
622
        .wea(icaccess & ack_i), // input [0 : 0] wea
623
        .addra(adr_o[12:3]), // input [9 : 0] addra
624
        .dina(dat_i), // input [63 : 0] dina
625
        .clkb(~clk), // input clkb
626
        .addrb(pc[12:4]), // input [9 : 0] addrb
627
        .doutb(insnbundle) // output [63 : 0] doutb
628 13 robfinch
);
629
 
630 14 robfinch
always @(pc or insnbundle)
631
begin
632
        case(pc[3:2])
633
        2'd0:   insn <= insnbundle[ 41: 0];
634
        2'd1:   insn <= insnbundle[ 83:42];
635
        2'd2:   insn <= insnbundle[125:84];
636
        2'd3:   insn <= 42'h37800000000;        // NOP instruction
637
        endcase
638
end
639
 
640
 
641 13 robfinch
reg [63:13] tmem [127:0];
642
reg [127:0] tvalid;
643
 
644
initial begin
645
        for (n=0; n < 128; n = n + 1)
646
                tmem[n] = 0;
647
        for (n=0; n < 128; n = n + 1)
648
                tvalid[n] = 0;
649
end
650
 
651
wire [64:13] tgout;
652
assign tgout = {tvalid[pc[12:6]],tmem[pc[12:6]]};
653
assign ihit = (tgout=={1'b1,ppc[63:13]});
654
 
655
 
656
//-----------------------------------------------------------------------------
657
// Data Cache
658
// No-allocate on write
659
//-----------------------------------------------------------------------------
660
reg dcaccess;
661
wire dhit;
662 14 robfinch
wire [64:15] dtgout;
663 13 robfinch
reg wrhit;
664
reg [7:0] dsel_o;
665
reg [63:0] dadr_o;
666
reg [31:0] ddat;
667
reg wr_dcache;
668
 
669
// cache RAM 16Kb
670 14 robfinch
/*Raptor64_dcache_ram u10
671 13 robfinch
(
672
        .clk(clk),
673 14 robfinch
        .wr(dcaccess ? wr_dcache : wrhit ? (dram_bus ? wr_en: we_o): 1'b0),
674 13 robfinch
        .sel(dcaccess ? 4'b1111 : wrhit ? ~wr_mask : 4'b0000),
675
        .wadr(dcaccess ? dadr_o[13:2] : wr_addr[13:2]),
676
        .i(dcaccess ? ddat : wr_data),
677
        .radr(pea[13:3]),
678
        .o(cdat)
679
);
680 14 robfinch
*/
681
Raptor64_dcache_ram u10
682
(
683
        .clka(clk), // input clka
684
        .ena(1'b1),
685
        .wea(dcaccess ? {8{ack_i}} : wrhit ? sel_o : 8'h00), // input [7 : 0] wea
686
        .addra(adr_o[14:3]), // input [11 : 0] addra
687
        .dina(dcaccess ? dat_i : dat_o), // input [63 : 0] dina
688 13 robfinch
 
689 14 robfinch
        .clkb(~clk), // input clkb
690
        .addrb(adr_o[14:3]), // input [11 : 0] addrb
691
        .doutb(cdat) // output [63 : 0] doutb
692
);
693
 
694
 
695
Raptor64_dcache_tagram u11
696 13 robfinch
(
697 14 robfinch
        .clka(clk), // input clka
698
        .ena(dtinit | (adr_o[5:3]==3'b111)), // input ena
699
        .wea(dtinit | (dcaccess & ack_i)), // input [0 : 0] wea
700
        .addra({1'b0,adr_o[14:6]}), // input [9 : 0] addra
701
        .dina(dtinit ? {1'b0,adr_o[63:15]} : {1'b1,adr_o[63:15]}), // input [48 : 0] dina
702 13 robfinch
 
703 14 robfinch
        .clkb(~clk), // input clkb
704
        .addrb({1'b0,pea[14:6]}), // input [9 : 0] addrb
705
        .doutb(dtgout) // output [48 : 0] doutb
706 13 robfinch
);
707 14 robfinch
// tag ram
708
//syncRam512x64_1rw1r u11
709
//(
710
//      .wrst(1'b0),
711
//      .wclk(clk),
712
//      .wce(adr_o[4:2]==3'b111),
713
//      .we(ack_i),
714
//      .wadr(adr_o[14:5]),
715
//      .i({14'h3FFF,dadr_o[63:14]}),
716
//      .wo(),
717
//
718
//      .rrst(1'b0),
719
//      .rclk(~clk),
720
//      .rce(1'b1),
721
//      .radr(pea[13:5]),
722
//      .ro({dtign,dtgout})
723
//);
724 13 robfinch
 
725 14 robfinch
assign dhit = (dtgout=={1'b1,pea[63:15]});
726 13 robfinch
 
727
//-----------------------------------------------------------------------------
728
//-----------------------------------------------------------------------------
729
 
730
reg [64:0] xData;
731
wire xisCacheElement = xData[63:52] != 12'hFFD;
732
reg m1IsCacheElement;
733
 
734
reg nopI;
735
wire [6:0] iFunc = insn[6:0];
736
wire [6:0] dFunc = dIR[6:0];
737
wire [6:0] xFunc = xIR[6:0];
738
wire [6:0] iOpcode = insn[41:35];
739
wire [6:0] xOpcode = xIR[41:35];
740
wire [6:0] dOpcode = dIR[41:35];
741
reg [6:0] m1Opcode,m2Opcode,m3Opcode,m4Opcode;
742
reg [6:0] m1Func,m2Func,m3Func,m4Func;
743
reg [63:0] m1Data,m2Data,m3Data,m4Data,wData,tData;
744
reg [63:0] m2Addr,m3Addr,m4Addr;
745
reg [63:0] tick;
746
reg [63:0] tba;
747
reg [63:0] exception_address,ipc;
748
reg [63:0] a,b,c,imm,m1b;
749
reg prev_ihit;
750
reg rsf;
751
reg [63:5] resv_address;
752
reg dirqf,rirqf,m1irqf,m2irqf,m3irqf,m4irqf,wirqf,tirqf;
753
reg xirqf;
754
reg [7:0] dextype,m1extype,m2extype,m3extype,m4extype,wextype,textype,exception_type;
755
reg [7:0] xextype;
756
wire advanceX_edge;
757
reg takb;
758
 
759
wire [127:0] mult_out;
760
wire [63:0] sqrt_out;
761
wire [63:0] div_q;
762
wire [63:0] div_r;
763
wire sqrt_done,mult_done,div_done;
764
wire isSqrt = xOpcode==`R && xFunc==`SQRT;
765
wire [7:0] bcdaddo,bcdsubo;
766
 
767
BCDAdd u40(.ci(1'b0),.a(a[7:0]),.b(b[7:0]),.o(bcdaddo),.c());
768
BCDSub u41(.ci(1'b0),.a(a[7:0]),.b(b[7:0]),.o(bcdsubo),.c());
769
 
770
isqrt #(64) u14
771
(
772
        .rst(rst_i),
773
        .clk(clk),
774
        .ce(1'b1),
775
        .ld(isSqrt),
776
        .a(a),
777
        .o(sqrt_out),
778
        .done(sqrt_done)
779
);
780
 
781
wire isMulu = xOpcode==`RR && xFunc==`MULU;
782
wire isMuls = (xOpcode==`RR && xFunc==`MULS) || xOpcode==`MULSI;
783
wire isMuli = xOpcode==`MULSI || xOpcode==`MULUI;
784
wire isMult = xOpcode==`MULSI || xOpcode==`MULUI || (xOpcode==`RR && (xFunc==`MULS || xFunc==`MULU));
785
wire isDivu = xOpcode==`RR && xFunc==`DIVU;
786
wire isDivs = (xOpcode==`RR && xFunc==`DIVS) || xOpcode==`DIVSI;
787
wire isDivi = xOpcode==`DIVSI || xOpcode==`DIVUI;
788
wire isDiv = xOpcode==`DIVSI || xOpcode==`DIVUI || (xOpcode==`RR && (xFunc==`DIVS || xFunc==`DIVU));
789
 
790
wire disRRShift = dOpcode==`RR && (
791
        dFunc==`SHL || dFunc==`ROL || dFunc==`SHR ||
792
        dFunc==`SHRU || dFunc==`ROR || dFunc==`ROLAM
793
        );
794
wire disRightShift = dOpcode==`RR && (
795
        dFunc==`SHR || dFunc==`SHRU || dFunc==`ROR
796
        );
797
 
798
Raptor64Mult u18
799
(
800
        .rst(rst_i),
801
        .clk(clk),
802
        .ld(isMult),
803
        .sgn(isMuls),
804
        .isMuli(isMuli),
805
        .a(a),
806
        .b(b),
807
        .imm(imm),
808
        .o(mult_out),
809
        .done(mult_done)
810
);
811
 
812
Raptor64Div u19
813
(
814
        .rst(rst_i),
815
        .clk(clk),
816
        .ld(isDiv),
817
        .sgn(isDivs),
818
        .isDivi(isDivi),
819
        .a(a),
820
        .b(b),
821
        .imm(imm),
822
        .qo(div_q),
823
        .ro(div_r),
824
        .dvByZr(),
825
        .done(div_done)
826
);
827
 
828
wire [63:0] fpZLOut;
829
wire [63:0] fpLooOut;
830
wire fpLooDone;
831
 
832
fpZLUnit #(64) u30
833
(
834
        .op(xFunc[5:0]),
835
        .a(a),
836
        .b(b),  // for fcmp
837
        .o(fpZLOut),
838
        .nanx()
839
);
840
 
841
fpLOOUnit #(64) u31
842
(
843
        .clk(clk),
844
        .ce(1'b1),
845
        .rm(rm),
846
        .op(xFunc[5:0]),
847
        .a(a),
848
        .o(fpLooOut),
849
        .done(fpLooDone)
850
);
851
 
852
function [2:0] popcnt6;
853
input [5:0] a;
854
begin
855
case(a)
856
6'b000000:      popcnt6 = 3'd0;
857
6'b000001:      popcnt6 = 3'd1;
858
6'b000010:      popcnt6 = 3'd1;
859
6'b000011:      popcnt6 = 3'd2;
860
6'b000100:      popcnt6 = 3'd1;
861
6'b000101:      popcnt6 = 3'd2;
862
6'b000110:      popcnt6 = 3'd2;
863
6'b000111:      popcnt6 = 3'd3;
864
6'b001000:      popcnt6 = 3'd1;
865
6'b001001:      popcnt6 = 3'd2;
866
6'b001010:      popcnt6 = 3'd2;
867
6'b001011:      popcnt6 = 3'd3;
868
6'b001100:      popcnt6 = 3'd2;
869
6'b001101:      popcnt6 = 3'd3;
870
6'b001110:      popcnt6 = 3'd3;
871
6'b001111:  popcnt6 = 3'd4;
872
6'b010000:      popcnt6 = 3'd1;
873
6'b010001:      popcnt6 = 3'd2;
874
6'b010010:  popcnt6 = 3'd2;
875
6'b010011:      popcnt6 = 3'd3;
876
6'b010100:  popcnt6 = 3'd2;
877
6'b010101:  popcnt6 = 3'd3;
878
6'b010110:  popcnt6 = 3'd3;
879
6'b010111:      popcnt6 = 3'd4;
880
6'b011000:      popcnt6 = 3'd2;
881
6'b011001:      popcnt6 = 3'd3;
882
6'b011010:      popcnt6 = 3'd3;
883
6'b011011:      popcnt6 = 3'd4;
884
6'b011100:      popcnt6 = 3'd3;
885
6'b011101:      popcnt6 = 3'd4;
886
6'b011110:      popcnt6 = 3'd4;
887
6'b011111:      popcnt6 = 3'd5;
888
6'b100000:      popcnt6 = 3'd1;
889
6'b100001:      popcnt6 = 3'd2;
890
6'b100010:      popcnt6 = 3'd2;
891
6'b100011:      popcnt6 = 3'd3;
892
6'b100100:      popcnt6 = 3'd2;
893
6'b100101:      popcnt6 = 3'd3;
894
6'b100110:      popcnt6 = 3'd3;
895
6'b100111:      popcnt6 = 3'd4;
896
6'b101000:      popcnt6 = 3'd2;
897
6'b101001:      popcnt6 = 3'd3;
898
6'b101010:      popcnt6 = 3'd3;
899
6'b101011:      popcnt6 = 3'd4;
900
6'b101100:      popcnt6 = 3'd3;
901
6'b101101:      popcnt6 = 3'd4;
902
6'b101110:      popcnt6 = 3'd4;
903
6'b101111:      popcnt6 = 3'd5;
904
6'b110000:      popcnt6 = 3'd2;
905
6'b110001:      popcnt6 = 3'd3;
906
6'b110010:      popcnt6 = 3'd3;
907
6'b110011:      popcnt6 = 3'd4;
908
6'b110100:      popcnt6 = 3'd3;
909
6'b110101:      popcnt6 = 3'd4;
910
6'b110110:      popcnt6 = 3'd4;
911
6'b110111:      popcnt6 = 3'd5;
912
6'b111000:      popcnt6 = 3'd3;
913
6'b111001:      popcnt6 = 3'd4;
914
6'b111010:      popcnt6 = 3'd4;
915
6'b111011:      popcnt6 = 3'd5;
916
6'b111100:      popcnt6 = 3'd4;
917
6'b111101:      popcnt6 = 3'd5;
918
6'b111110:      popcnt6 = 3'd5;
919
6'b111111:      popcnt6 = 3'd6;
920
endcase
921
end
922
endfunction
923
 
924
wire [63:0] jmp_tgt = dOpcode[6:4]==`IMM ? {dIR[26:0],insn[34:0],2'b00} : {pc[63:37],insn[34:0],2'b00};
925
 
926
//-----------------------------------------------------------------------------
927
// Branch history table.
928
// The history table is updated by the EX stage and read in
929
// both the EX and IF stages.
930
//-----------------------------------------------------------------------------
931
reg [2:0] gbl_branch_hist;
932
reg [1:0] branch_history_table [255:0];
933
wire [7:0] bht_wa = {xpc[5:0],gbl_branch_hist[2:1]};              // write address
934
wire [7:0] bht_ra1 = {xpc[5:0],gbl_branch_hist[2:1]};             // read address (EX stage)
935
wire [7:0] bht_ra2 = {pc[5:0],gbl_branch_hist[2:1]};      // read address (IF stage)
936
wire [1:0] bht_xbits = branch_history_table[bht_ra1];
937
wire [1:0] bht_ibits = branch_history_table[bht_ra2];
938
wire predict_taken = bht_ibits==2'd0 || bht_ibits==2'd1;
939
 
940
wire isxBranchI = (xOpcode==`BRAI || xOpcode==`BRNI || xOpcode==`BEQI || xOpcode==`BNEI ||
941
                                        xOpcode==`BLTI || xOpcode==`BLEI || xOpcode==`BGTI || xOpcode==`BGEI ||
942
                                        xOpcode==`BLTUI || xOpcode==`BLEUI || xOpcode==`BGTUI || xOpcode==`BGEUI)
943
                                ;
944
wire isxBranch = isxBranchI || xOpcode==`TRAPcc || xOpcode==`TRAPcci || xOpcode==`BTRI || xOpcode==`BTRR;
945
 
946
reg [1:0] xbits_new;
947
 
948
always @(takb or bht_xbits)
949
if (takb) begin
950
        if (bht_xbits != 2'd1)
951
                xbits_new <= bht_xbits + 2'd1;
952
        else
953
                xbits_new <= bht_xbits;
954
end
955
else begin
956
        if (bht_xbits != 2'd2)
957
                xbits_new <= bht_xbits - 2'd1;
958
        else
959
                xbits_new <= bht_xbits;
960
end
961
 
962
// For simulation only, initialize the history table to zeros.
963
// In the real world we don't care.
964
initial begin
965
        for (n = 0; n < 256; n = n + 1)
966
                branch_history_table[n] = 0;
967
end
968
 
969
//-----------------------------------------------------------------------------
970
// Evaluate branch conditions.
971
//-----------------------------------------------------------------------------
972
wire signed [63:0] as = a;
973
wire signed [63:0] bs = b;
974
wire signed [63:0] imms = imm;
975
wire aeqz = a==64'd0;
976
wire beqz = b==64'd0;
977
wire immeqz = imm==64'd0;
978
wire eq = a==b;
979
wire eqi = a==imm;
980
wire lt = as < bs;
981
wire lti = as < imms;
982
wire ltu = a < b;
983
wire ltui = a < imm;
984
 
985
always @(xOpcode or xFunc or a or eq or eqi or lt or lti or ltu or ltui or aeqz or beqz or rsf or xIR)
986
case (xOpcode)
987
`BTRR:
988 14 robfinch
        case(xIR[4:0])
989 13 robfinch
        `BRA:   takb = 1'b1;
990
        `BRN:   takb = 1'b0;
991
        `BEQ:   takb = eq;
992
        `BNE:   takb = !eq;
993
        `BLT:   takb = lt;
994
        `BLE:   takb = lt|eq;
995
        `BGT:   takb = !(lt|eq);
996
        `BGE:   takb = !lt;
997
        `BLTU:  takb = ltu;
998
        `BLEU:  takb = ltu|eq;
999
        `BGTU:  takb = !(ltu|eq);
1000
        `BGEU:  takb = !ltu;
1001
        `BOR:   takb = !aeqz || !beqz;
1002
        `BAND:  takb = !aeqz && !beqz;
1003
        `BNR:   takb = !rsf;
1004
        `BEQR:  takb = eq;
1005
        `BNER:  takb = !eq;
1006
        `BLTR:  takb = lt;
1007
        `BLER:  takb = lt|eq;
1008
        `BGTR:  takb = !(lt|eq);
1009
        `BGER:  takb = !lt;
1010
        `BLTUR: takb = ltu;
1011
        `BLEUR: takb = ltu|eq;
1012
        `BGTUR: takb = !(ltu|eq);
1013
        `BGEUR: takb = !ltu;
1014
        default:        takb = 1'b0;
1015
        endcase
1016
`BRAI:  takb = 1'b1;
1017
`BRNI:  takb = 1'b0;
1018
`BEQI:  takb = eqi;
1019
`BNEI:  takb = !eqi;
1020
`BLTI:  takb = lti;
1021
`BLEI:  takb = lti|eqi;
1022
`BGTI:  takb = !(lti|eqi);
1023
`BGEI:  takb = !lti;
1024
`BLTUI: takb = ltui;
1025
`BLEUI: takb = ltui|eqi;
1026
`BGTUI: takb = !(ltui|eqi);
1027
`BGEUI: takb = !ltui;
1028
`BTRI:
1029
        case(xIR[24:18])
1030
        `BRA:   takb = 1'b1;
1031
        `BRN:   takb = 1'b0;
1032
        `BEQ:   takb = eqi;
1033
        `BNE:   takb = !eqi;
1034
        `BLT:   takb = lti;
1035
        `BLE:   takb = lti|eqi;
1036
        `BGT:   takb = !(lti|eqi);
1037
        `BGE:   takb = !lti;
1038
        `BLTU:  takb = ltui;
1039
        `BLEU:  takb = ltui|eqi;
1040
        `BGTU:  takb = !(ltui|eqi);
1041
        `BGEU:  takb = !ltui;
1042
        default:        takb = 1'b0;
1043
        endcase
1044
`TRAPcc:
1045
        case(xFunc)
1046
        `TEQ:   takb = eq;
1047
        `TNE:   takb = !eq;
1048
        `TLT:   takb = lt;
1049
        `TLE:   takb = lt|eq;
1050
        `TGT:   takb = !(lt|eq);
1051
        `TGE:   takb = !lt;
1052 14 robfinch
        `TLTU:  takb = ltu;
1053
        `TLEU:  takb = ltu|eq;
1054
        `TGTU:  takb = !(ltu|eq);
1055
        `TGEU:  takb = !ltu;
1056 13 robfinch
        default:        takb = 1'b0;
1057
        endcase
1058
`TRAPcci:
1059
        case(xIR[29:25])
1060
        `TEQI:  takb = eqi;
1061
        `TNEI:  takb = !eqi;
1062
        `TLTI:  takb = lti;
1063
        `TLEI:  takb = lti|eqi;
1064
        `TGTI:  takb = !(lti|eqi);
1065
        `TGEI:  takb = !lti;
1066 14 robfinch
        `TLTUI: takb = ltui;
1067
        `TLEUI: takb = ltui|eqi;
1068
        `TGTUI: takb = !(ltui|eqi);
1069
        `TGEUI: takb = !ltui;
1070 13 robfinch
        default:        takb = 1'b0;
1071
        endcase
1072
default:
1073
        takb = 1'b0;
1074
endcase
1075
 
1076
 
1077
//-----------------------------------------------------------------------------
1078
// Datapath (ALU) operations.
1079
//-----------------------------------------------------------------------------
1080
wire [6:0] cntlzo,cntloo;
1081
cntlz64 u12 ( .i(a),  .o(cntlzo) );
1082
cntlo64 u13 ( .i(a),  .o(cntloo) );
1083
 
1084
reg [1:0] shftop;
1085
wire [63:0] shfto;
1086
always @(xFunc)
1087
        if (xFunc==`SHL)
1088
                shftop = 2'b00;
1089
        else if (xFunc==`ROL || xFunc==`ROR)
1090
                shftop = 2'b01;
1091
        else if (xFunc==`SHRU)
1092
                shftop = 2'b10;
1093
        else if (xFunc==`SHR)
1094
                shftop = 2'b11;
1095
        else
1096
                shftop = 2'b01;
1097
 
1098
wire [63:0] masko;
1099
shiftAndMask u15
1100
(
1101
        .op(shftop),
1102
        .oz(1'b0),              // zero the output
1103
        .a(a),
1104
        .b(b[5:0]),
1105
        .mb(xIR[12:7]),
1106
        .me(xIR[18:13]),
1107
        .o(shfto),
1108
        .mo(masko)
1109
);
1110
 
1111
always @(xOpcode or xFunc or a or b or imm or as or bs or imms or xpc or
1112 14 robfinch
        sqrt_out or cntlzo or cntloo or tick or ipc or tba or AXC or
1113 13 robfinch
        lt or eq or ltu or mult_out or lti or eqi or ltui or xIR or div_q or div_r or
1114
        shfto or masko or bcdaddo or bcdsubo or fpLooOut or fpZLOut or
1115 14 robfinch
        Wired or Index or Random or TLBPhysPage0 or TLBPhysPage1 or TLBVirtPage or TLBASID or
1116 13 robfinch
        PageTableAddr or BadVAddr or ASID or TLBPageMask
1117
)
1118 16 robfinch
casex(xOpcode)
1119 13 robfinch
`R:
1120
        casex(xFunc)
1121
        `COM:   xData = ~a;
1122
        `NOT:   xData = ~|a;
1123
        `NEG:   xData = -a;
1124
        `ABS:   xData = a[63] ? -a : a;
1125
        `SQRT:  xData = sqrt_out;
1126
        `SWAP:  xData = {a[31:0],a[63:32]};
1127
 
1128
        `REDOR:         xData = |a;
1129
        `REDAND:        xData = &a;
1130
 
1131
        `CTLZ:  xData = cntlzo;
1132
        `CTLO:  xData = cntloo;
1133
        `CTPOP: xData = {4'd0,popcnt6(a[5:0])} +
1134
                                        {4'd0,popcnt6(a[11:6])} +
1135
                                        {4'd0,popcnt6(a[17:12])} +
1136
                                        {4'd0,popcnt6(a[23:18])} +
1137
                                        {4'd0,popcnt6(a[29:24])} +
1138
                                        {4'd0,popcnt6(a[35:30])} +
1139
                                        {4'd0,popcnt6(a[41:36])} +
1140
                                        {4'd0,popcnt6(a[47:42])} +
1141
                                        {4'd0,popcnt6(a[53:48])} +
1142
                                        {4'd0,popcnt6(a[59:54])} +
1143
                                        {4'd0,popcnt6(a[63:60])}
1144
                                        ;
1145
        `SEXT8:         xData = {{56{a[7]}},a[7:0]};
1146
        `SEXT16:        xData = {{48{a[15]}},a[15:0]};
1147
        `SEXT32:        xData = {{32{a[31]}},a[31:0]};
1148
 
1149
        `MFSPR:
1150
                case(xIR[12:7])
1151
                `Wired:                 xData = Wired;
1152
                `TLBIndex:              xData = Index;
1153
                `TLBRandom:             xData = Random;
1154 14 robfinch
                `TLBPhysPage0:  xData = {TLBPhysPage0,13'd0};
1155
                `TLBPhysPage1:  xData = {TLBPhysPage1,13'd0};
1156 13 robfinch
                `TLBVirtPage:   xData = {TLBVirtPage,13'd0};
1157
                `TLBPageMask:   xData = {TLBPageMask,13'd0};
1158 14 robfinch
                `TLBASID:       begin
1159
                                        xData = 65'd0;
1160
                                        xData[0] = TLBValid;
1161
                                        xData[1] = TLBD;
1162
                                        xData[2] = TLBG;
1163
                                        xData[15:8] = TLBASID;
1164
                                        end
1165 13 robfinch
                `PageTableAddr: xData = {PageTableAddr,13'd0};
1166
                `BadVAddr:              xData = {BadVAddr,13'd0};
1167
                `ASID:                  xData = ASID;
1168
                `Tick:                  xData = tick;
1169
                `EPC:                   xData = EPC;
1170
                `CauseCode:             xData = CauseCode;
1171
                `TBA:                   xData = TBA;
1172 14 robfinch
                `AXC:                   xData = xAXC;
1173 13 robfinch
                default:        xData = 65'd0;
1174
                endcase
1175
        `OMG:           xData = mutex_gate[a[5:0]];
1176
        `CMG:           xData = mutex_gate[a[5:0]];
1177 14 robfinch
        `OMGI:          begin
1178
                                xData = mutex_gate[xIR[12:7]];
1179
                                $display("mutex_gate[%d]=%d",xIR[12:7],mutex_gate[xIR[12:7]]);
1180
                                end
1181 13 robfinch
        `CMGI:          xData = mutex_gate[xIR[12:7]];
1182
        default:        xData = 65'd0;
1183
        endcase
1184
`RR:
1185
        case(xFunc)
1186
        `ADD:   xData = a + b;
1187
        `ADDU:  xData = a + b;
1188
        `SUB:   xData = a - b;
1189
        `SUBU:  xData = a - b;
1190
        `CMP:   xData = lt ? 64'hFFFFFFFFFFFFF : eq ? 64'd0 : 64'd1;
1191
        `CMPU:  xData = ltu ? 64'hFFFFFFFFFFFFF : eq ? 64'd0 : 64'd1;
1192
        `SEQ:   xData = eq;
1193
        `SNE:   xData = !eq;
1194
        `SLT:   xData = lt;
1195
        `SLE:   xData = lt|eq;
1196
        `SGT:   xData = !(lt|eq);
1197
        `SGE:   xData = !lt;
1198
        `SLTU:  xData = ltu;
1199
        `SLEU:  xData = ltu|eq;
1200
        `SGTU:  xData = !(ltu|eq);
1201
        `SGEU:  xData = !ltu;
1202
        `AND:   xData = a & b;
1203
        `OR:    xData = a | b;
1204
        `XOR:   xData = a ^ b;
1205
        `ANDC:  xData = a & ~b;
1206
        `NAND:  xData = ~(a & b);
1207
        `NOR:   xData = ~(a | b);
1208
        `XNOR:  xData = ~(a ^ b);
1209
        `ORC:   xData = a | ~b;
1210
        `MIN:   xData = lt ? a : b;
1211
        `MAX:   xData = lt ? b : a;
1212
        `MOVZ:  xData = b;
1213
        `MOVNZ: xData = b;
1214
        `MULS:  xData = mult_out[63:0];
1215
        `MULU:  xData = mult_out[63:0];
1216
        `DIVS:  xData = div_q;
1217
        `DIVU:  xData = div_q;
1218
        `MOD:   xData = div_r;
1219
 
1220
        `SHL:   xData = shfto;
1221
        `SHRU:  xData = shfto;
1222
        `ROL:   xData = shfto;
1223
        `ROR:   xData = {a[0],a[63:1]};
1224
        `SHR:   xData = shfto;
1225
        `ROLAM: xData = shfto & masko;
1226
 
1227
        `BCD_ADD:       xData = bcdaddo;
1228
        `BCD_SUB:       xData = bcdsubo;
1229
 
1230
        default:        xData = 65'd0;
1231
        endcase
1232
`SHFTI:
1233
        case(xFunc)
1234
        `SHLI:  xData = shfto;
1235
        `SHRUI: xData = shfto;
1236
        `ROLI:  xData = shfto;
1237
        `RORI:  xData = {a[0],a[63:1]};
1238
        `SHRI:  xData = shfto;
1239
        `ROLAMI:        xData = shfto & masko;
1240
        `BFINS:         begin for (n = 0; n < 64; n = n + 1) xData[n] = masko[n] ? shfto[n] : b[n]; xData[64] = 1'b0; end
1241
        `BFSET:         begin for (n = 0; n < 64; n = n + 1) xData[n] = masko[n] ? 1'b1 : b[n]; xData[64] = 1'b0; end
1242
        `BFCLR:         begin for (n = 0; n < 64; n = n + 1) xData[n] = masko[n] ? 1'b0 : b[n]; xData[64] = 1'b0; end
1243
        `BFCHG:         begin for (n = 0; n < 64; n = n + 1) xData[n] = masko[n] ? ~b[n] : b[n]; xData[64] = 1'b0; end
1244
        default:        xData = 65'd0;
1245
        endcase
1246 14 robfinch
`SETLO: xData = {{32{xIR[31]}},xIR[31:0]};
1247
`SETHI: xData = {xIR[31:0],a[31:0]};
1248 13 robfinch
`ADDI:  xData = a + imm;
1249
`ADDUI: xData = a + imm;
1250
`SUBI:  xData = a - imm;
1251 14 robfinch
`SUBUI: xData = a - imm;
1252 13 robfinch
`CMPI:  xData = lti ? 64'hFFFFFFFFFFFFF : eqi ? 64'd0 : 64'd1;
1253
`CMPUI: xData = ltui ? 64'hFFFFFFFFFFFFF : eqi ? 64'd0 : 64'd1;
1254
`MULSI: xData = mult_out[63:0];
1255
`MULUI: xData = mult_out[63:0];
1256
`DIVSI: xData = div_q;
1257
`DIVUI: xData = div_q;
1258
`ANDI:  xData = a & imm;
1259
`ORI:   xData = a | imm;
1260
`XORI:  xData = a ^ imm;
1261
`SEQI:  xData = eqi;
1262
`SNEI:  xData = !eqi;
1263
`SLTI:  xData = lti;
1264
`SLEI:  xData = lti|eqi;
1265
`SGTI:  xData = !(lti|eqi);
1266
`SGEI:  xData = !lti;
1267
`SLTUI: xData = ltui;
1268
`SLEUI: xData = ltui|eqi;
1269
`SGTUI: xData = !(ltui|eqi);
1270
`SGEUI: xData = !ltui;
1271
`INB,`INCH,`INH,`INW:
1272
                xData = a + imm;
1273
`OUTB,`OUTC,`OUTH,`OUTW:
1274
                xData = a + imm;
1275
`LW,`LH,`LC,`LB,`LHU,`LCU,`LBU,`LWR:
1276
                xData = a + imm;
1277
`SW,`SH,`SC,`SB,`SWC:
1278
                xData = a + imm;
1279
`MEMNDX:
1280
                xData = a + b + imm;
1281
`BEQ,`BNE,`BLT,`BLE,`BGT,`BGE,`BLTU,`BLEU,`BGTU,`BGEU,`BOR,`BAND:
1282
                xData = 64'd0;
1283
`TRAPcc:        xData = fnIncPC(xpc);
1284
`TRAPcci:       xData = fnIncPC(xpc);
1285
`CALL:          xData = fnIncPC(xpc);
1286
`JAL:           xData = xpc + {xIR[29:25],2'b00};
1287
`RET:   xData = a + {imm,2'b00};
1288
`FPLOO: xData = fpLooOut;
1289
`FPZL:  xData = fpZLOut;
1290
default:        xData = 65'd0;
1291
endcase
1292
 
1293 14 robfinch
wire v_ri,v_rr;
1294
overflow u2 (.op(xOpcode==`SUBI), .a(a[63]), .b(imm[63]), .s(xData[63]), .v(v_ri));
1295
overflow u3 (.op(xOpcode==`RR && xFunc==`SUB), .a(a[63]), .b(b[63]), .s(xData[63]), .v(v_rr));
1296
 
1297 13 robfinch
wire dbz_error = (xOpcode==`DIVSI||xOpcode==`DIVUI) && b==64'd0;
1298 14 robfinch
wire ovr_error = ((xOpcode==`ADDI || xOpcode==`SUBI) || (xOpcode==`RR && (xFunc==`SUB || xFunc==`ADD))) && v_ri;
1299
wire priv_violation = !KernelMode && (xOpcode==`MISC &&
1300
        (xFunc==`IRET || xFunc==`ERET || xFunc==`CLI || xFunc==`SEI ||
1301
         xFunc==`TLBP || xFunc==`TLBR || xFunc==`TLBWR || xFunc==`TLBWI
1302
        ));
1303 13 robfinch
wire xIsSqrt = xOpcode==`R && xFunc==`SQRT;
1304
wire xIsMult = (xOpcode==`RR && (xFunc==`MULU || xFunc==`MULS)) ||
1305
        xOpcode==`MULSI || xOpcode==`MULUI;
1306
wire xIsDiv = (xOpcode==`RR && (xFunc==`DIVU || xFunc==`DIVS)) ||
1307
        xOpcode==`DIVSI || xOpcode==`DIVUI;
1308
 
1309
wire xIsLoad =
1310
        xOpcode==`LW || xOpcode==`LH || xOpcode==`LB || xOpcode==`LWR ||
1311
        xOpcode==`LHU || xOpcode==`LBU ||
1312
        xOpcode==`LC || xOpcode==`LCU ||
1313
        xOpcode==`INW || xOpcode==`INB || xOpcode==`INH || xOpcode==`INCH
1314
        ;
1315
wire xIsStore =
1316
        xOpcode==`SW || xOpcode==`SH || xOpcode==`SB || xOpcode==`SC || xOpcode==`SWC ||
1317
        xOpcode==`OUTW || xOpcode==`OUTH || xOpcode==`OUTB || xOpcode==`OUTC
1318
        ;
1319
wire xIsSWC = xOpcode==`SWC;
1320
wire xIsIn =
1321
        xOpcode==`INW || xOpcode==`INH || xOpcode==`INCH || xOpcode==`INB
1322
        ;
1323
//wire mIsSWC = mOpcode==`SWC;
1324
 
1325
//wire mIsLoad =
1326
//      mOpcode==`LW || mOpcode==`LH || mOpcode==`LB || mOpcode==`LC || mOpcode==`LWR ||
1327
//      mOpcode==`LHU || mOpcode==`LBU || mOpcode==`LCU ||
1328
//      mOpcode==`INW || mOpcode==`INB || mOpcode==`INH
1329
//      ;
1330
wire m1IsLoad =
1331
        m1Opcode==`LW || m1Opcode==`LH || m1Opcode==`LB || m1Opcode==`LC || m1Opcode==`LWR ||
1332
        m1Opcode==`LHU || m1Opcode==`LBU || m1Opcode==`LCU
1333
        ;
1334
wire m1IsIn =
1335
        m1Opcode==`INW || m1Opcode==`INH || m1Opcode==`INCH || m1Opcode==`INB
1336
        ;
1337 14 robfinch
wire m2IsInW = m2Opcode==`INW;
1338 13 robfinch
wire m1IsStore =
1339
        m1Opcode==`SW || m1Opcode==`SH || m1Opcode==`SB || m1Opcode==`SC || m1Opcode==`SWC
1340
        ;
1341 14 robfinch
wire xIsIO =
1342
        xIsIn ||
1343
        xOpcode==`OUTW || xOpcode==`OUTH || xOpcode==`OUTC || xOpcode==`OUTB
1344
        ;
1345 13 robfinch
wire m1IsIO =
1346
        m1IsIn ||
1347
        m1Opcode==`OUTW || m1Opcode==`OUTH || m1Opcode==`OUTC || m1Opcode==`OUTB
1348
        ;
1349
 
1350
wire m2IsLoad =
1351
        m2Opcode==`LW || m2Opcode==`LH || m2Opcode==`LB || m2Opcode==`LC || m2Opcode==`LWR ||
1352
        m2Opcode==`LHU || m2Opcode==`LBU || m2Opcode==`LCU
1353
        ;
1354 14 robfinch
wire m2IsStore =
1355
        m2Opcode==`SW || m2Opcode==`SWC || m2Opcode==`SH || m2Opcode==`SC || m2Opcode==`SB;
1356 13 robfinch
 
1357
wire xIsFPLoo = xOpcode==`FPLOO;
1358
 
1359 14 robfinch
wire xneedBus = xIsIO;
1360
wire m1needBus = ((m1IsLoad & !dhit)| m1IsStore) || m1IsIO;
1361
wire m2needBus = (m2IsLoad | m2IsStore);
1362
 
1363 13 robfinch
// Stall on SWC allows rsf flag to be loaded for the next instruction
1364
// Currently stalls on load of R0, but doesn't need to.
1365 14 robfinch
wire StallR =   (((xIsLoad||xIsIn) && ((xRt==dRa)||(xRt==dRb)||(xRt==dRt))) || xIsSWC) ||
1366
                                (((m1IsLoad||m1IsIn) && ((m1Rt==dRa)||(m1Rt==dRb)||(m1Rt==dRt)))) ||
1367
                                (((m2IsLoad||m2IsInW) && ((m2Rt==dRa)||(m2Rt==dRb)||(m2Rt==dRt))))
1368
                                ;
1369
wire StallX = xneedBus & (m1needBus|m2needBus|icaccess|dcaccess);
1370
wire StallM1 = m1needBus & (m2needBus|icaccess|dcaccess);
1371
wire StallM2 =  icaccess|dcaccess;
1372 13 robfinch
 
1373
wire advanceT = !resetA;
1374
wire advanceW = advanceT;
1375 14 robfinch
wire advanceM2 = advanceW &&
1376
                                        ((m2IsLoad || m2IsStore) ? ack_i : 1'b1) &&
1377
                                        !StallM2
1378 13 robfinch
                                        ;
1379 14 robfinch
wire advanceM1 = advanceM2 &
1380 13 robfinch
                                        (m1IsIO ? ack_i : 1'b1) &
1381
                                        ((m1IsLoad & m1IsCacheElement) ? dhit : 1'b1) &
1382
                                        !StallM1
1383
                                        ;
1384 14 robfinch
wire advanceX = advanceM1 & (
1385 13 robfinch
                                        xIsSqrt ? sqrt_done :
1386
                                        xIsMult ? mult_done :
1387
                                        xIsDiv ? div_done :
1388
                                        xIsFPLoo ? fpLooDone :
1389 14 robfinch
                                        1'b1) &
1390
                                        !StallX;
1391
wire advanceR = advanceX & !StallR;
1392 13 robfinch
wire advanceI = advanceR & ihit;
1393
 
1394
wire triggerDCacheLoad = (m1IsLoad & m1IsCacheElement & !dhit) &&       // there is a miss
1395 14 robfinch
                                                !(icaccess | dcaccess) &&       // caches are not active
1396
                                                m2Opcode==`NOPI                         // and the pipeline is free of memory-ops
1397 13 robfinch
                                                ;
1398
// Since IMM is "sticky" we have to check for it.
1399
wire triggerICacheLoad = !ihit & !triggerDCacheLoad &   // There is a miss
1400
                                                (dOpcode==`NOPI || dOpcode[6:4]==`IMM) &&                       // and the pipeline is flushed
1401
                                                (xOpcode==`NOPI || xOpcode[6:4]==`IMM) &&
1402
                                                m1Opcode==`NOPI &&
1403 14 robfinch
                                                m2Opcode==`NOPI
1404 13 robfinch
                                                ;
1405 14 robfinch
wire EXexception_pending = ovr_error || dbz_error || priv_violation || xOpcode==`TRAPcci || xOpcode==`TRAPcc;
1406
wire M1exception_pending = advanceM1 & (m1IsLoad|m1IsStore) & DTLBMiss;
1407
wire exception_pending = EXexception_pending | M1exception_pending;
1408 13 robfinch
 
1409
wire xWillLoadStore = (xIsLoad||xIsStore) & advanceX;
1410
wire stallCacheLoad = xWillLoadStore;
1411
 
1412
reg prev_nmi,nmi_edge;
1413
 
1414
 
1415
//---------------------------------------------------------
1416
// Register file.
1417
//---------------------------------------------------------
1418
 
1419
syncRam512x64_1rw3r u5
1420
(
1421
        .wrst(1'b0),
1422
        .wclk(clk),
1423
        .wce(advanceW),
1424
        .we(1'b1),
1425
        .wadr(wRt),
1426
        .i(wData),
1427
        .wo(),
1428
 
1429
        .rrsta(1'b0),
1430
        .rclka(~clk),
1431
        .rcea(advanceR),
1432
        .radra(dRa),
1433
        .roa(rfoa),
1434
 
1435
        .rrstb(1'b0),
1436
        .rclkb(~clk),
1437
        .rceb(advanceR),
1438
        .radrb(dRb),
1439
        .rob(rfob),
1440
 
1441
        .rrstc(1'b0),
1442
        .rclkc(~clk),
1443
        .rcec(advanceR),
1444
        .radrc(dRc),
1445
        .roc(rfoc)
1446
);
1447
 
1448
 
1449
reg m1clkoff,m2clkoff,m3clkoff,m4clkoff,wclkoff;
1450
reg dFip,xFip,m1Fip,m2Fip,m3Fip,m4Fip,wFip;
1451
 
1452
always @(posedge clk)
1453
if (rst_i) begin
1454
        bte_o <= 2'b00;
1455
        cti_o <= 3'b000;
1456
        cyc_o <= 1'b0;
1457
        stb_o <= 1'b0;
1458
        we_o <= 1'b0;
1459
        sel_o <= 8'h00;
1460
        adr_o <= 64'd0;
1461
        dat_o <= 64'd0;
1462
        dccyc <= 1'b0;
1463
 
1464 14 robfinch
        TBA <= 64'd0;
1465
        pc <= `RESET_VECTOR;
1466 13 robfinch
        m1Opcode <= `NOPI;
1467
        m2Opcode <= `NOPI;
1468
        m3Opcode <= `NOPI;
1469
        m4Opcode <= `NOPI;
1470
        dIR <= `NOP_INSN;
1471
        dRt <= 9'd0;
1472
        tRt <= 9'd0;
1473
        wRt <= 9'd0;
1474
        m1Rt <= 9'd0;
1475
        m2Rt <= 9'd0;
1476
        m3Rt <= 9'd0;
1477
        m4Rt <= 9'd0;
1478
        tData <= 64'd0;
1479
        wData <= 64'd0;
1480
        m1Data <= 64'd0;
1481
        m2Data <= 64'd0;
1482
        m3Data <= 64'd0;
1483
        m4Data <= 64'd0;
1484
        icaccess <= 1'b0;
1485
        dcaccess <= 1'b0;
1486
        nopI <= 1'b0;
1487
        prev_ihit <= 1'b0;
1488 14 robfinch
        dhwxtype <= 2'b00;
1489
        xhwxtype <= 2'b00;
1490
        m1hwxtype <= 2'b00;
1491
        m2hwxtype <= 2'b00;
1492
        m3hwxtype <= 2'b00;
1493
        m4hwxtype <= 2'b00;
1494
        whwxtype <= 2'b00;
1495 13 robfinch
        wFip <= 1'b0;
1496
        m4Fip <= 1'b0;
1497
        m3Fip <= 1'b0;
1498
        m2Fip <= 1'b0;
1499
        m1Fip <= 1'b0;
1500
        xFip <= 1'b0;
1501
        dFip <= 1'b0;
1502
        dirqf <= 1'b0;
1503 16 robfinch
        dpcv <= 1'b0;
1504
        xpcv <= 1'b0;
1505
        m1pcv <= 1'b0;
1506
        m2pcv <= 1'b0;
1507
        wpcv <= 1'b0;
1508 13 robfinch
        tick <= 32'd0;
1509
        cstate <= IDLE;
1510
        dImm <= 64'd0;
1511 14 robfinch
        AXC <= 4'd0;
1512
        dAXC <= 4'd0;
1513 13 robfinch
        xirqf <= 1'b0;
1514
        xextype <= 8'h00;
1515
        xIR <= `NOP_INSN;
1516
        xpc <= 64'd0;
1517
        a <= 64'd0;
1518
        b <= 64'd0;
1519
        imm <= 64'd0;
1520
        xRt <= 9'd0;
1521
        clk_en <= 1'b1;
1522
        Random <= 4'hF;
1523
        Wired <= 4'd0;
1524 14 robfinch
        StatusEXL <= 1'b1;
1525
        StatusHWI <= 1'b0;
1526 13 robfinch
        resetA <= 1'b1;
1527 14 robfinch
        mutex_gate <= 64'h0;
1528 13 robfinch
        gbl_branch_hist <= 3'b000;
1529 14 robfinch
        m1IsCacheElement <= 1'b0;
1530
        dtinit <= 1'b1;
1531 13 robfinch
end
1532
else begin
1533
 
1534
//---------------------------------------------------------
1535
// Initialize program counters
1536 14 robfinch
// Initialize data tags to zero.
1537 13 robfinch
//---------------------------------------------------------
1538
if (resetA) begin
1539
        pc <= `RESET_VECTOR;
1540 14 robfinch
        adr_o[14:6] <= adr_o[14:6]+9'd1;
1541
        if (adr_o[14:6]==9'h1FF) begin
1542
                dtinit <= 1'b0;
1543
                resetA <= 1'b0;
1544
        end
1545 13 robfinch
end
1546
 
1547
if (Random==Wired)
1548
        Random <= 4'hF;
1549
else
1550
        Random <= Random - 4'd1;
1551
 
1552
tick <= tick + 64'd1;
1553
 
1554
prev_nmi <= nmi_i;
1555
if (!prev_nmi & nmi_i)
1556
        nmi_edge <= 1'b1;
1557
 
1558
 
1559
// A store by any device in the system to a reserved address blcok
1560
// clears the reservation.
1561
 
1562
if (sys_adv && sys_adr[63:5]==resv_address)
1563
        resv_address <= 59'd0;
1564
 
1565
//---------------------------------------------------------
1566
// TRAILER:
1567
// - placeholder to allow the use of synchronous register
1568
//   memory
1569
//---------------------------------------------------------
1570
if (advanceT) begin
1571
        tRt <= 9'd0;
1572
        tData <= 64'd0;
1573
end
1574
 
1575
//---------------------------------------------------------
1576
// WRITEBACK:
1577
// - update the register file with results
1578
// - record exception address and type
1579
// - jump to exception handler routine (below)
1580
//---------------------------------------------------------
1581
if (advanceW) begin
1582
        textype <= wextype;
1583
        wextype <= `EX_NON;
1584
        tRt <= wRt;
1585
        tData <= wData;
1586 16 robfinch
        if (wRt!=5'd0)
1587
                $display("Writing regfile[%d:%d] with %h", wRt[8:5],wRt[4:0], wData);
1588 13 robfinch
        wRt <= 9'd0;
1589
        wData <= 64'd0;
1590 14 robfinch
        if (|whwxtype) begin
1591
                dhwxtype <= 2'b00;
1592
                xhwxtype <= 2'b00;
1593
                m1hwxtype <= 2'b00;
1594
                m2hwxtype <= 2'b00;
1595
                m3hwxtype <= 2'b00;
1596
                m4hwxtype <= 2'b00;
1597
                whwxtype <= 2'b00;
1598 13 robfinch
        end
1599
        clk_en <= 1'b1;
1600
        if (wclkoff)
1601
                clk_en <= 1'b0;
1602
        wclkoff <= 1'b0;
1603
        m1clkoff <= 1'b0;
1604
        m2clkoff <= 1'b0;
1605
        m3clkoff <= 1'b0;
1606
        m4clkoff <= 1'b0;
1607
        if (wFip) begin
1608
                wFip <= 1'b0;
1609
                m4Fip <= 1'b0;
1610
                m3Fip <= 1'b0;
1611
                m2Fip <= 1'b0;
1612
                m1Fip <= 1'b0;
1613
                xFip <= 1'b0;
1614
                dFip <= 1'b0;
1615
        end
1616
end
1617
 
1618
//---------------------------------------------------------
1619
// MEMORY:
1620
//---------------------------------------------------------
1621 14 robfinch
if (advanceM2) begin
1622
        wData <= m2Data;
1623
        whwxtype <= m2hwxtype;
1624
        wextype <= m2extype;
1625
        wRt <= m2Rt;
1626
        wpc <= m2pc;
1627 16 robfinch
        wpcv <= m2pcv;
1628 14 robfinch
        wclkoff <= m2clkoff;
1629
        wFip <= m2Fip;
1630 13 robfinch
 
1631 14 robfinch
        m2Rt <= 9'd0;
1632
        m2Opcode <= `NOPI;
1633
        m2Func <= 7'd0;
1634
        m2Addr <= 64'd0;
1635
        m2Data <= 64'd0;
1636
        m2clkoff <= 1'b0;
1637
        m2pc <= 64'd0;
1638
        m2extype <= `EX_NON;
1639
        if (m2extype==`EX_NON) begin
1640
                case(m2Opcode)
1641
                `SH,`SC,`SB,`SW,`SWC:
1642 13 robfinch
                        begin
1643
                                cyc_o <= 1'b0;
1644
                                stb_o <= 1'b0;
1645 14 robfinch
                                we_o <= 1'b0;
1646 13 robfinch
                                sel_o <= 4'h0;
1647 14 robfinch
                                m3Opcode <= `NOPI;
1648 13 robfinch
                        end
1649 14 robfinch
                `LH:
1650 13 robfinch
                        begin
1651
                                cyc_o <= 1'b0;
1652
                                stb_o <= 1'b0;
1653 14 robfinch
                                sel_o <= 8'h00;
1654
                                m3Data <= sel_o[7] ? {{32{dat_i[63]}},dat_i[63:32]}:{{32{dat_i[31]}},dat_i[31: 0]};
1655
                                m3Opcode <= `NOPI;
1656 13 robfinch
                        end
1657
                `LW,`LWR:
1658
                        begin
1659 14 robfinch
                                cyc_o <= 1'b0;
1660
                                stb_o <= 1'b0;
1661
                                sel_o <= 8'h00;
1662
                                m3Data <= dat_i;
1663
                                m3Opcode <= `NOPI;
1664 13 robfinch
                        end
1665
                `LHU:
1666
                        begin
1667 14 robfinch
                                cyc_o <= 1'b0;
1668
                                stb_o <= 1'b0;
1669
                                sel_o <= 8'h00;
1670
                                m3Data <= sel_o[7] ? dat_i[63:32] : dat_i[31: 0];
1671
                                m3Opcode <= `NOPI;
1672 13 robfinch
                        end
1673
                `LC:
1674
                        begin
1675 14 robfinch
                                cyc_o <= 1'b0;
1676
                                stb_o <= 1'b0;
1677
                                sel_o <= 8'h00;
1678
                                case(sel_o)
1679
                                8'b00000011:    m3Data <= {{48{dat_i[15]}},dat_i[15: 0]};
1680
                                8'b00001100:    m3Data <= {{48{dat_i[31]}},dat_i[31:16]};
1681
                                8'b00110000:    m3Data <= {{48{dat_i[47]}},dat_i[47:32]};
1682
                                8'b11000000:    m3Data <= {{48{dat_i[63]}},dat_i[63:48]};
1683
                                default:        m3Data <= 64'hDEADDEADDEADDEAD;
1684
                                endcase
1685
                                m3Opcode <= `NOPI;
1686 13 robfinch
                        end
1687
                `LCU:
1688
                        begin
1689 14 robfinch
                                cyc_o <= 1'b0;
1690
                                stb_o <= 1'b0;
1691
                                sel_o <= 8'h00;
1692
                                case(sel_o)
1693
                                8'b00000011:    m3Data <= dat_i[15: 0];
1694
                                8'b00001100:    m3Data <= dat_i[31:16];
1695
                                8'b00110000:    m3Data <= dat_i[47:32];
1696
                                8'b11000000:    m3Data <= dat_i[63:48];
1697
                                default:        m3Data <= 64'hDEADDEADDEADDEAD;
1698
                                endcase
1699
                                m3Opcode <= `NOPI;
1700 13 robfinch
                        end
1701
                `LB:
1702
                        begin
1703 14 robfinch
                                cyc_o <= 1'b0;
1704
                                stb_o <= 1'b0;
1705
                                sel_o <= 8'h00;
1706
                                case(sel_o)
1707
                                8'b00000001:    m3Data <= {{56{dat_i[ 7]}},dat_i[ 7: 0]};
1708
                                8'b00000010:    m3Data <= {{56{dat_i[15]}},dat_i[15: 8]};
1709
                                8'b00000100:    m3Data <= {{56{dat_i[23]}},dat_i[23:16]};
1710
                                8'b00001000:    m3Data <= {{56{dat_i[31]}},dat_i[31:24]};
1711
                                8'b00010000:    m3Data <= {{56{dat_i[39]}},dat_i[39:32]};
1712
                                8'b00100000:    m3Data <= {{56{dat_i[47]}},dat_i[47:40]};
1713
                                8'b01000000:    m3Data <= {{56{dat_i[55]}},dat_i[55:48]};
1714
                                8'b10000000:    m3Data <= {{56{dat_i[63]}},dat_i[63:56]};
1715
                                default:        m3Data <= 64'hDEADDEADDEADDEAD;
1716
                                endcase
1717
                                m3Opcode = `NOPI;
1718 13 robfinch
                        end
1719
                `LBU:
1720
                        begin
1721 14 robfinch
                                cyc_o <= 1'b0;
1722
                                stb_o <= 1'b0;
1723
                                sel_o <= 8'h00;
1724
                                case(sel_o)
1725
                                8'b00000001:    m3Data <= dat_i[ 7: 0];
1726
                                8'b00000010:    m3Data <= dat_i[15: 8];
1727
                                8'b00000100:    m3Data <= dat_i[23:16];
1728
                                8'b00001000:    m3Data <= dat_i[31:24];
1729
                                8'b00010000:    m3Data <= dat_i[39:32];
1730
                                8'b00100000:    m3Data <= dat_i[47:40];
1731
                                8'b01000000:    m3Data <= dat_i[55:48];
1732
                                8'b10000000:    m3Data <= dat_i[63:56];
1733
                                default:        m3Data <= 64'hDEADDEADDEADDEAD;
1734
                                endcase
1735
                                m3Opcode <= `NOPI;
1736 13 robfinch
                        end
1737
                default:        ;
1738
                endcase
1739
        end
1740
end
1741
 
1742
wrhit <= 1'b0;
1743
//---------------------------------------------------------
1744
// MEMORY:
1745 14 robfinch
// - I/O instructions are finished
1746
// - store instructions are started
1747
// - missed loads are started
1748 13 robfinch
// On a data cache hit for a load, the load is essentially
1749 14 robfinch
// finished in this stage. We switch the opcode to 'NOPI'
1750 13 robfinch
// to cause the pipeline to advance as if a NOPs were
1751
// present.
1752
//---------------------------------------------------------
1753
if (advanceM1) begin
1754
        m2Opcode <= m1Opcode;
1755
        m2Func <= m1Func;
1756
        m2Addr <= pea;
1757
        m2Data <= m1Data;
1758 14 robfinch
        m2hwxtype <= m1hwxtype;
1759 13 robfinch
        m2extype <= m1extype;
1760
        m2Rt <= m1Rt;
1761
        m2pc <= m1pc;
1762 16 robfinch
        m2pcv <= m1pcv;
1763 13 robfinch
        m2clkoff <= m1clkoff;
1764
        m2Fip <= m1Fip;
1765
 
1766
        m1Rt <= 9'd0;
1767
        m1Opcode <= `NOPI;
1768
        m1Func <= 7'd0;
1769
        m1Data <= 64'd0;
1770
        m1clkoff <= 1'b0;
1771
        m1pc <= 64'd0;
1772
        m1IsCacheElement <= 1'b0;
1773
        m1extype <= `EX_NON;
1774
 
1775
        if (m1extype == `EX_NON) begin
1776
                case(m1Opcode)
1777
                `MISC:
1778
                        case(m1Func)
1779 14 robfinch
                        `TLBP:
1780
                                begin
1781
                                        Index[63] <= ~|DMatch;
1782
                                end
1783 13 robfinch
                        `TLBR:
1784
                                begin
1785
                                        TLBPageMask <= ITLBPageMask[i];
1786
                                        TLBVirtPage <= ITLBVirtPage[i];
1787 14 robfinch
                                        TLBPhysPage0 <= ITLBPhysPage0[i];
1788
                                        TLBPhysPage1 <= ITLBPhysPage1[i];
1789 13 robfinch
                                        TLBASID <= ITLBASID[i];
1790
                                        TLBG <= ITLBG[i];
1791 14 robfinch
                                        TLBD <= ITLBD[i];
1792
                                        TLBValid <= ITLBValid[i];
1793 13 robfinch
                                end
1794
                        `TLBWI,`TLBWR:
1795
                                begin
1796 14 robfinch
                                        ITLBValid[i] <= TLBValid;
1797 13 robfinch
                                        ITLBVirtPage[i] <= TLBVirtPage;
1798 14 robfinch
                                        ITLBPhysPage0[i] <= TLBPhysPage0;
1799
                                        ITLBPhysPage1[i] <= TLBPhysPage1;
1800 13 robfinch
                                        ITLBPageMask[i] <= TLBPageMask;
1801
                                        ITLBASID[i] <= TLBASID;
1802 14 robfinch
                                        ITLBD[i] <= TLBD;
1803
                                        ITLBG[i] <= TLBG;
1804 13 robfinch
                                end
1805
                        endcase
1806
                `INW:
1807
                        begin
1808 14 robfinch
                                cyc_o <= 1'b0;
1809 13 robfinch
                                stb_o <= 1'b0;
1810 14 robfinch
                                sel_o <= 8'h00;
1811
                                m2Data <= dat_i;
1812
                                m2Opcode <= `NOPI;
1813 13 robfinch
                        end
1814
                `INH:
1815
                        begin
1816
                                cyc_o <= 1'b0;
1817
                                stb_o <= 1'b0;
1818 14 robfinch
                                sel_o <= 8'h00;
1819
                                m2Data <= sel_o[7] ? {{32{dat_i[63]}},dat_i[63:32]}:{{32{dat_i[31]}},dat_i[31: 0]};
1820
                                m2Opcode <= `NOPI;
1821 13 robfinch
                        end
1822 14 robfinch
                `INHU:
1823
                        begin
1824
                                cyc_o <= 1'b0;
1825
                                stb_o <= 1'b0;
1826
                                sel_o <= 8'h00;
1827
                                m2Data <= sel_o[7] ? dat_i[63:32] : dat_i[31: 0];
1828
                                m2Opcode <= `NOPI;
1829
                        end
1830 13 robfinch
                `INCH:
1831
                        begin
1832
                                cyc_o <= 1'b0;
1833
                                stb_o <= 1'b0;
1834 14 robfinch
                                sel_o <= 8'h00;
1835 13 robfinch
                                case(sel_o)
1836 14 robfinch
                                8'b00000011:    m2Data <= {{48{dat_i[15]}},dat_i[15: 0]};
1837
                                8'b00001100:    m2Data <= {{48{dat_i[31]}},dat_i[31:16]};
1838
                                8'b00110000:    m2Data <= {{48{dat_i[47]}},dat_i[47:32]};
1839
                                8'b11000000:    m2Data <= {{48{dat_i[63]}},dat_i[63:48]};
1840 13 robfinch
                                default:        m2Data <= 64'hDEADDEADDEADDEAD;
1841
                                endcase
1842 14 robfinch
                                m2Opcode <= `NOPI;
1843 13 robfinch
                        end
1844 14 robfinch
                `INCU:
1845
                        begin
1846
                                cyc_o <= 1'b0;
1847
                                stb_o <= 1'b0;
1848
                                sel_o <= 8'h00;
1849
                                case(sel_o)
1850
                                8'b00000011:    m2Data <= dat_i[15: 0];
1851
                                8'b00001100:    m2Data <= dat_i[31:16];
1852
                                8'b00110000:    m2Data <= dat_i[47:32];
1853
                                8'b11000000:    m2Data <= dat_i[63:48];
1854
                                default:        m2Data <= 64'hDEADDEADDEADDEAD;
1855
                                endcase
1856
                                m2Opcode <= `NOPI;
1857
                        end
1858 13 robfinch
                `INB:
1859
                        begin
1860
                                cyc_o <= 1'b0;
1861
                                stb_o <= 1'b0;
1862 14 robfinch
                                sel_o <= 8'h00;
1863 13 robfinch
                                case(sel_o)
1864 14 robfinch
                                8'b00000001:    m2Data <= {{56{dat_i[ 7]}},dat_i[ 7: 0]};
1865
                                8'b00000010:    m2Data <= {{56{dat_i[15]}},dat_i[15: 8]};
1866
                                8'b00000100:    m2Data <= {{56{dat_i[23]}},dat_i[23:16]};
1867
                                8'b00001000:    m2Data <= {{56{dat_i[31]}},dat_i[31:24]};
1868
                                8'b00010000:    m2Data <= {{56{dat_i[39]}},dat_i[39:32]};
1869
                                8'b00100000:    m2Data <= {{56{dat_i[47]}},dat_i[47:40]};
1870
                                8'b01000000:    m2Data <= {{56{dat_i[55]}},dat_i[55:48]};
1871
                                8'b10000000:    m2Data <= {{56{dat_i[63]}},dat_i[63:56]};
1872 13 robfinch
                                default:        m2Data <= 64'hDEADDEADDEADDEAD;
1873
                                endcase
1874 14 robfinch
                                m2Opcode <= `NOPI;
1875 13 robfinch
                        end
1876 14 robfinch
                `INBU:
1877 13 robfinch
                        begin
1878 14 robfinch
                                cyc_o <= 1'b0;
1879 13 robfinch
                                stb_o <= 1'b0;
1880 14 robfinch
                                sel_o <= 8'h00;
1881
                                case(sel_o)
1882
                                8'b00000001:    m2Data <= dat_i[ 7: 0];
1883
                                8'b00000010:    m2Data <= dat_i[15: 8];
1884
                                8'b00000100:    m2Data <= dat_i[23:16];
1885
                                8'b00001000:    m2Data <= dat_i[31:24];
1886
                                8'b00010000:    m2Data <= dat_i[39:32];
1887
                                8'b00100000:    m2Data <= dat_i[47:40];
1888
                                8'b01000000:    m2Data <= dat_i[55:48];
1889
                                8'b10000000:    m2Data <= dat_i[63:56];
1890
                                default:        m2Data <= 64'hDEADDEADDEADDEAD;
1891
                                endcase
1892
                                m2Opcode <= `NOPI;
1893 13 robfinch
                        end
1894 14 robfinch
                `OUTW,`OUTH,`OUTC,`OUTB:
1895 13 robfinch
                        begin
1896
                                cyc_o <= 1'b0;
1897
                                stb_o <= 1'b0;
1898
                                we_o <= 1'b0;
1899 14 robfinch
                                sel_o <= 8'h00;
1900
                                m2Opcode <= `NOPI;
1901 13 robfinch
                        end
1902 14 robfinch
 
1903 13 robfinch
                `LW:
1904
                        if (!m1IsCacheElement) begin
1905 14 robfinch
                                cyc_o <= 1'b1;
1906
                                stb_o <= 1'b1;
1907
                                sel_o <= 8'hFF;
1908
                                adr_o <= {pea[63:3],3'b000};
1909
                                m2Addr <= {pea[63:3],3'b000};
1910 13 robfinch
                        end
1911
                        else if (dhit) begin
1912 14 robfinch
                                m2Opcode <= `NOPI;
1913 13 robfinch
                                m2Data <= cdat;
1914
                        end
1915 14 robfinch
 
1916 13 robfinch
                `LWR:
1917
                        if (!m1IsCacheElement) begin
1918
                                rsv_o <= 1'b1;
1919
                                resv_address <= pea[63:5];
1920 14 robfinch
                                cyc_o <= 1'b1;
1921
                                stb_o <= 1'b1;
1922
                                sel_o <= 8'hFF;
1923
                                adr_o <= {pea[63:3],3'b000};
1924
                                m2Addr <= {pea[63:3],3'b000};
1925 13 robfinch
                        end
1926
                        else if (dhit) begin
1927 14 robfinch
                                m2Opcode <= `NOPI;
1928 13 robfinch
                                m2Data <= cdat;
1929
                                rsv_o <= 1'b1;
1930
                                resv_address <= pea[63:5];
1931
                        end
1932 14 robfinch
 
1933 13 robfinch
                `LH:
1934
                        if (!m1IsCacheElement) begin
1935 14 robfinch
                                cyc_o <= 1'b1;
1936
                                stb_o <= 1'b1;
1937
                                sel_o <= pea[2] ? 8'b11110000 : 8'b00001111;
1938
                                adr_o <= {pea[63:2],2'b00};
1939
                                m2Addr <= {pea[63:2],2'b00};
1940 13 robfinch
                        end
1941
                        else if (dhit) begin
1942 14 robfinch
                                m2Opcode <= `NOPI;
1943 13 robfinch
                                if (pea[1])
1944
                                        m2Data <= {{32{cdat[31]}},cdat[31:0]};
1945
                                else
1946
                                        m2Data <= {{32{cdat[63]}},cdat[63:32]};
1947
                        end
1948 14 robfinch
 
1949 13 robfinch
                `LHU:
1950
                        if (!m1IsCacheElement) begin
1951 14 robfinch
                                cyc_o <= 1'b1;
1952
                                stb_o <= 1'b1;
1953
                                sel_o <= pea[2] ? 8'b11110000 : 8'b00001111;
1954
                                adr_o <= {pea[63:2],2'b00};
1955
                                m2Addr <= {pea[63:2],2'b00};
1956 13 robfinch
                        end
1957
                        else if (dhit) begin
1958 14 robfinch
                                m2Opcode <= `NOPI;
1959 13 robfinch
                                if (pea[1])
1960
                                        m2Data <= {32'd0,cdat};
1961
                                else
1962
                                        m2Data <= {32'd0,cdat[63:32]};
1963
                        end
1964 14 robfinch
 
1965 13 robfinch
                `LC:
1966
                        if (!m1IsCacheElement) begin
1967 14 robfinch
                                cyc_o <= 1'b1;
1968
                                stb_o <= 1'b1;
1969
                                case(pea[2:1])
1970
                                2'b00:  sel_o <= 8'b00000011;
1971
                                2'b01:  sel_o <= 8'b00001100;
1972
                                2'b10:  sel_o <= 8'b00110000;
1973
                                2'b11:  sel_o <= 8'b11000000;
1974
                                endcase
1975
                                adr_o <= {pea[63:1],1'b0};
1976
                                m2Addr <= {pea[63:1],1'b0};
1977 13 robfinch
                        end
1978
                        else if (dhit) begin
1979 14 robfinch
                                m2Opcode <= `NOPI;
1980 13 robfinch
                                case(pea[2:1])
1981
                                2'd0:   m2Data <= {{48{cdat[15]}},cdat[15:0]};
1982
                                2'd1:   m2Data <= {{48{cdat[31]}},cdat[31:16]};
1983
                                2'd2:   m2Data <= {{48{cdat[47]}},cdat[47:32]};
1984
                                2'd3:   m2Data <= {{48{cdat[63]}},cdat[63:48]};
1985
                                endcase
1986
                        end
1987 14 robfinch
 
1988 13 robfinch
                `LCU:
1989
                        if (!m1IsCacheElement) begin
1990 14 robfinch
                                cyc_o <= 1'b1;
1991
                                stb_o <= 1'b1;
1992
                                case(pea[2:1])
1993
                                2'b00:  sel_o <= 8'b00000011;
1994
                                2'b01:  sel_o <= 8'b00001100;
1995
                                2'b10:  sel_o <= 8'b00110000;
1996
                                2'b11:  sel_o <= 8'b11000000;
1997
                                endcase
1998
                                adr_o <= {pea[63:1],1'b0};
1999
                                m2Addr <= {pea[63:1],1'b0};
2000 13 robfinch
                        end
2001
                        else if (dhit) begin
2002 14 robfinch
                                m2Opcode <= `NOPI;
2003 13 robfinch
                                case(pea[2:1])
2004
                                2'd0:   m2Data <= {48'd0,cdat[15: 0]};
2005
                                2'd1:   m2Data <= {48'd0,cdat[31:16]};
2006
                                2'd2:   m2Data <= {48'd0,cdat[47:32]};
2007
                                2'd3:   m2Data <= {48'd0,cdat[63:48]};
2008
                                endcase
2009
                        end
2010 14 robfinch
 
2011 13 robfinch
                `LB:
2012
                        if (!m1IsCacheElement) begin
2013 14 robfinch
                                $display("Load byte:");
2014
                                cyc_o <= 1'b1;
2015
                                stb_o <= 1'b1;
2016
                                case(pea[2:0])
2017
                                3'b000: sel_o <= 8'b00000001;
2018
                                3'b001: sel_o <= 8'b00000010;
2019
                                3'b010: sel_o <= 8'b00000100;
2020
                                3'b011: sel_o <= 8'b00001000;
2021
                                3'b100: sel_o <= 8'b00010000;
2022
                                3'b101: sel_o <= 8'b00100000;
2023
                                3'b110: sel_o <= 8'b01000000;
2024
                                3'b111: sel_o <= 8'b10000000;
2025
                                endcase
2026
                                adr_o <= pea;
2027
                                m2Addr <= pea;
2028 13 robfinch
                        end
2029
                        else if (dhit) begin
2030 14 robfinch
                                m2Opcode <= `NOPI;
2031 13 robfinch
                                case(pea[2:0])
2032
                                3'b000: m2Data <= {{56{cdat[ 7]}},cdat[ 7: 0]};
2033
                                3'b001: m2Data <= {{56{cdat[15]}},cdat[15: 8]};
2034
                                3'b010: m2Data <= {{56{cdat[23]}},cdat[23:16]};
2035
                                3'b011: m2Data <= {{56{cdat[31]}},cdat[31:24]};
2036
                                3'b100: m2Data <= {{56{cdat[39]}},cdat[39:32]};
2037
                                3'b101: m2Data <= {{56{cdat[47]}},cdat[47:40]};
2038
                                3'b110: m2Data <= {{56{cdat[55]}},cdat[55:48]};
2039
                                3'b111: m2Data <= {{56{cdat[63]}},cdat[63:56]};
2040
                                endcase
2041
                        end
2042 14 robfinch
 
2043 13 robfinch
                `LBU:
2044
                        if (!m1IsCacheElement) begin
2045 14 robfinch
                                cyc_o <= 1'b1;
2046
                                stb_o <= 1'b1;
2047
                                case(pea[2:0])
2048
                                3'b000: sel_o <= 8'b00000001;
2049
                                3'b001: sel_o <= 8'b00000010;
2050
                                3'b010: sel_o <= 8'b00000100;
2051
                                3'b011: sel_o <= 8'b00001000;
2052
                                3'b100: sel_o <= 8'b00010000;
2053
                                3'b101: sel_o <= 8'b00100000;
2054
                                3'b110: sel_o <= 8'b01000000;
2055
                                3'b111: sel_o <= 8'b10000000;
2056
                                endcase
2057
                                adr_o <= pea;
2058
                                m2Addr <= pea;
2059 13 robfinch
                        end
2060
                        else if (dhit) begin
2061 14 robfinch
                                m2Opcode <= `NOPI;
2062 13 robfinch
                                case(pea[2:0])
2063
                                3'b000: m2Data <= {56'd0,cdat[ 7: 0]};
2064
                                3'b001: m2Data <= {56'd0,cdat[15: 8]};
2065
                                3'b010: m2Data <= {56'd0,cdat[23:16]};
2066
                                3'b011: m2Data <= {56'd0,cdat[31:23]};
2067
                                3'b100: m2Data <= {56'd0,cdat[39:32]};
2068
                                3'b101: m2Data <= {56'd0,cdat[47:40]};
2069
                                3'b110: m2Data <= {56'd0,cdat[55:48]};
2070
                                3'b111: m2Data <= {56'd0,cdat[63:56]};
2071
                                endcase
2072
                        end
2073 14 robfinch
 
2074
                `SW:
2075 13 robfinch
                        begin
2076 14 robfinch
                                m2Addr <= {pea[63:3],3'b000};
2077 13 robfinch
                                wrhit <= dhit;
2078 14 robfinch
                                if (!m1UnmappedDataArea & !q[4])
2079
                                        ITLBD[q] <= 1'b1;
2080 13 robfinch
                                if (resv_address==pea[63:5])
2081
                                        resv_address <= 59'd0;
2082 14 robfinch
                                cyc_o <= 1'b1;
2083
                                stb_o <= 1'b1;
2084
                                we_o <= 1'b1;
2085
                                sel_o <= 8'hFF;
2086
                                adr_o <= {pea[63:3],3'b000};
2087
                                dat_o <= m1b;
2088 13 robfinch
                        end
2089 14 robfinch
 
2090
                `SH:
2091
                        begin
2092
                                wrhit <= dhit;
2093
                                m2Addr <= {pea[63:2],2'b00};
2094
                                if (!m1UnmappedDataArea & !q[4])
2095
                                        ITLBD[q] <= 1'b1;
2096
                                if (resv_address==pea[63:5])
2097
                                        resv_address <= 59'd0;
2098
                                cyc_o <= 1'b1;
2099
                                stb_o <= 1'b1;
2100
                                we_o <= 1'b1;
2101
                                sel_o <= pea[2] ? 8'b11110000 : 8'b00001111;
2102
                                adr_o <= {pea[63:2],2'b00};
2103
                                dat_o <= {2{m1b[31:0]}};
2104
                        end
2105
 
2106 13 robfinch
                `SC:
2107
                        begin
2108
                                $display("Storing char to %h, ea=%h",pea,ea);
2109
                                wrhit <= dhit;
2110
                                m2Addr <= {pea[63:2],2'b00};
2111 14 robfinch
                                if (!m1UnmappedDataArea & !q[4])
2112
                                        ITLBD[q] <= 1'b1;
2113 13 robfinch
                                if (resv_address==pea[63:5])
2114
                                        resv_address <= 59'd0;
2115 14 robfinch
                                cyc_o <= 1'b1;
2116
                                stb_o <= 1'b1;
2117
                                we_o <= 1'b1;
2118
                                case(pea[2:1])
2119
                                2'b00:  sel_o <= 8'b00000011;
2120
                                2'b01:  sel_o <= 8'b00001100;
2121
                                2'b10:  sel_o <= 8'b00110000;
2122
                                2'b11:  sel_o <= 8'b11000000;
2123
                                endcase
2124
                                adr_o <= {pea[63:1],1'b0};
2125
                                dat_o <= {4{m1b[15:0]}};
2126 13 robfinch
                        end
2127 14 robfinch
 
2128 13 robfinch
                `SB:
2129
                        begin
2130
                                wrhit <= dhit;
2131
                                m2Addr <= {pea[63:2],2'b00};
2132
                                if (resv_address==pea[63:5])
2133
                                        resv_address <= 59'd0;
2134 14 robfinch
                                if (!m1UnmappedDataArea & !q[4])
2135
                                        ITLBD[q] <= 1'b1;
2136
                                cyc_o <= 1'b1;
2137
                                stb_o <= 1'b1;
2138
                                we_o <= 1'b1;
2139
                                case(pea[2:0])
2140
                                3'b000: sel_o <= 8'b00000001;
2141
                                3'b001: sel_o <= 8'b00000010;
2142
                                3'b010: sel_o <= 8'b00000100;
2143
                                3'b011: sel_o <= 8'b00001000;
2144
                                3'b100: sel_o <= 8'b00010000;
2145
                                3'b101: sel_o <= 8'b00100000;
2146
                                3'b110: sel_o <= 8'b01000000;
2147
                                3'b111: sel_o <= 8'b10000000;
2148
                                endcase
2149
                                adr_o <= {pea[63:2],2'b00};
2150
                                dat_o <= {8{m1b[7:0]}};
2151 13 robfinch
                        end
2152 14 robfinch
 
2153 13 robfinch
                `SWC:
2154
                        begin
2155
                                rsf <= 1'b0;
2156
                                if (resv_address==pea[63:5]) begin
2157 14 robfinch
                                        if (!m1UnmappedDataArea & !q[4])
2158
                                                ITLBD[q] <= 1'b1;
2159 13 robfinch
                                        wrhit <= dhit;
2160 14 robfinch
                                        m2Addr <= {pea[63:3],3'b00};
2161
                                        cyc_o <= 1'b1;
2162
                                        stb_o <= 1'b1;
2163
                                        we_o <= 1'b1;
2164
                                        sel_o <= 8'hFF;
2165
                                        adr_o <= {pea[63:3],3'b000};
2166
                                        dat_o <= m1b;
2167 13 robfinch
                                        resv_address <= 59'd0;
2168
                                        rsf <= 1'b1;
2169
                                end
2170
                                else
2171
                                        m2Opcode <= `NOPI;
2172
                        end
2173
                endcase
2174
        end
2175
end
2176
 
2177
//---------------------------------------------------------
2178
// EXECUTE:
2179
// - perform datapath operation
2180 14 robfinch
// - perform virtual to physical address translation.
2181 13 robfinch
//---------------------------------------------------------
2182
if (advanceX) begin
2183 14 robfinch
        m1hwxtype <= xhwxtype;
2184 13 robfinch
        m1Fip <= xFip;
2185
        m1extype <= xextype;
2186
        m1Opcode <= xOpcode;
2187
        m1Func <= xFunc;
2188
        m1Rt <= xRt;
2189
        m1Data <= xData;
2190
        m1IsCacheElement <= xisCacheElement;
2191
        if (xOpcode==`MOVZ && !aeqz) begin
2192
                m1Rt <= 9'd0;
2193
                m1Data <= 64'd0;
2194
        end
2195
        if (xOpcode==`MOVNZ && aeqz) begin
2196
                m1Rt <= 9'd0;
2197
                m1Data <= 64'd0;
2198
        end
2199
        m1pc <= xpc;
2200 16 robfinch
        m1pcv <= xpcv;
2201 13 robfinch
        xRt <= 9'd0;
2202
        a <= 64'd0;
2203
        b <= 64'd0;
2204
        imm <= 64'd0;
2205
        xextype <= `EX_NON;
2206
        if (xOpcode[6:4]!=`IMM) begin
2207
                xIR <= `NOP_INSN;
2208
        end
2209
//      xpc <= 64'd0;
2210
        case(xOpcode)
2211
        `MISC:
2212
                case(xFunc)
2213
                `WAIT:  m1clkoff <= 1'b1;
2214 14 robfinch
                `TLBP:  ea <= TLBVirtPage;
2215 13 robfinch
                `TLBR,`TLBWI:
2216
                        begin
2217
                                i <= Index;
2218
                        end
2219
                `TLBWR:
2220
                        begin
2221
                                i <= Random;
2222
                        end
2223
                default:        ;
2224
                endcase
2225
        `R:
2226
                case(xFunc)
2227
                `MTSPR:
2228
                        case(xIR[12:7])
2229
                        `Wired:                 Wired <= xData[3:0];
2230
                        `ASID:                  ASID <= xData[7:0];
2231
                        `TLBIndex:              Index <= xData[3:0];
2232
                        `TLBVirtPage:   TLBVirtPage <= xData[63:13];
2233 14 robfinch
                        `TLBPhysPage0:  TLBPhysPage0 <= xData[63:13];
2234
                        `TLBPhysPage1:  TLBPhysPage1 <= xData[63:13];
2235 13 robfinch
                        `TLBPageMask:   TLBPageMask <= xData[24:13];
2236 14 robfinch
                        `TLBASID:               begin
2237
                                                        TLBValid <= xData[0];
2238
                                                        TLBD <= xData[1];
2239
                                                        TLBG <= xData[2];
2240
                                                        TLBASID <= xData[15:8];
2241
                                                        end
2242 13 robfinch
                        `PageTableAddr: PageTableAddr <= xData[63:13];
2243
                        `BadVAddr:              BadVAddr <= xData[63:13];
2244
                        `EPC:                   EPC <= xData;
2245
                        `TBA:                   TBA <= xData;
2246 14 robfinch
                        `AXC:                   AXC <= xData[3:0];
2247 13 robfinch
                        default:        ;
2248
                        endcase
2249
                `MTTBA: tba <= {xData[63:2],2'b00};
2250
                `OMG:   mutex_gate[a[5:0]] <= 1'b1;
2251
                `CMG:   mutex_gate[a[5:0]] <= 1'b0;
2252
                `OMGI:  mutex_gate[xIR[12:7]] <= 1'b1;
2253
                `CMGI:  mutex_gate[xIR[12:7]] <= 1'b0;
2254
                default:        ;
2255
                endcase
2256
        `CALL:  m1Data <= fnIncPC(xpc);
2257
        `INW:
2258
                        begin
2259
                        cyc_o <= 1'b1;
2260
                        stb_o <= 1'b1;
2261 14 robfinch
                        sel_o <= 8'hFF;
2262 13 robfinch
                        adr_o <= {xData[63:3],3'b000};
2263
                        end
2264 14 robfinch
        `INH,`INHU:
2265 13 robfinch
                        begin
2266
                        cyc_o <= 1'b1;
2267
                        stb_o <= 1'b1;
2268 14 robfinch
                        sel_o <= xData[2] ? 8'b11110000 : 8'b00001111;
2269 13 robfinch
                        adr_o <= {xData[63:2],2'b00};
2270
                        end
2271 14 robfinch
        `INCH,`INCU:
2272 13 robfinch
                        begin
2273
                        cyc_o <= 1'b1;
2274
                        stb_o <= 1'b1;
2275 14 robfinch
                        case(xData[2:1])
2276
                        2'b00:  sel_o <= 8'b00000011;
2277
                        2'b01:  sel_o <= 8'b00001100;
2278
                        2'b10:  sel_o <= 8'b00110000;
2279
                        2'b11:  sel_o <= 8'b11000000;
2280 13 robfinch
                        endcase
2281
                        adr_o <= {xData[63:1],1'b0};
2282
                        end
2283 14 robfinch
        `INB,`INBU:
2284 13 robfinch
                        begin
2285
                        cyc_o <= 1'b1;
2286
                        stb_o <= 1'b1;
2287 14 robfinch
                        case(xData[2:0])
2288
                        3'b000: sel_o <= 8'b00000001;
2289
                        3'b001: sel_o <= 8'b00000010;
2290
                        3'b010: sel_o <= 8'b00000100;
2291
                        3'b011: sel_o <= 8'b00001000;
2292
                        3'b100: sel_o <= 8'b00010000;
2293
                        3'b101: sel_o <= 8'b00100000;
2294
                        3'b110: sel_o <= 8'b01000000;
2295
                        3'b111: sel_o <= 8'b10000000;
2296 13 robfinch
                        endcase
2297
                        adr_o <= xData;
2298
                        end
2299
        `OUTW:
2300
                        begin
2301
                        cyc_o <= 1'b1;
2302
                        stb_o <= 1'b1;
2303
                        we_o <= 1'b1;
2304 14 robfinch
                        sel_o <= 8'hFF;
2305 13 robfinch
                        adr_o <= {xData[63:3],3'b000};
2306 14 robfinch
                        dat_o <= b;
2307 13 robfinch
                        end
2308
        `OUTH:
2309
                        begin
2310
                        cyc_o <= 1'b1;
2311
                        stb_o <= 1'b1;
2312
                        we_o <= 1'b1;
2313 14 robfinch
                        sel_o <= xData[2] ? 8'b11110000 : 8'b00001111;
2314 13 robfinch
                        adr_o <= {xData[63:2],2'b00};
2315 14 robfinch
                        dat_o <= {2{b[31:0]}};
2316 13 robfinch
                        end
2317
        `OUTC:
2318
                        begin
2319
                        cyc_o <= 1'b1;
2320
                        stb_o <= 1'b1;
2321
                        we_o <= 1'b1;
2322 14 robfinch
                        case(xData[2:1])
2323
                        2'b00:  sel_o <= 8'b00000011;
2324
                        2'b01:  sel_o <= 8'b00001100;
2325
                        2'b10:  sel_o <= 8'b00110000;
2326
                        2'b11:  sel_o <= 8'b11000000;
2327 13 robfinch
                        endcase
2328
                        adr_o <= {xData[63:1],1'b0};
2329 14 robfinch
                        dat_o <= {4{b[15:0]}};
2330 13 robfinch
                        end
2331
        `OUTB:
2332
                        begin
2333
                        cyc_o <= 1'b1;
2334
                        stb_o <= 1'b1;
2335
                        we_o <= 1'b1;
2336 14 robfinch
                        case(xData[2:0])
2337
                        3'b000: sel_o <= 8'b00000001;
2338
                        3'b001: sel_o <= 8'b00000010;
2339
                        3'b010: sel_o <= 8'b00000100;
2340
                        3'b011: sel_o <= 8'b00001000;
2341
                        3'b100: sel_o <= 8'b00010000;
2342
                        3'b101: sel_o <= 8'b00100000;
2343
                        3'b110: sel_o <= 8'b01000000;
2344
                        3'b111: sel_o <= 8'b10000000;
2345 13 robfinch
                        endcase
2346
                        adr_o <= xData;
2347 14 robfinch
                        dat_o <= {8{b[7:0]}};
2348 13 robfinch
                        end
2349
        `LB,`LBU,`LC,`LCU,`LH,`LHU,`LW,`LWR,`SW,`SH,`SC,`SB,`SWC:
2350
                        begin
2351
                        m1b <= b;
2352
                        ea <= xData;
2353
                        end
2354
        `MEMNDX:
2355
                        begin
2356
                        m1Opcode <= xFunc;
2357
                        m1b <= c;
2358
                        ea <= xData;
2359
                        end
2360
        `DIVSI,`DIVUI:
2361
                if (b==64'd0) begin
2362
                        xextype <= `EX_DBZ;
2363
                end
2364
        default:        ;
2365
        endcase
2366
        // Update the branch history
2367
        if (isxBranch) begin
2368
                gbl_branch_hist <= {gbl_branch_hist,takb};
2369
                branch_history_table[bht_wa] <= xbits_new;
2370
        end
2371
end
2372
 
2373
//---------------------------------------------------------
2374
// RFETCH:
2375
// Register fetch stage
2376
//---------------------------------------------------------
2377
if (advanceR) begin
2378 14 robfinch
        xAXC <= dAXC;
2379
        xhwxtype <= dhwxtype;
2380 13 robfinch
        xFip <= dFip;
2381
        xextype <= dextype;
2382
        xIR <= dIR;
2383
        xpc <= dpc;
2384 16 robfinch
        xpcv <= dpcv;
2385 13 robfinch
        xbranch_taken <= dbranch_taken;
2386
        dbranch_taken <= 1'b0;
2387
        dextype <= `EX_NON;
2388
        if (dOpcode[6:4]!=`IMM) // IMM is "sticky"
2389
                dIR <= `NOP_INSN;
2390
        dRa <= 9'd0;
2391
        dRb <= 9'd0;
2392
 
2393
        // Result forward muxes
2394
        casex(dRa)
2395
        9'bxxxx00000:   a <= 64'd0;
2396
        xRt:    a <= xData;
2397
        m1Rt:   a <= m1Data;
2398
        m2Rt:   a <= m2Data;
2399
        wRt:    a <= wData;
2400
        tRt:    a <= tData;
2401
        default:        a <= rfoa;
2402
        endcase
2403
        casex(dRb)
2404
        9'bxxxx00000:   b <= 64'd0;
2405
        xRt:    b <= disRightShift ? -xData[5:0] : xData;
2406
        m1Rt:   b <= disRightShift ? -m1Data[5:0] : m1Data;
2407
        m2Rt:   b <= disRightShift ? -m2Data[5:0] : m2Data;
2408
        wRt:    b <= disRightShift ? -wData[5:0] : wData;
2409
        tRt:    b <= disRightShift ? -tData[5:0] : tData;
2410
        default:        b <= disRightShift ? -rfob[5:0] : rfob;
2411
        endcase
2412
        if (dOpcode==`SHFTI)
2413
                case(dFunc)
2414
                `RORI:          b <= {58'd0,~dIR[24:19]+6'd1};
2415
                default:        b <= {58'd0,dIR[24:19]};
2416
                endcase
2417
        casex(dRc)
2418
        9'bxxxx00000:   c <= 64'd0;
2419
        xRt:    c <= xData;
2420
        m1Rt:   c <= m1Data;
2421
        m2Rt:   c <= m2Data;
2422
        wRt:    c <= wData;
2423
        tRt:    c <= tData;
2424
        default:        c <= rfoc;
2425
        endcase
2426
 
2427
        // Set the target register
2428 14 robfinch
        casex(dOpcode)
2429
        `SETLO:         xRt <= {dAXC,dIR[36:32]};
2430
        `SETHI:         xRt <= {dAXC,dIR[36:32]};
2431
        `RR:            xRt <= {dAXC,dIR[24:20]};
2432 13 robfinch
        `BTRI:          xRt <= 9'd0;
2433
        `BTRR:          xRt <= 9'd0;
2434
        `TRAPcc:        xRt <= 9'd0;
2435
        `TRAPcci:       xRt <= 9'd0;
2436
        `JMP:           xRt <= 9'd00;
2437 14 robfinch
        `CALL:          xRt <= {dAXC,5'd31};
2438
        `RET:           xRt <= {dAXC,dIR[24:20]};
2439 13 robfinch
        `MEMNDX:
2440
                case(dFunc)
2441
                `SW,`SH,`SC,`SB,`OUTW,`OUTH,`OUTC,`OUTB:
2442
                                xRt <= 9'd0;
2443 14 robfinch
                default:        xRt <= {dAXC,dIR[24:20]};
2444 13 robfinch
                endcase
2445
        `SW,`SH,`SC,`SB,`OUTW,`OUTH,`OUTC,`OUTB:
2446
                                xRt <= 9'd0;
2447
        `NOPI:          xRt <= 9'd0;
2448
        `BEQI,`BNEI,`BLTI,`BLEI,`BGTI,`BGEI,`BLTUI,`BLEUI,`BGTUI,`BGEUI:
2449
                                xRt <= 9'd0;
2450 14 robfinch
        default:        xRt <= {dAXC,dIR[29:25]};
2451 13 robfinch
        endcase
2452
        if (dOpcode[6:4]==`IMM)
2453
                xRt <= 9'd0;
2454
 
2455
        // Set immediate value
2456
        if (xOpcode[6:4]==`IMM) begin
2457
                imm <= {xIR[38:0],dIR[24:0]};
2458
        end
2459
        else
2460
                case(dOpcode)
2461
                `BTRI:  imm <= {{44{dIR[19]}},dIR[19:0]};
2462
                `BEQI,`BNEI,`BLTI,`BLEI,`BGTI,`BGEI,`BLTUI,`BLEUI,`BGTUI,`BGEUI:
2463
                        imm <= {{46{dIR[17]}},dIR[17:0]};
2464
                `ANDI:  imm <= {39'h7FFFFFFFFF,dIR[24:0]};
2465
                `ORI:   imm <= {39'h0000000000,dIR[24:0]};
2466
                `XORI:  imm <= {39'h0000000000,dIR[24:0]};
2467
                `RET:   imm <= {44'h00000000000,dIR[19:0]};
2468
                `MEMNDX:        imm <= {{51{dIR[19]}},dIR[19:7]};
2469
                default:        imm <= {{39{dIR[24]}},dIR[24:0]};
2470
                endcase
2471
        case(dOpcode)
2472
 
2473
        `MISC:
2474
                case(dFunc)
2475
                `SEI:   im <= 1'b1;
2476
                `CLI:   im <= 1'b0;
2477
                endcase
2478
        endcase
2479
 
2480
end
2481
 
2482
//---------------------------------------------------------
2483
// IFETCH:
2484
// - check for external hardware interrupt
2485
// - fetch instruction
2486
// - increment PC
2487
// - set special register defaults for some instructions
2488
//---------------------------------------------------------
2489
if (advanceI) begin
2490 14 robfinch
        dAXC <= AXC;
2491 13 robfinch
        dextype <= `EX_NON;
2492 14 robfinch
        if (nmi_edge & !StatusHWI) begin
2493
                $display("*****************");
2494
                $display("NMI edge detected");
2495
                $display("*****************");
2496
                StatusHWI <= 1'b1;
2497 13 robfinch
                nmi_edge <= 1'b0;
2498 14 robfinch
                dhwxtype <= 2'b01;
2499 13 robfinch
                dIR <= `NOP_INSN;
2500
                dextype <= `EX_NMI;
2501
        end
2502 14 robfinch
        else if (irq_i & !im & !StatusHWI) begin
2503 16 robfinch
                im <= 1'b1;
2504 14 robfinch
                StatusHWI <= 1'b1;
2505
                dhwxtype <= 2'b10;
2506 13 robfinch
                dIR <= `NOP_INSN;
2507
                dextype <= `EX_IRQ;
2508
        end
2509
        // Are we filling the pipeline with NOP's as a result of a previous
2510
        // hardware interrupt ?
2511 14 robfinch
        else if (|dhwxtype|dFip) begin
2512 13 robfinch
                dIR <= `NOP_INSN;
2513
        end
2514 14 robfinch
        else if (ITLBMiss)
2515
                dIR <= `NOP_INSN;
2516 13 robfinch
        else begin
2517
                dIR <= insn;
2518 14 robfinch
`include "insn_dumpsc.v"
2519 13 robfinch
        end
2520
        nopI <= 1'b0;
2521
        if (dOpcode[6:4]!=`IMM) begin
2522
                dpc <= pc;
2523 16 robfinch
                dpcv <= 1'b1;
2524 13 robfinch
        end
2525 14 robfinch
        casex(iOpcode)
2526
        `SETLO:         dRa <= {AXC,insn[36:32]};
2527
        `SETHI:         dRa <= {AXC,insn[36:32]};
2528
        default:        dRa <= {AXC,insn[34:30]};
2529
        endcase
2530
        dRb <= {AXC,insn[29:25]};
2531
        dRc <= {AXC,insn[24:20]};
2532 13 robfinch
        if (ITLBMiss) begin
2533 14 robfinch
                $display("TLB miss on instruction fetch.");
2534 13 robfinch
                CauseCode <= `EX_TLBI;
2535
                StatusEXL <= 1'b1;
2536
                BadVAddr <= pc[63:13];
2537
                pc <= `ITLB_MissHandler;
2538
                EPC <= pc;
2539
        end
2540
        else begin
2541
                dbranch_taken <= 1'b0;
2542
                pc <= fnIncPC(pc);
2543
                case(iOpcode)
2544
                `MISC:
2545
                        case(iFunc)
2546
                        `FIP:   dFip <= 1'b1;
2547
                        default:        ;
2548
                        endcase
2549
                `JMP,`CALL:
2550
                        begin
2551
                                dbranch_taken <= 1'b1;
2552
                                pc <= jmp_tgt;
2553
                        end
2554
                `BTRR:
2555
                        case(insn[4:0])
2556
                        `BEQ,`BNE,`BLT,`BLE,`BGT,`BGE,`BLTU,`BLEU,`BGTU,`BGEU,`BAND,`BOR,`BNR:
2557
                                if (predict_taken) begin
2558
                                        $display("Taking predicted branch: %h",{pc[63:4] + {{42{insn[24]}},insn[24:7]},insn[6:5],2'b00});
2559
                                        dbranch_taken <= 1'b1;
2560
                                        pc <= {pc[63:4] + {{42{insn[24]}},insn[24:7]},insn[6:5],2'b00};
2561
                                end
2562
                        default:        ;
2563
                        endcase
2564
                `BEQI,`BNEI,`BLTI,`BLEI,`BGTI,`BGEI,`BLTUI,`BLEUI,`BGTUI,`BGEUI:
2565
                        begin
2566
                                if (predict_taken) begin
2567
                                        dbranch_taken <= 1'b1;
2568
                                        pc <= {pc[63:4] + {{50{insn[29]}},insn[29:20]},insn[19:18],2'b00};
2569
                                end
2570
                        end
2571
                `TRAPcc:        if (predict_taken) begin pc <= {TBA[63:13],`GEN_TRAP_OFFSET}; dbranch_taken <= 1'b1; end
2572
                `TRAPcci:       if (predict_taken) begin pc <= {TBA[63:13],`GEN_TRAP_OFFSET}; dbranch_taken <= 1'b1; end
2573
                default:        ;
2574
                endcase
2575
        end
2576
end
2577
 
2578
//`include "RPSTAGE.v"
2579
//---------------------------------------------------------
2580
// EXECUTE - part two:
2581
// - override the default program counter increment for
2582
//   control flow instructions
2583
// - NOP out the instructions following a branch in the
2584
//   pipeline
2585
//---------------------------------------------------------
2586
if (advanceX) begin
2587
        case(xOpcode)
2588
        `MISC:
2589
                case(xFunc)
2590 14 robfinch
                `IRET:
2591
                        if (StatusHWI) begin
2592
                                StatusHWI <= 1'b0;
2593 16 robfinch
                                im <= 1'b0;
2594 14 robfinch
                                pc <= IPC;
2595
                                dIR <= `NOP_INSN;
2596
                                xIR <= `NOP_INSN;
2597
                                xRt <= 9'd0;
2598 16 robfinch
                                xpcv <= 1'b0;
2599
                                dpcv <= 1'b0;
2600 14 robfinch
                        end
2601
                `ERET:
2602
                        if (StatusEXL) begin
2603
                                StatusEXL <= 1'b0;
2604
                                pc <= EPC;
2605
                                dIR <= `NOP_INSN;
2606
                                xIR <= `NOP_INSN;
2607
                                xRt <= 9'd0;
2608 16 robfinch
                                xpcv <= 1'b0;
2609
                                dpcv <= 1'b0;
2610 14 robfinch
                        end
2611 13 robfinch
                default:        ;
2612
                endcase
2613
        `BTRR:
2614
                case(xIR[4:0])
2615
        // BEQ r1,r2,label
2616
                `BEQ,`BNE,`BLT,`BLE,`BGT,`BGE,`BLTU,`BLEU,`BGTU,`BGEU,`BAND,`BOR,`BNR:
2617 14 robfinch
                        if (!takb & xbranch_taken) begin
2618
                                $display("Taking mispredicted branch %h",fnIncPC(xpc));
2619
                                pc <= fnIncPC(xpc);
2620
                                dIR <= `NOP_INSN;
2621
                                xIR <= `NOP_INSN;
2622
                                xRt <= 9'd0;
2623 16 robfinch
                                xpcv <= 1'b0;
2624
                                dpcv <= 1'b0;
2625 14 robfinch
                        end
2626
                        else if (takb & !xbranch_taken) begin
2627
                                $display("Taking branch %h.%h",{xpc[63:4] + {{42{xIR[24]}},xIR[24:7]},4'b0000},xIR[6:5]);
2628 13 robfinch
                                pc[63:4] <= xpc[63:4] + {{42{xIR[24]}},xIR[24:7]};
2629
                                pc[3:2] <= xIR[6:5];
2630
                                dIR <= `NOP_INSN;
2631
                                xIR <= `NOP_INSN;
2632
                                xRt <= 9'd0;
2633 16 robfinch
                                xpcv <= 1'b0;
2634
                                dpcv <= 1'b0;
2635 13 robfinch
                        end
2636
        // BEQ r1,r2,r10
2637
                `BEQR,`BNER,`BLTR,`BLER,`BGTR,`BGER,`BLTUR,`BLEUR,`BGTUR,`BGEUR://,`BANDR,`BORR,`BNRR:
2638
                        if (takb) begin
2639
                                pc[63:2] <= c[63:2];
2640
                                pc[1:0] <= 2'b00;
2641
                                dIR <= `NOP_INSN;
2642
                                xIR <= `NOP_INSN;
2643
                                xRt <= 9'd0;
2644 16 robfinch
                                xpcv <= 1'b0;
2645
                                dpcv <= 1'b0;
2646 13 robfinch
                        end
2647
                default:        ;
2648
                endcase
2649
        // JMP and CALL change the program counter immediately in the IF stage.
2650
        // There's no work to do here. The pipeline does not need to be cleared.
2651
        `JMP:   ;
2652
        `CALL:  ;
2653 14 robfinch
        `JAL:
2654
                begin
2655
                        pc[63:2] <= a[63:2] + imm[63:2];
2656
                        dIR <= `NOP_INSN;
2657
                        xIR <= `NOP_INSN;
2658
                        xRt <= 9'd0;
2659 16 robfinch
                        xpcv <= 1'b0;
2660
                        dpcv <= 1'b0;
2661 14 robfinch
                end
2662
        `RET:
2663
                begin
2664
                        $display("returning to: %h", {b,2'b00});
2665
                        pc[63:2] <= b[63:2];
2666
                        dIR <= `NOP_INSN;
2667
                        xIR <= `NOP_INSN;
2668
                        xRt <= 9'd0;
2669 16 robfinch
                        xpcv <= 1'b0;
2670
                        dpcv <= 1'b0;
2671 14 robfinch
                end
2672 13 robfinch
        // BEQ r1,#3,r10
2673
        `BTRI:
2674
                if (takb) begin
2675
                        pc[63:2] <= b[63:2];
2676
                        pc[1:0] <= 2'b00;
2677
                        dIR <= `NOP_INSN;
2678
                        xIR <= `NOP_INSN;
2679
                        xRt <= 9'd0;
2680 16 robfinch
                        xpcv <= 1'b0;
2681
                        dpcv <= 1'b0;
2682 13 robfinch
                end
2683
        // BEQI r1,#3,label
2684
        `BEQI,`BNEI,`BLTI,`BLEI,`BGTI,`BGEI,`BLTUI,`BLEUI,`BGTUI,`BGEUI:
2685
                if (takb) begin
2686
                        if (!xbranch_taken) begin
2687
                                pc[63:4] <= xpc[63:4] + {{50{xIR[29]}},xIR[29:20]};
2688
                                pc[3:2] <= xIR[19:18];
2689
                                dIR <= `NOP_INSN;
2690
                                xIR <= `NOP_INSN;
2691
                                xRt <= 9'd0;
2692 16 robfinch
                                xpcv <= 1'b0;
2693
                                dpcv <= 1'b0;
2694 13 robfinch
                        end
2695
                end
2696 14 robfinch
                else begin
2697
                        if (xbranch_taken) begin
2698
                                $display("Taking mispredicted branch %h",fnIncPC(xpc));
2699
                                pc <= fnIncPC(xpc);
2700
                                dIR <= `NOP_INSN;
2701
                                xIR <= `NOP_INSN;
2702
                                xRt <= 9'd0;
2703 16 robfinch
                                xpcv <= 1'b0;
2704
                                dpcv <= 1'b0;
2705 14 robfinch
                        end
2706
                end
2707
        `TRAPcc,`TRAPcci:
2708 13 robfinch
                if (takb) begin
2709
                        StatusEXL <= 1'b1;
2710
                        CauseCode <= `EX_TRAP;
2711
                        EPC <= xpc;
2712
                        if (!xbranch_taken) begin
2713
                                pc <= {TBA[63:13],`GEN_TRAP_OFFSET};
2714
                                dIR <= `NOP_INSN;
2715
                                xIR <= `NOP_INSN;
2716
                                xRt <= 9'd0;
2717 16 robfinch
                                xpcv <= 1'b0;
2718
                                dpcv <= 1'b0;
2719 13 robfinch
                        end
2720
                end
2721 14 robfinch
                else begin
2722
                        if (xbranch_taken) begin
2723
                                $display("Taking mispredicted branch %h",fnIncPC(xpc));
2724
                                pc <= fnIncPC(xpc);
2725 13 robfinch
                                dIR <= `NOP_INSN;
2726
                                xIR <= `NOP_INSN;
2727
                                xRt <= 9'd0;
2728 16 robfinch
                                xpcv <= 1'b0;
2729
                                dpcv <= 1'b0;
2730 13 robfinch
                        end
2731
                end
2732
        default:        ;
2733
        endcase
2734 14 robfinch
 
2735 13 robfinch
        if (dbz_error) begin
2736
                $display("Divide by zero error");
2737
                CauseCode <= `EX_DBZ;
2738
                StatusEXL <= 1'b1;
2739
                EPC <= xpc;
2740
                pc <= {TBA[63:13],`DBZ_TRAP_OFFSET};
2741
                dIR <= `NOP_INSN;
2742
                xIR <= `NOP_INSN;
2743
                xRt <= 9'd0;
2744 16 robfinch
                xpcv <= 1'b0;
2745
                dpcv <= 1'b0;
2746 13 robfinch
        end
2747 14 robfinch
        else if (ovr_error) begin
2748 13 robfinch
                $display("Overflow error");
2749
                CauseCode <= `EX_OFL;
2750
                StatusEXL <= 1'b1;
2751
                EPC <= xpc;
2752
                pc <= {TBA[63:13],`OFL_TRAP_OFFSET};
2753
                dIR <= `NOP_INSN;
2754
                xIR <= `NOP_INSN;
2755
                xRt <= 9'd0;
2756 16 robfinch
                xpcv <= 1'b0;
2757
                dpcv <= 1'b0;
2758 13 robfinch
        end
2759 14 robfinch
        else if (priv_violation) begin
2760
                $display("Priviledge violation");
2761
                CauseCode <= `EX_PRIV;
2762
                StatusEXL <= 1'b1;
2763
                EPC <= xpc;
2764
                pc <= {TBA[63:13],`PRIV_OFFSET};
2765
                dIR <= `NOP_INSN;
2766
                xIR <= `NOP_INSN;
2767
                xRt <= 9'd0;
2768 16 robfinch
                xpcv <= 1'b0;
2769
                dpcv <= 1'b0;
2770 14 robfinch
        end
2771 13 robfinch
end
2772
 
2773
//---------------------------------------------------------
2774
// MEMORY1 (M1') - part two:
2775
// Check for a TLB miss.
2776
//---------------------------------------------------------
2777
if (advanceM1) begin
2778
        if (m1IsLoad|m1IsStore) begin
2779
                if (DTLBMiss) begin
2780
                        $display("DTLB miss on address: %h",ea);
2781
                        m1extype <= `EX_TLBD;
2782
                        CauseCode <= `EX_TLBD;
2783
                        StatusEXL <= 1'b1;
2784
                        BadVAddr <= ea[63:13];
2785
                        EPC <= m1pc;
2786
                        pc <= `DTLB_MissHandler;
2787
                        m1Opcode <= `NOPI;
2788
                        m1Rt <= 9'd0;
2789
                        xIR <= `NOP_INSN;
2790
                        xRt <= 9'd0;
2791
                        dIR <= `NOP_INSN;
2792 16 robfinch
                        m1pcv <= 1'b0;
2793
                        xpcv <= 1'b0;
2794
                        dpcv <= 1'b0;
2795 13 robfinch
                end
2796
        end
2797
end
2798
 
2799
//---------------------------------------------------------
2800
// MEMORY2 (M2')
2801
//---------------------------------------------------------
2802
if (advanceM2) begin
2803
end
2804
 
2805
//---------------------------------------------------------
2806
// WRITEBACK (WB') - part two:
2807
// - vector to exception handler address
2808
// In the case of a hardware interrupt (NMI/IRQ) we know
2809
// the pipeline following the interrupt is filled with
2810
// NOP instructions. This means there is no need to 
2811
// invalidate the pipeline.
2812 14 robfinch
//              Also, we have to wait until the WB stage before
2813
// vectoring so that the pc setting doesn't get trashed
2814
// by a branch or other exception.
2815 16 robfinch
//              Tricky because we have to find the first valid
2816
// PC to record in the IPC register. The interrupt might
2817
// have occurred in a branch shadow, in which case the
2818
// current PC isn't valid.
2819 13 robfinch
//---------------------------------------------------------
2820
if (advanceW) begin
2821 14 robfinch
        case(wextype)
2822 16 robfinch
        `EX_RST:        begin
2823
                                pc <= `RESET_VECTOR;
2824
                                case(1'b1)
2825
                                wpcv:   IPC <= wpc;
2826
                                m2pcv:  IPC <= m2pc;
2827
                                m1pcv:  IPC <= m1pc;
2828
                                xpcv:   IPC <= xpc;
2829
                                dpcv:   IPC <= dpc;
2830
                                default:        IPC <= pc;
2831
                                endcase
2832
                                end
2833
        `EX_NMI:        begin
2834
                                pc <= `NMI_VECTOR;
2835
                                case(1'b1)
2836
                                wpcv:   IPC <= wpc;
2837
                                m2pcv:  IPC <= m2pc;
2838
                                m1pcv:  IPC <= m1pc;
2839
                                xpcv:   IPC <= xpc;
2840
                                dpcv:   IPC <= dpc;
2841
                                default:        IPC <= pc;
2842
                                endcase
2843
                                end
2844
        `EX_IRQ:        begin
2845
                                pc <= `IRQ_VECTOR;
2846
                                case(1'b1)
2847
                                wpcv:   IPC <= wpc;
2848
                                m2pcv:  IPC <= m2pc;
2849
                                m1pcv:  IPC <= m1pc;
2850
                                xpcv:   IPC <= xpc;
2851
                                dpcv:   IPC <= dpc;
2852
                                default:        IPC <= pc;
2853
                                endcase
2854
                                end
2855 14 robfinch
        default:        ;
2856
        endcase
2857 13 robfinch
end
2858
 
2859
 
2860
//---------------------------------------------------------
2861
// Trailer (TR')
2862
// - no exceptions
2863
//---------------------------------------------------------
2864
if (advanceT) begin
2865
end
2866
 
2867
 
2868
//---------------------------------------------------------
2869
// Cache loader
2870
//---------------------------------------------------------
2871
if (rst_i) begin
2872
        cstate <= IDLE;
2873
end
2874
else begin
2875
case(cstate)
2876
IDLE:
2877 14 robfinch
        if (triggerDCacheLoad) begin
2878
                dcaccess <= 1'b1;
2879
                bte_o <= 2'b00;                 // linear burst
2880
                cti_o <= 3'b010;                // burst access
2881
                bl_o <= 5'd8;
2882
                cyc_o <= 1'b1;
2883
                stb_o <= 1'b1;
2884
                adr_o <= {pea[63:6],6'h00};
2885
                cstate <= DCACT;
2886 13 robfinch
        end
2887 14 robfinch
        else if (triggerICacheLoad) begin
2888
                icaccess <= 1'b1;
2889
                bte_o <= 2'b00;                 // linear burst
2890
                cti_o <= 3'b010;                // burst access
2891
                bl_o <= 5'd8;
2892
                cyc_o <= 1'b1;
2893
                stb_o <= 1'b1;
2894
                adr_o <= {ppc[63:6],6'h00};
2895
                cstate <= ICACT1;
2896 13 robfinch
        end
2897
// WISHBONE burst accesses
2898
//
2899
ICACT1:
2900
        if (ack_i) begin
2901 14 robfinch
                adr_o[5:3] <= adr_o[5:3] + 3'd1;
2902
                if (adr_o[5:3]==3'h6)
2903 13 robfinch
                        cti_o <= 3'b111;        // Last cycle ahead
2904 14 robfinch
                if (adr_o[5:3]==3'h7) begin
2905 13 robfinch
                        cti_o <= 3'b000;        // back to non-burst mode
2906
                        cyc_o <= 1'b0;
2907
                        stb_o <= 1'b0;
2908 14 robfinch
                        tmem[adr_o[12:6]] <= {1'b1,adr_o[63:13]};       // This will cause ihit to go high
2909
                        tvalid[adr_o[12:6]] <= 1'b1;
2910
                        icaccess <= 1'b0;
2911 13 robfinch
                        cstate <= IDLE;
2912
                end
2913
        end
2914
DCACT:
2915 14 robfinch
        if (ack_i) begin
2916
                adr_o[5:3] <= adr_o[5:3] + 3'd1;
2917
                if (adr_o[5:3]==3'h6)
2918
                        cti_o <= 3'b111;        // Last cycle ahead
2919
                if (adr_o[5:3]==3'h7) begin
2920
                        cti_o <= 3'b000;        // back to non-burst mode
2921
                        cyc_o <= 1'b0;
2922
                        stb_o <= 1'b0;
2923
                        dcaccess <= 1'b0;
2924
                        cstate <= IDLE;
2925 13 robfinch
                end
2926
        end
2927 14 robfinch
 
2928 13 robfinch
endcase
2929
end
2930
 
2931
end
2932
 
2933
endmodule

powered by: WebSVN 2.1.0

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