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

Subversion Repositories raptor64

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

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

powered by: WebSVN 2.1.0

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