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

Subversion Repositories raptor64

[/] [raptor64/] [trunk/] [rtl/] [verilog/] [Raptor64.v] - Blame information for rev 3

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

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

powered by: WebSVN 2.1.0

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