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

Subversion Repositories raptor64

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

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

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

powered by: WebSVN 2.1.0

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