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

Subversion Repositories raptor64

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

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

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

powered by: WebSVN 2.1.0

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