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

Subversion Repositories rtf65002

[/] [rtf65002/] [trunk/] [rtl/] [verilog/] [rtf65002d.v] - Blame information for rev 21

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

Line No. Rev Author Line
1 10 robfinch
`timescale 1ns / 1ps
2
// ============================================================================
3
//        __
4
//   \\__/ o\    (C) 2013  Robert Finch, Stratford
5
//    \  __ /    All rights reserved.
6
//     \/_//     robfinch<remove>@opencores.org
7
//       ||
8
//
9
// rtf65002.v
10
//  - 32 bit CPU
11
//
12
// This source file is free software: you can redistribute it and/or modify 
13
// it under the terms of the GNU Lesser General Public License as published 
14
// by the Free Software Foundation, either version 3 of the License, or     
15
// (at your option) any later version.                                      
16
//                                                                          
17
// This source file is distributed in the hope that it will be useful,      
18
// but WITHOUT ANY WARRANTY; without even the implied warranty of           
19
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            
20
// GNU General Public License for more details.                             
21
//                                                                          
22
// You should have received a copy of the GNU General Public License        
23
// along with this program.  If not, see <http://www.gnu.org/licenses/>.    
24
//                                                                          
25
// ============================================================================
26
//
27 5 robfinch
`define TRUE            1'b1
28
`define FALSE           1'b0
29
 
30
`define RST_VECT        34'h3FFFFFFF8
31
`define NMI_VECT        34'h3FFFFFFF4
32
`define IRQ_VECT        34'h3FFFFFFF0
33 13 robfinch
`define BRK_VECTNO      9'd0
34
`define SLP_VECTNO      9'd1
35 21 robfinch
`define BYTE_RST_VECT   34'h00000FFFC
36 5 robfinch
`define BYTE_NMI_VECT   34'h00000FFFA
37
`define BYTE_IRQ_VECT   34'h00000FFFE
38
 
39
`define BRK                     8'h00
40
`define RTI                     8'h40
41
`define RTS                     8'h60
42
`define PHP                     8'h08
43
`define CLC                     8'h18
44
`define PLP                     8'h28
45
`define SEC                     8'h38
46
`define PHA                     8'h48
47
`define CLI                     8'h58
48
`define PLA                     8'h68
49
`define SEI                     8'h78
50
`define DEY                     8'h88
51
`define TYA                     8'h98
52
`define TAY                     8'hA8
53
`define CLV                     8'hB8
54
`define INY                     8'hC8
55
`define CLD                     8'hD8
56
`define INX                     8'hE8
57
`define SED                     8'hF8
58
`define ROR_ACC         8'h6A
59
`define TXA                     8'h8A
60
`define TXS                     8'h9A
61
`define TAX                     8'hAA
62
`define TSX                     8'hBA
63
`define DEX                     8'hCA
64
`define NOP                     8'hEA
65
`define TXY                     8'h9B
66
`define TYX                     8'hBB
67
`define TAS                     8'h1B
68
`define TSA                     8'h3B
69
`define TRS                     8'h8B
70
`define TSR                     8'hAB
71
`define STP                     8'hDB
72
`define NAT                     8'hFB
73
`define EMM                     8'hFB
74
`define INA                     8'h1A
75
`define DEA                     8'h3A
76
 
77
`define RR                      8'h02
78 12 robfinch
`define ADD_RR                  4'd0
79
`define SUB_RR                  4'd1
80
`define CMP_RR                  4'd2
81
`define AND_RR                  4'd3
82
`define EOR_RR                  4'd4
83
`define OR_RR                   4'd5
84
`define MUL_RR                  4'd8
85
`define MULS_RR                 4'd9
86
`define DIV_RR                  4'd10
87
`define DIVS_RR                 4'd11
88
`define MOD_RR                  4'd12
89
`define MODS_RR                 4'd13
90 19 robfinch
`define ASL_RRR                 4'd14
91
`define LSR_RRR                 4'd15
92 12 robfinch
`define LD_RR           8'h7B
93 5 robfinch
 
94
`define ADD_IMM8        8'h65           // 8 bit operand
95
`define ADD_IMM16       8'h79           // 16 bit operand
96
`define ADD_IMM32       8'h69           // 32 bit operand
97
`define ADD_ZPX         8'h75           // there is no ZP mode, use R0 to syntheisze
98
`define ADD_IX          8'h61
99
`define ADD_IY          8'h71
100
`define ADD_ABS         8'h6D
101
`define ADD_ABSX        8'h7D
102
`define ADD_RIND        8'h72
103
 
104
`define SUB_IMM8        8'hE5
105
`define SUB_IMM16       8'hF9
106
`define SUB_IMM32       8'hE9
107
`define SUB_ZPX         8'hF5
108
`define SUB_IX          8'hE1
109
`define SUB_IY          8'hF1
110
`define SUB_ABS         8'hED
111
`define SUB_ABSX        8'hFD
112
`define SUB_RIND        8'hF2
113
 
114
// CMP = SUB r0,....
115
 
116
`define ADC_IMM         8'h69
117
`define ADC_ZP          8'h65
118
`define ADC_ZPX         8'h75
119
`define ADC_IX          8'h61
120
`define ADC_IY          8'h71
121
`define ADC_ABS         8'h6D
122
`define ADC_ABSX        8'h7D
123
`define ADC_ABSY        8'h79
124
`define ADC_I           8'h72
125
 
126
`define SBC_IMM         8'hE9
127
`define SBC_ZP          8'hE5
128
`define SBC_ZPX         8'hF5
129
`define SBC_IX          8'hE1
130
`define SBC_IY          8'hF1
131
`define SBC_ABS         8'hED
132
`define SBC_ABSX        8'hFD
133
`define SBC_ABSY        8'hF9
134
`define SBC_I           8'hF2
135
 
136 19 robfinch
`define CMP_IMM8        8'hC5
137 5 robfinch
`define CMP_IMM32       8'hC9
138
`define CMP_IMM         8'hC9
139
`define CMP_ZP          8'hC5
140
`define CMP_ZPX         8'hD5
141
`define CMP_IX          8'hC1
142
`define CMP_IY          8'hD1
143
`define CMP_ABS         8'hCD
144
`define CMP_ABSX        8'hDD
145
`define CMP_ABSY        8'hD9
146
`define CMP_I           8'hD2
147
 
148
 
149
`define LDA_IMM8        8'hA5
150
`define LDA_IMM16       8'hB9
151
`define LDA_IMM32       8'hA9
152
 
153
`define AND_IMM8        8'h25
154
`define AND_IMM16       8'h39
155
`define AND_IMM32       8'h29
156
`define AND_IMM         8'h29
157
`define AND_ZP          8'h25
158
`define AND_ZPX         8'h35
159
`define AND_IX          8'h21
160
`define AND_IY          8'h31
161
`define AND_ABS         8'h2D
162
`define AND_ABSX        8'h3D
163
`define AND_ABSY        8'h39
164
`define AND_RIND        8'h32
165
`define AND_I           8'h32
166
 
167
`define OR_IMM8         8'h05
168
`define OR_IMM16        8'h19
169
`define OR_IMM32        8'h09
170
`define OR_ZPX          8'h15
171
`define OR_IX           8'h01
172
`define OR_IY           8'h11
173
`define OR_ABS          8'h0D
174
`define OR_ABSX         8'h1D
175
`define OR_RIND         8'h12
176
 
177
`define ORA_IMM         8'h09
178
`define ORA_ZP          8'h05
179
`define ORA_ZPX         8'h15
180
`define ORA_IX          8'h01
181
`define ORA_IY          8'h11
182
`define ORA_ABS         8'h0D
183
`define ORA_ABSX        8'h1D
184
`define ORA_ABSY        8'h19
185
`define ORA_I           8'h12
186
 
187
`define EOR_IMM         8'h49
188
`define EOR_IMM8        8'h45
189
`define EOR_IMM16       8'h59
190
`define EOR_IMM32       8'h49
191
`define EOR_ZP          8'h45
192
`define EOR_ZPX         8'h55
193
`define EOR_IX          8'h41
194
`define EOR_IY          8'h51
195
`define EOR_ABS         8'h4D
196
`define EOR_ABSX        8'h5D
197
`define EOR_ABSY        8'h59
198
`define EOR_RIND        8'h52
199
`define EOR_I           8'h52
200
 
201
// LD is OR rt,r0,....
202
 
203
`define ST_ZPX          8'h95
204
`define ST_IX           8'h81
205
`define ST_IY           8'h91
206
`define ST_ABS          8'h8D
207
`define ST_ABSX         8'h9D
208
`define ST_RIND         8'h92
209
 
210
`define ORB_ZPX         8'hB5
211
`define ORB_IX          8'hA1
212
`define ORB_IY          8'hB1
213
`define ORB_ABS         8'hAD
214
`define ORB_ABSX        8'hBD
215
 
216
`define STB_ZPX         8'h74
217
`define STB_ABS         8'h9C
218
`define STB_ABSX        8'h9E
219
 
220
 
221
//`define LDB_RIND      8'hB2   // Conflict with LDX #imm16
222
 
223
`define LDA_IMM         8'hA9
224
`define LDA_ZP          8'hA5
225
`define LDA_ZPX         8'hB5
226
`define LDA_IX          8'hA1
227
`define LDA_IY          8'hB1
228
`define LDA_ABS         8'hAD
229
`define LDA_ABSX        8'hBD
230
`define LDA_ABSY        8'hB9
231
`define LDA_I           8'hB2
232
 
233
`define STA_ZP          8'h85
234
`define STA_ZPX         8'h95
235
`define STA_IX          8'h81
236
`define STA_IY          8'h91
237
`define STA_ABS         8'h8D
238
`define STA_ABSX        8'h9D
239
`define STA_ABSY        8'h99
240
`define STA_I           8'h92
241
 
242 19 robfinch
`define ASL_IMM8        8'h24
243 5 robfinch
`define ASL_ACC         8'h0A
244
`define ASL_ZP          8'h06
245
`define ASL_RR          8'h06
246
`define ASL_ZPX         8'h16
247
`define ASL_ABS         8'h0E
248
`define ASL_ABSX        8'h1E
249
 
250
`define ROL_ACC         8'h2A
251
`define ROL_ZP          8'h26
252
`define ROL_RR          8'h26
253
`define ROL_ZPX         8'h36
254
`define ROL_ABS         8'h2E
255
`define ROL_ABSX        8'h3E
256
 
257 19 robfinch
`define LSR_IMM8        8'h34
258 5 robfinch
`define LSR_ACC         8'h4A
259
`define LSR_ZP          8'h46
260
`define LSR_RR          8'h46
261
`define LSR_ZPX         8'h56
262
`define LSR_ABS         8'h4E
263
`define LSR_ABSX        8'h5E
264
 
265
`define ROR_RR          8'h66
266
`define ROR_ZP          8'h66
267
`define ROR_ZPX         8'h76
268
`define ROR_ABS         8'h6E
269
`define ROR_ABSX        8'h7E
270
 
271 12 robfinch
`define DEC_RR          8'hC6
272 5 robfinch
`define DEC_ZP          8'hC6
273
`define DEC_ZPX         8'hD6
274
`define DEC_ABS         8'hCE
275
`define DEC_ABSX        8'hDE
276 12 robfinch
`define INC_RR          8'hE6
277 5 robfinch
`define INC_ZP          8'hE6
278
`define INC_ZPX         8'hF6
279
`define INC_ABS         8'hEE
280
`define INC_ABSX        8'hFE
281
 
282
`define BIT_IMM         8'h89
283
`define BIT_ZP          8'h24
284
`define BIT_ZPX         8'h34
285
`define BIT_ABS         8'h2C
286
`define BIT_ABSX        8'h3C
287
 
288
// CMP = SUB r0,...
289
// BIT = AND r0,...
290
`define BPL                     8'h10
291
`define BVC                     8'h50
292
`define BCC                     8'h90
293
`define BNE                     8'hD0
294
`define BMI                     8'h30
295
`define BVS                     8'h70
296
`define BCS                     8'hB0
297
`define BEQ                     8'hF0
298
`define BRL                     8'h82
299 20 robfinch
`define BRA                     8'h80
300 5 robfinch
 
301
`define JML                     8'h5C
302
`define JMP                     8'h4C
303
`define JMP_IND         8'h6C
304
`define JMP_INDX        8'h7C
305
`define JMP_RIND        8'hD2
306
`define JSR                     8'h20
307
`define JSL                     8'h22
308
`define JSR_INDX        8'hFC
309
`define JSR_RIND        8'hC2
310
`define RTS                     8'h60
311
`define RTL                     8'h6B
312
`define BSR                     8'h62
313
`define NOP                     8'hEA
314
 
315
`define BRK                     8'h00
316
`define PLX                     8'hFA
317
`define PLY                     8'h7A
318
`define PHX                     8'hDA
319
`define PHY                     8'h5A
320
`define WAI                     8'hCB
321
`define PUSH            8'h0B
322
`define POP                     8'h2B
323
 
324
`define LDX_IMM         8'hA2
325
`define LDX_ZP          8'hA6
326
`define LDX_ZPX         8'hB6
327
`define LDX_ZPY         8'hB6
328
`define LDX_ABS         8'hAE
329
`define LDX_ABSY        8'hBE
330
 
331
`define LDX_IMM32       8'hA2
332
`define LDX_IMM16       8'hB2
333
`define LDX_IMM8        8'hA6
334
 
335
`define LDY_IMM         8'hA0
336
`define LDY_ZP          8'hA4
337
`define LDY_ZPX         8'hB4
338
`define LDY_IMM32       8'hA0
339
`define LDY_ABS         8'hAC
340
`define LDY_ABSX        8'hBC
341
 
342
`define STX_ZP          8'h86
343
`define STX_ZPX         8'h96
344
`define STX_ZPY         8'h96
345
`define STX_ABS         8'h8E
346
 
347
`define STY_ZP          8'h84
348
`define STY_ZPX         8'h94
349
`define STY_ABS         8'h8C
350
 
351
`define STZ_ZP          8'h64
352
`define STZ_ZPX         8'h74
353
`define STZ_ABS         8'h9C
354
`define STZ_ABSX        8'h9E
355
 
356
`define CPX_IMM         8'hE0
357
`define CPX_IMM32       8'hE0
358
`define CPX_ZP          8'hE4
359
`define CPX_ZPX         8'hE4
360
`define CPX_ABS         8'hEC
361
`define CPY_IMM         8'hC0
362
`define CPY_IMM32       8'hC0
363
`define CPY_ZP          8'hC4
364
`define CPY_ZPX         8'hC4
365
`define CPY_ABS         8'hCC
366
 
367
`define TRB_ZP          8'h14
368
`define TRB_ZPX         8'h14
369
`define TRB_ABS         8'h1C
370
`define TSB_ZP          8'h04
371
`define TSB_ZPX         8'h04
372
`define TSB_ABS         8'h0C
373
 
374 10 robfinch
`define BAZ                     8'hC1
375
`define BXZ                     8'hD1
376
`define BEQ_RR          8'hE2
377 21 robfinch
`define INT0            8'hDC
378
`define INT1            8'hDD
379 10 robfinch
 
380 21 robfinch
`define NOTHING         4'd0
381
`define SR_70           4'd1
382
`define SR_310          4'd2
383
`define BYTE_70         4'd3
384
`define WORD_310        4'd4
385
`define PC_70           4'd5
386
`define PC_158          4'd6
387
`define PC_2316         4'd7
388
`define PC_3124         4'd8
389
`define PC_310          4'd9
390
`define WORD_311        4'd10
391
`define IA_310          4'd11
392
`define IA_70           4'd12
393
`define IA_158          4'd13
394
`define BYTE_71         4'd14
395
 
396 5 robfinch
module icachemem(wclk, wr, adr, dat, rclk, pc, insn);
397
input wclk;
398
input wr;
399
input [33:0] adr;
400
input [31:0] dat;
401
input rclk;
402
input [31:0] pc;
403 21 robfinch
output reg [63:0] insn;
404 5 robfinch
 
405
wire [63:0] insn0;
406
wire [63:0] insn1;
407
wire [31:0] pcp8 = pc + 32'd8;
408
reg [31:0] rpc;
409
 
410
always @(posedge rclk)
411
        rpc <= pc;
412
 
413
// memL and memH combined allow a 64 bit read
414 10 robfinch
syncRam2kx32_1rw1r ramL0
415 5 robfinch
(
416
        .wrst(1'b0),
417
        .wclk(wclk),
418
        .wce(~adr[2]),
419
        .we(wr),
420
        .wsel(4'hF),
421 10 robfinch
        .wadr(adr[13:3]),
422 5 robfinch
        .i(dat),
423
        .wo(),
424
        .rrst(1'b0),
425
        .rclk(rclk),
426
        .rce(1'b1),
427 10 robfinch
        .radr(pc[13:3]),
428 5 robfinch
        .o(insn0[31:0])
429
);
430
 
431 10 robfinch
syncRam2kx32_1rw1r ramH0
432 5 robfinch
(
433
        .wrst(1'b0),
434
        .wclk(wclk),
435
        .wce(adr[2]),
436
        .we(wr),
437
        .wsel(4'hF),
438 10 robfinch
        .wadr(adr[13:3]),
439 5 robfinch
        .i(dat),
440
        .wo(),
441
        .rrst(1'b0),
442
        .rclk(rclk),
443
        .rce(1'b1),
444 10 robfinch
        .radr(pc[13:3]),
445 5 robfinch
        .o(insn0[63:32])
446
);
447
 
448 10 robfinch
syncRam2kx32_1rw1r ramL1
449 5 robfinch
(
450
        .wrst(1'b0),
451
        .wclk(wclk),
452
        .wce(~adr[2]),
453
        .we(wr),
454
        .wsel(4'hF),
455 10 robfinch
        .wadr(adr[13:3]),
456 5 robfinch
        .i(dat),
457
        .wo(),
458
        .rrst(1'b0),
459
        .rclk(rclk),
460
        .rce(1'b1),
461 10 robfinch
        .radr(pcp8[13:3]),
462 5 robfinch
        .o(insn1[31:0])
463
);
464
 
465 10 robfinch
syncRam2kx32_1rw1r ramH1
466 5 robfinch
(
467
        .wrst(1'b0),
468
        .wclk(wclk),
469
        .wce(adr[2]),
470
        .we(wr),
471
        .wsel(4'hF),
472 10 robfinch
        .wadr(adr[13:3]),
473 5 robfinch
        .i(dat),
474
        .wo(),
475
        .rrst(1'b0),
476
        .rclk(rclk),
477
        .rce(1'b1),
478 10 robfinch
        .radr(pcp8[13:3]),
479 5 robfinch
        .o(insn1[63:32])
480
);
481
 
482
always @(rpc or insn0 or insn1)
483
case(rpc[2:0])
484 21 robfinch
3'd0:   insn <= insn0[63:0];
485
3'd1:   insn <= {insn1[7:0],insn0[63:8]};
486
3'd2:   insn <= {insn1[15:0],insn0[63:16]};
487
3'd3:   insn <= {insn1[23:0],insn0[63:24]};
488
3'd4:   insn <= {insn1[31:0],insn0[63:32]};
489
3'd5:   insn <= {insn1[39:0],insn0[63:40]};
490
3'd6:   insn <= {insn1[47:0],insn0[63:48]};
491
3'd7:   insn <= {insn1[55:0],insn0[63:56]};
492 5 robfinch
endcase
493
endmodule
494
 
495
module tagmem(wclk, wr, adr, rclk, pc, hit0, hit1);
496
input wclk;
497
input wr;
498
input [33:0] adr;
499
input rclk;
500
input [31:0] pc;
501
output hit0;
502
output hit1;
503
 
504
wire [31:0] pcp8 = pc + 32'd8;
505
wire [31:0] tag0;
506
wire [31:0] tag1;
507
reg [31:0] rpc;
508
reg [31:0] rpcp8;
509
 
510
always @(posedge rclk)
511
        rpc <= pc;
512
always @(posedge rclk)
513
        rpcp8 <= pcp8;
514
 
515 10 robfinch
syncRam1kx32_1rw1r ram0 (
516 5 robfinch
        .wrst(1'b0),
517
        .wclk(wclk),
518
        .wce(adr[3:2]==2'b11),
519
        .we(wr),
520 10 robfinch
        .wsel(4'hF),
521
        .wadr(adr[13:4]),
522 5 robfinch
        .i(adr[31:0]),
523
        .wo(),
524
 
525 10 robfinch
        .rrst(1'b0),
526
        .rclk(rclk),
527
        .rce(1'b1),
528
        .radr(pc[13:4]),
529
        .o(tag0)
530
);
531 5 robfinch
 
532 10 robfinch
syncRam1kx32_1rw1r ram1 (
533
        .wrst(1'b0),
534
        .wclk(wclk),
535
        .wce(adr[3:2]==2'b11),
536
        .we(wr),
537
        .wsel(4'hF),
538
        .wadr(adr[13:4]),
539
        .i(adr[31:0]),
540
        .wo(),
541
 
542
        .rrst(1'b0),
543
        .rclk(rclk),
544
        .rce(1'b1),
545
        .radr(pcp8[13:4]),
546
        .o(tag1)
547 5 robfinch
);
548
 
549 10 robfinch
assign hit0 = tag0[31:14]==rpc[31:14] && tag0[0];
550
assign hit1 = tag1[31:14]==rpcp8[31:14] && tag1[0];
551 5 robfinch
 
552
endmodule
553
 
554
module dcachemem(wclk, wr, sel, wadr, wdat, rclk, radr, rdat);
555
input wclk;
556
input wr;
557
input [3:0] sel;
558
input [31:0] wadr;
559
input [31:0] wdat;
560
input rclk;
561
input [31:0] radr;
562
output [31:0] rdat;
563
 
564
syncRam2kx32_1rw1r ram0 (
565
        .wrst(1'b0),
566
        .wclk(wclk),
567
        .wce(1'b1),
568
        .we(wr),
569
        .wsel(sel),
570
        .wadr(wadr[10:0]),
571
        .i(wdat),
572
        .wo(),
573
        .rrst(1'b0),
574
        .rclk(rclk),
575
        .rce(1'b1),
576
        .radr(radr[10:0]),
577
        .o(rdat)
578
);
579
 
580
endmodule
581
 
582
module dtagmem(wclk, wr, wadr, rclk, radr, hit);
583
input wclk;
584
input wr;
585
input [31:0] wadr;
586
input rclk;
587
input [31:0] radr;
588
output hit;
589
 
590
reg [31:0] rradr;
591
wire [31:0] tag;
592
 
593
syncRam512x32_1rw1r u1
594
        (
595
                .wrst(1'b0),
596
                .wclk(wclk),
597
                .wce(wadr[1:0]==2'b11),
598
                .we(wr),
599
                .wadr(wadr[10:2]),
600
                .i(wadr),
601
                .wo(),
602
                .rrst(1'b0),
603
                .rclk(rclk),
604
                .rce(1'b1),
605
                .radr(radr[10:2]),
606
                .o(tag)
607
        );
608
 
609
 
610
always @(rclk)
611
        rradr <= radr;
612
 
613
assign hit = tag[31:11]==rradr[31:11];
614
 
615
endmodule
616
 
617
module overflow(op, a, b, s, v);
618
 
619
input op;       // 0=add,1=sub
620
input a;
621
input b;
622
input s;        // sum
623
output v;
624
 
625
// Overflow:
626
// Add: the signs of the inputs are the same, and the sign of the
627
// sum is different
628
// Sub: the signs of the inputs are different, and the sign of
629
// the sum is the same as B
630
assign v = (op ^ s ^ b) & (~op ^ a ^ b);
631
 
632 12 robfinch
endmodule
633 5 robfinch
 
634 12 robfinch
 
635 21 robfinch
module rtf65002d(rst_md, rst_i, clk_i, nmi_i, irq_i, irq_vect, bte_o, cti_o, bl_o, lock_o, cyc_o, stb_o, ack_i, err_i, we_o, sel_o, adr_o, dat_i, dat_o);
636 5 robfinch
parameter IDLE = 3'd0;
637
parameter LOAD_DCACHE = 3'd1;
638
parameter LOAD_ICACHE = 3'd2;
639
parameter LOAD_IBUF1 = 3'd3;
640
parameter LOAD_IBUF2 = 3'd4;
641
parameter LOAD_IBUF3 = 3'd5;
642 10 robfinch
parameter RESET1 = 7'd0;
643 5 robfinch
parameter IFETCH = 7'd1;
644
parameter JMP_IND1 = 7'd2;
645
parameter JMP_IND2 = 7'd3;
646
parameter DECODE = 7'd4;
647
parameter STORE1 = 7'd5;
648
parameter STORE2 = 7'd6;
649
parameter LOAD1 = 7'd7;
650
parameter LOAD2 = 7'd8;
651
parameter IRQ1 = 7'd9;
652
parameter IRQ2 = 7'd10;
653
parameter IRQ3 = 7'd11;
654
parameter CALC = 7'd12;
655
parameter JSR1 = 7'd13;
656
parameter JSR_INDX1 = 7'd14;
657
parameter JSR161 = 7'd15;
658
parameter RTS1 = 7'd16;
659
parameter RTS2 = 7'd17;
660
parameter IX1 = 7'd18;
661
parameter IX2 = 7'd19;
662
parameter IX3 = 7'd20;
663
parameter IX4 = 7'd21;
664
parameter IY1 = 7'd22;
665
parameter IY2 = 7'd23;
666
parameter IY3 = 7'd24;
667
parameter PHP1 = 7'd27;
668
parameter PLP1 = 7'd28;
669
parameter PLP2 = 7'd29;
670
parameter PLA1 = 7'd30;
671
parameter PLA2 = 7'd31;
672
parameter BSR1 = 7'd32;
673
parameter BYTE_IX1 = 7'd33;
674
parameter BYTE_IX2 = 7'd34;
675
parameter BYTE_IX3 = 7'd35;
676
parameter BYTE_IX4 = 7'd36;
677
parameter BYTE_IX5 = 7'd37;
678
parameter BYTE_IY1 = 7'd38;
679
parameter BYTE_IY2 = 7'd39;
680
parameter BYTE_IY3 = 7'd40;
681
parameter BYTE_IY4 = 7'd41;
682
parameter BYTE_IY5 = 7'd42;
683
parameter RTS3 = 7'd43;
684
parameter RTS4 = 7'd44;
685
parameter RTS5 = 7'd45;
686
parameter BYTE_JSR1 = 7'd46;
687
parameter BYTE_JSR2 = 7'd47;
688
parameter BYTE_JSR3 = 7'd48;
689
parameter BYTE_IRQ1 = 7'd49;
690
parameter BYTE_IRQ2 = 7'd50;
691
parameter BYTE_IRQ3 = 7'd51;
692
parameter BYTE_IRQ4 = 7'd52;
693
parameter BYTE_IRQ5 = 7'd53;
694
parameter BYTE_IRQ6 = 7'd54;
695
parameter BYTE_IRQ7 = 7'd55;
696
parameter BYTE_IRQ8 = 7'd56;
697
parameter BYTE_IRQ9 = 7'd57;
698
parameter BYTE_JMP_IND1 = 7'd58;
699
parameter BYTE_JMP_IND2 = 7'd59;
700
parameter BYTE_JMP_IND3 = 7'd60;
701
parameter BYTE_JMP_IND4 = 7'd61;
702
parameter BYTE_JSR_INDX1 = 7'd62;
703
parameter BYTE_JSR_INDX2 = 7'd63;
704
parameter BYTE_JSR_INDX3 = 7'd64;
705
parameter RTI1 = 7'd65;
706
parameter RTI2 = 7'd66;
707
parameter RTI3 = 7'd67;
708
parameter RTI4 = 7'd68;
709
parameter BYTE_RTS1 = 7'd69;
710
parameter BYTE_RTS2 = 7'd70;
711
parameter BYTE_RTS3 = 7'd71;
712
parameter BYTE_RTS4 = 7'd72;
713
parameter BYTE_RTS5 = 7'd73;
714
parameter BYTE_RTS6 = 7'd74;
715
parameter BYTE_RTS7 = 7'd75;
716
parameter BYTE_RTS8 = 7'd76;
717
parameter BYTE_RTS9 = 7'd77;
718
parameter BYTE_RTI1 = 7'd78;
719
parameter BYTE_RTI2 = 7'd79;
720
parameter BYTE_RTI3 = 7'd80;
721
parameter BYTE_RTI4 = 7'd81;
722
parameter BYTE_RTI5 = 7'd82;
723
parameter BYTE_RTI6 = 7'd83;
724
parameter BYTE_RTI7 = 7'd84;
725
parameter BYTE_RTI8 = 7'd85;
726
parameter BYTE_RTI9 = 7'd86;
727
parameter BYTE_RTI10 = 7'd87;
728
parameter BYTE_JSL1 = 7'd88;
729
parameter BYTE_JSL2 = 7'd89;
730
parameter BYTE_JSL3 = 7'd90;
731
parameter BYTE_JSL4 = 7'd91;
732
parameter BYTE_JSL5 = 7'd92;
733
parameter BYTE_JSL6 = 7'd93;
734
parameter BYTE_JSL7 = 7'd94;
735
parameter BYTE_PLP1 = 7'd95;
736
parameter BYTE_PLP2 = 7'd96;
737
parameter BYTE_PLA1 = 7'd97;
738
parameter BYTE_PLA2 = 7'd98;
739 10 robfinch
parameter WAIT_DHIT = 7'd99;
740
parameter RESET2 = 7'd100;
741 12 robfinch
parameter MULDIV1 = 7'd101;
742
parameter MULDIV2 = 7'd102;
743 20 robfinch
parameter BYTE_DECODE = 7'd103;
744
parameter BYTE_CALC = 7'd104;
745 21 robfinch
parameter BUS_ERROR = 7'd105;
746
parameter INSN_BUS_ERROR = 7'd106;
747
parameter LOAD_MAC1 = 7'd107;
748
parameter LOAD_MAC2 = 7'd108;
749 5 robfinch
 
750 21 robfinch
input rst_md;           // reset mode, 1=emulation mode, 0=native mode
751 5 robfinch
input rst_i;
752
input clk_i;
753
input nmi_i;
754
input irq_i;
755 13 robfinch
input [8:0] irq_vect;
756 5 robfinch
output reg [1:0] bte_o;
757
output reg [2:0] cti_o;
758
output reg [5:0] bl_o;
759
output reg lock_o;
760
output reg cyc_o;
761
output reg stb_o;
762
input ack_i;
763 21 robfinch
input err_i;
764 5 robfinch
output reg we_o;
765
output reg [3:0] sel_o;
766
output reg [33:0] adr_o;
767
input [31:0] dat_i;
768
output reg [31:0] dat_o;
769
 
770
reg [6:0] state;
771 10 robfinch
reg [6:0] retstate;
772 5 robfinch
reg [2:0] cstate;
773 21 robfinch
wire [63:0] insn;
774
reg [63:0] ibuf;
775 5 robfinch
reg [31:0] bufadr;
776
 
777
reg cf,nf,zf,vf,bf,im,df,em;
778
reg em1;
779 10 robfinch
reg gie;
780 5 robfinch
reg nmoi;       // native mode on interrupt
781
wire [31:0] sr = {nf,vf,em,24'b0,bf,df,im,zf,cf};
782
wire [7:0] sr8 = {nf,vf,1'b0,bf,df,im,zf,cf};
783
reg nmi1,nmi_edge;
784
reg wai;
785
reg [31:0] acc;
786
reg [31:0] x;
787
reg [31:0] y;
788
reg [7:0] sp;
789 13 robfinch
reg [31:0] spage;        // stack page
790 5 robfinch
wire [7:0] acc8 = acc[7:0];
791
wire [7:0] x8 = x[7:0];
792
wire [7:0] y8 = y[7:0];
793
reg [31:0] isp;          // interrupt stack pointer
794 12 robfinch
wire [63:0] prod;
795
wire [31:0] q,r;
796
reg [31:0] tick;
797 5 robfinch
wire [7:0] sp_dec = sp - 8'd1;
798
wire [7:0] sp_inc = sp + 8'd1;
799
wire [31:0] isp_dec = isp - 32'd1;
800
wire [31:0] isp_inc = isp + 32'd1;
801
reg [31:0] pc;
802
wire [31:0] pcp1 = pc + 32'd1;
803
wire [31:0] pcp2 = pc + 32'd2;
804
wire [31:0] pcp3 = pc + 32'd3;
805
wire [31:0] pcp4 = pc + 32'd4;
806
wire [31:0] pcp8 = pc + 32'd8;
807 13 robfinch
reg [31:0] dp;           // 32 bit mode direct page register
808
reg [31:0] dp8;          // 8 bit mode direct page register
809
reg [31:0] abs8; // 8 bit mode absolute address register
810
reg [31:0] vbr;          // vector table base register
811 5 robfinch
wire bhit=pc==bufadr;
812
reg [31:0] regfile [15:0];
813 21 robfinch
reg [63:0] ir;
814 5 robfinch
wire [3:0] Ra = ir[11:8];
815
wire [3:0] Rb = ir[15:12];
816
reg [31:0] rfoa;
817
reg [31:0] rfob;
818
always @(Ra or x or y or acc)
819
case(Ra)
820
4'h0:   rfoa <= 32'd0;
821
4'h1:   rfoa <= acc;
822
4'h2:   rfoa <= x;
823
4'h3:   rfoa <= y;
824
default:        rfoa <= regfile[Ra];
825
endcase
826
always @(Rb or x or y or acc)
827
case(Rb)
828
4'h0:   rfob <= 32'd0;
829
4'h1:   rfob <= acc;
830
4'h2:   rfob <= x;
831
4'h3:   rfob <= y;
832
default:        rfob <= regfile[Rb];
833
endcase
834
reg [3:0] Rt;
835
reg [33:0] ea;
836
reg first_ifetch;
837 12 robfinch
reg [31:0] lfsr;
838
wire lfsr_fb;
839
xnor(lfsr_fb,lfsr[0],lfsr[1],lfsr[21],lfsr[31]);
840 5 robfinch
reg [31:0] a, b;
841 19 robfinch
wire [31:0] shlo = a << b[4:0];
842
wire [31:0] shro = a >> b[4:0];
843 5 robfinch
reg [7:0] b8;
844
reg [32:0] res;
845
reg [8:0] res8;
846
wire resv8,resv32;
847
wire resc8 = res8[8];
848
wire resc32 = res[32];
849
wire resz8 = res8[7:0]==8'h00;
850
wire resz32 = res[31:0]==32'd0;
851
wire resn8 = res8[7];
852
wire resn32 = res[31];
853
wire resn = em ? res8[7] : res[31];
854
wire resz = em ? res8[7:0]==8'h00 : res[31:0]==32'd0;
855
wire resc = em ? res8[8] : res[32];
856
wire resv = em ? resv8 : resv32;
857
 
858
reg [31:0] vect;
859
reg [31:0] ia;                   // temporary reg to hold indirect address
860 20 robfinch
wire [31:0] iapy8 = abs8 + ia + y[7:0];
861 5 robfinch
reg isInsnCacheLoad;
862
reg isDataCacheLoad;
863 10 robfinch
reg isCacheReset;
864 5 robfinch
wire hit0,hit1;
865
wire dhit;
866 10 robfinch
reg write_allocate;
867 5 robfinch
reg wr;
868
reg [3:0] wrsel;
869
reg [31:0] radr;
870
reg [1:0] radr2LSB;
871
wire [33:0] radr34 = {radr,radr2LSB};
872
wire [33:0] radr34p1 = radr34 + 34'd1;
873
reg [31:0] wadr;
874
reg [1:0] wadr2LSB;
875
reg [31:0] wdat;
876
wire [31:0] rdat;
877 21 robfinch
reg [3:0] load_what;
878
reg [3:0] store_what;
879 5 robfinch
reg imiss;
880
reg dmiss;
881
reg icacheOn,dcacheOn;
882 20 robfinch
wire unCachedData = radr[31:20]==12'hFFD || !dcacheOn;  // I/O area is uncached
883
wire unCachedInsn = pc[31:13]==19'h0 || !icacheOn;              // The lowest 8kB is uncached.
884 5 robfinch
 
885
wire isSub = ir[7:0]==`SUB_ZPX || ir[7:0]==`SUB_IX || ir[7:0]==`SUB_IY ||
886
                         ir[7:0]==`SUB_ABS || ir[7:0]==`SUB_ABSX || ir[7:0]==`SUB_IMM8 || ir[7:0]==`SUB_IMM16 || ir[7:0]==`SUB_IMM32;
887
wire isSub8 = ir[7:0]==`SBC_ZP || ir[7:0]==`SBC_ZPX || ir[7:0]==`SBC_IX || ir[7:0]==`SBC_IY || ir[7:0]==`SBC_I ||
888
                         ir[7:0]==`SBC_ABS || ir[7:0]==`SBC_ABSX || ir[7:0]==`SBC_ABSY || ir[7:0]==`SBC_IMM;
889
wire isCmp = ir[7:0]==`CPX_ZPX || ir[7:0]==`CPX_ABS || ir[7:0]==`CPX_IMM32 ||
890
                         ir[7:0]==`CPY_ZPX || ir[7:0]==`CPY_ABS || ir[7:0]==`CPY_IMM32;
891
wire isRMW32 =
892
                         ir[7:0]==`ASL_ZPX || ir[7:0]==`ROL_ZPX || ir[7:0]==`LSR_ZPX || ir[7:0]==`ROR_ZPX || ir[7:0]==`INC_ZPX || ir[7:0]==`DEC_ZPX ||
893
                         ir[7:0]==`ASL_ABS || ir[7:0]==`ROL_ABS || ir[7:0]==`LSR_ABS || ir[7:0]==`ROR_ABS || ir[7:0]==`INC_ABS || ir[7:0]==`DEC_ABS ||
894
                         ir[7:0]==`ASL_ABSX || ir[7:0]==`ROL_ABSX || ir[7:0]==`LSR_ABSX || ir[7:0]==`ROR_ABSX || ir[7:0]==`INC_ABSX || ir[7:0]==`DEC_ABSX ||
895
                         ir[7:0]==`TRB_ZP || ir[7:0]==`TRB_ZPX || ir[7:0]==`TRB_ABS || ir[7:0]==`TSB_ZP || ir[7:0]==`TSB_ZPX || ir[7:0]==`TSB_ABS;
896
                         ;
897
wire isRMW8 =
898
                         ir[7:0]==`ASL_ZP || ir[7:0]==`ROL_ZP || ir[7:0]==`LSR_ZP || ir[7:0]==`ROR_ZP || ir[7:0]==`INC_ZP || ir[7:0]==`DEC_ZP ||
899
                         ir[7:0]==`ASL_ZPX || ir[7:0]==`ROL_ZPX || ir[7:0]==`LSR_ZPX || ir[7:0]==`ROR_ZPX || ir[7:0]==`INC_ZPX || ir[7:0]==`DEC_ZPX ||
900
                         ir[7:0]==`ASL_ABS || ir[7:0]==`ROL_ABS || ir[7:0]==`LSR_ABS || ir[7:0]==`ROR_ABS || ir[7:0]==`INC_ABS || ir[7:0]==`DEC_ABS ||
901
                         ir[7:0]==`ASL_ABSX || ir[7:0]==`ROL_ABSX || ir[7:0]==`LSR_ABSX || ir[7:0]==`ROR_ABSX || ir[7:0]==`INC_ABSX || ir[7:0]==`DEC_ABSX ||
902
                         ir[7:0]==`TRB_ZP || ir[7:0]==`TRB_ZPX || ir[7:0]==`TRB_ABS || ir[7:0]==`TSB_ZP || ir[7:0]==`TSB_ZPX || ir[7:0]==`TSB_ABS;
903
                         ;
904
wire isRMW = em ? isRMW8 : isRMW32;
905
wire isOrb = ir[7:0]==`ORB_ZPX || ir[7:0]==`ORB_IX || ir[7:0]==`ORB_IY || ir[7:0]==`ORB_ABS || ir[7:0]==`ORB_ABSX;
906
wire isStb = ir[7:0]==`STB_ZPX || ir[7:0]==`STB_ABS || ir[7:0]==`STB_ABSX;
907 21 robfinch
wire isRTI = ir[7:0]==`RTI;
908
wire isRTL = ir[7:0]==`RTL;
909
wire isRTS = ir[7:0]==`RTS;
910 12 robfinch
wire ld_muldiv = state==DECODE && ir[7:0]==`RR;
911
wire md_done;
912
wire clk;
913 21 robfinch
reg isIY;
914 12 robfinch
 
915
mult_div umd1
916
(
917
        .rst(rst),
918
        .clk(clk),
919
        .ld(ld_muldiv),
920
        .op(ir[23:20]),
921
        .a(rfoa),
922
        .b(rfob),
923
        .p(prod),
924
        .q(q),
925
        .r(r),
926
        .done(md_done)
927
);
928
 
929 5 robfinch
icachemem icm0 (
930 12 robfinch
        .wclk(clk),
931 5 robfinch
        .wr(ack_i & isInsnCacheLoad),
932
        .adr(adr_o),
933
        .dat(dat_i),
934
        .rclk(~clk_i),
935
        .pc(pc),
936
        .insn(insn)
937
);
938
 
939
tagmem tgm0 (
940 12 robfinch
        .wclk(clk),
941 10 robfinch
        .wr((ack_i & isInsnCacheLoad)|isCacheReset),
942
        .adr({adr_o[31:1],!isCacheReset}),
943 5 robfinch
        .rclk(~clk_i),
944
        .pc(pc),
945
        .hit0(hit0),
946
        .hit1(hit1)
947
);
948
 
949
wire ihit = (hit0 & hit1);//(pc[2:0] > 3'd1 ? hit1 : 1'b1));
950
 
951
dcachemem dcm0 (
952 12 robfinch
        .wclk(clk),
953 5 robfinch
        .wr(wr | (ack_i & isDataCacheLoad)),
954
        .sel(wr ? wrsel : sel_o),
955
        .wadr(wr ? wadr : adr_o[33:2]),
956
        .wdat(wr ? wdat : dat_i),
957
        .rclk(~clk_i),
958
        .radr(radr),
959
        .rdat(rdat)
960
);
961
 
962
dtagmem dtm0 (
963 12 robfinch
        .wclk(clk),
964 5 robfinch
        .wr(wr | (ack_i & isDataCacheLoad)),
965
        .wadr(wr ? wadr : adr_o[33:2]),
966
        .rclk(~clk_i),
967
        .radr(radr),
968
        .hit(dhit)
969
);
970
 
971
overflow uovr1 (
972
        .op(isSub),
973
        .a(a[31]),
974
        .b(b[31]),
975
        .s(res[31]),
976
        .v(resv32)
977
);
978
 
979
overflow uovr2 (
980
        .op(isSub8),
981
        .a(acc8[7]),
982
        .b(b8[7]),
983
        .s(res8[7]),
984
        .v(resv8)
985
);
986
 
987
wire [7:0] bcaio;
988
wire [7:0] bcao;
989
wire [7:0] bcsio;
990
wire [7:0] bcso;
991
wire bcaico,bcaco,bcsico,bcsco;
992
 
993
BCDAdd ubcdai1 (.ci(cf),.a(acc8),.b(ir[15:8]),.o(bcaio),.c(bcaico));
994
BCDAdd ubcda2 (.ci(cf),.a(acc8),.b(b8),.o(bcao),.c(bcaco));
995
BCDSub ubcdsi1 (.ci(cf),.a(acc8),.b(ir[15:8]),.o(bcsio),.c(bcsico));
996
BCDSub ubcds2 (.ci(cf),.a(acc8),.b(b8),.o(bcso),.c(bcsco));
997
 
998
reg [7:0] dati;
999
always @(radr2LSB or dat_i)
1000
case(radr2LSB)
1001
2'd0:   dati <= dat_i[7:0];
1002
2'd1:   dati <= dat_i[15:8];
1003
2'd2:   dati <= dat_i[23:16];
1004
2'd3:   dati <= dat_i[31:24];
1005
endcase
1006
reg [7:0] rdat8;
1007
always @(radr2LSB or rdat)
1008
case(radr2LSB)
1009
2'd0:   rdat8 <= rdat[7:0];
1010
2'd1:   rdat8 <= rdat[15:8];
1011
2'd2:   rdat8 <= rdat[23:16];
1012
2'd3:   rdat8 <= rdat[31:24];
1013
endcase
1014
 
1015
reg takb;
1016
always @(ir or cf or vf or nf or zf)
1017
case(ir[7:0])
1018
`BEQ:   takb <= zf;
1019
`BNE:   takb <= !zf;
1020
`BPL:   takb <= !nf;
1021
`BMI:   takb <= nf;
1022
`BCS:   takb <= cf;
1023
`BCC:   takb <= !cf;
1024
`BVS:   takb <= vf;
1025
`BVC:   takb <= !vf;
1026
`BRA:   takb <= 1'b1;
1027
`BRL:   takb <= 1'b1;
1028 10 robfinch
//`BAZ: takb <= acc8==8'h00;
1029
//`BXZ: takb <= x8==8'h00;
1030 5 robfinch
default:        takb <= 1'b0;
1031
endcase
1032
 
1033 13 robfinch
wire [31:0] zpx_address = dp8 + ir[15:8] + x8;
1034
wire [31:0] zpy_address = dp8 + ir[15:8] + y8;
1035
wire [31:0] zp_address = dp8 + ir[15:8];
1036
wire [31:0] abs_address = abs8 + {16'h0,ir[23:8]};
1037
wire [31:0] absx_address = abs8 + {16'h0,ir[23:8] + {8'h0,x8}};
1038
wire [31:0] absy_address = abs8 + {16'h0,ir[23:8] + {8'h0,y8}};
1039 5 robfinch
wire [31:0] zpx32xy_address = dp + ir[23:12] + rfoa;
1040
wire [31:0] absx32xy_address = ir[47:16] + rfob;
1041
wire [31:0] zpx32_address = dp + ir[31:20] + rfob;
1042
wire [31:0] absx32_address = ir[55:24] + rfob;
1043
 
1044
//-----------------------------------------------------------------------------
1045
// Clock control
1046
// - reset or NMI reenables the clock
1047
// - this circuit must be under the clk_i domain
1048
//-----------------------------------------------------------------------------
1049
//
1050
reg cpu_clk_en;
1051
reg clk_en;
1052
BUFGCE u20 (.CE(cpu_clk_en), .I(clk_i), .O(clk) );
1053
 
1054
always @(posedge clk_i)
1055
if (rst_i) begin
1056
        cpu_clk_en <= 1'b1;
1057
        nmi1 <= 1'b0;
1058
end
1059
else begin
1060
        nmi1 <= nmi_i;
1061
        if (nmi_i)
1062
                cpu_clk_en <= 1'b1;
1063
        else
1064
                cpu_clk_en <= clk_en;
1065
end
1066
 
1067
always @(posedge clk)
1068
if (rst_i) begin
1069
        bte_o <= 2'b00;
1070
        cti_o <= 3'b000;
1071
        bl_o <= 6'd0;
1072
        cyc_o <= 1'b0;
1073
        stb_o <= 1'b0;
1074
        we_o <= 1'b0;
1075
        sel_o <= 4'h0;
1076
        adr_o <= 34'd0;
1077
        dat_o <= 32'd0;
1078
        nmi_edge <= 1'b0;
1079
        wai <= 1'b0;
1080
        first_ifetch <= `TRUE;
1081
        wr <= 1'b0;
1082
        cf <= 1'b0;
1083
        ir <= 56'hEAEAEAEAEAEAEA;
1084
        imiss <= `FALSE;
1085
        dmiss <= `FALSE;
1086
        dcacheOn <= 1'b0;
1087
        icacheOn <= 1'b1;
1088 10 robfinch
        write_allocate <= 1'b0;
1089 5 robfinch
        nmoi <= 1'b1;
1090 10 robfinch
        state <= RESET1;
1091 5 robfinch
        cstate <= IDLE;
1092 21 robfinch
        if (rst_md) begin
1093
                pc <= 32'h0000FFF0;             // set high-order pc to zero
1094
                vect <= `BYTE_RST_VECT;
1095
                em <= 1'b1;
1096
        end
1097
        else begin
1098
                vect <= `RST_VECT;
1099
                em <= 1'b0;
1100
                pc <= 32'hFFFFFFF0;
1101
        end
1102 13 robfinch
        spage <= 32'h00000100;
1103 5 robfinch
        bufadr <= 32'd0;
1104
        dp <= 32'd0;
1105 13 robfinch
        dp8 <= 32'd0;
1106
        abs8 <= 32'd0;
1107 5 robfinch
        clk_en <= 1'b1;
1108 10 robfinch
        isCacheReset <= `TRUE;
1109
        gie <= 1'b0;
1110 12 robfinch
        tick <= 32'd0;
1111 21 robfinch
        isIY <= 1'b0;
1112 5 robfinch
end
1113
else begin
1114 12 robfinch
tick <= tick + 32'd1;
1115 5 robfinch
wr <= 1'b0;
1116
if (nmi_i & !nmi1)
1117
        nmi_edge <= 1'b1;
1118
if (nmi_i|nmi1)
1119
        clk_en <= 1'b1;
1120
case(state)
1121 10 robfinch
RESET1:
1122 5 robfinch
        begin
1123 10 robfinch
                adr_o <= adr_o + 32'd4;
1124
                if (adr_o[13:4]==10'h3FF) begin
1125
                        state <= RESET2;
1126
                        isCacheReset <= `FALSE;
1127
                end
1128
        end
1129
RESET2:
1130
        begin
1131 5 robfinch
                radr <= vect[31:2];
1132 21 robfinch
                radr2LSB <= vect[1:0];
1133
                load_what <= em ? `PC_70 : `PC_310;
1134
                state <= LOAD_MAC1;
1135 5 robfinch
        end
1136
 
1137 20 robfinch
`include "ifetch.v"
1138
`include "decode.v"
1139
`include "byte_decode.v"
1140 10 robfinch
 
1141 21 robfinch
`include "load_mac.v"
1142 20 robfinch
`include "store.v"
1143 10 robfinch
 
1144
WAIT_DHIT:
1145
        if (dhit)
1146
                state <= retstate;
1147 5 robfinch
 
1148 20 robfinch
`include "byte_calc.v"
1149 5 robfinch
`include "calc.v"
1150 20 robfinch
`include "byte_jsr.v"
1151
`include "byte_jsl.v"
1152 5 robfinch
 
1153
JSR1:
1154
        if (ack_i) begin
1155 10 robfinch
                state <= IFETCH;
1156
                retstate <= IFETCH;
1157 5 robfinch
                cyc_o <= 1'b0;
1158
                stb_o <= 1'b0;
1159
                we_o <= 1'b0;
1160
                sel_o <= 4'h0;
1161
                adr_o <= 34'd0;
1162
                dat_o <= 32'd0;
1163
                pc <= vect;
1164
                isp <= isp_dec;
1165
                if (dhit) begin
1166
                        wrsel <= sel_o;
1167
                        wr <= 1'b1;
1168
                end
1169 10 robfinch
                else if (write_allocate) begin
1170
                        state <= WAIT_DHIT;
1171
                        dmiss <= `TRUE;
1172
                end
1173 5 robfinch
        end
1174
 
1175
JSR_INDX1:
1176
        if (ack_i) begin
1177 21 robfinch
                load_what <= `PC_310;
1178
                state <= LOAD_MAC1;
1179
                retstate <= LOAD_MAC1;
1180 5 robfinch
                cyc_o <= 1'b0;
1181
                stb_o <= 1'b0;
1182
                we_o <= 1'b0;
1183
                sel_o <= 4'h0;
1184
                adr_o <= 34'd0;
1185
                dat_o <= 32'd0;
1186
                radr <= ir[39:8] + x;
1187
                isp <= isp_dec;
1188
                if (dhit) begin
1189
                        wrsel <= sel_o;
1190
                        wr <= 1'b1;
1191
                end
1192 10 robfinch
                else if (write_allocate) begin
1193
                        dmiss <= `TRUE;
1194
                        state <= WAIT_DHIT;
1195
                end
1196 5 robfinch
        end
1197 20 robfinch
 
1198 5 robfinch
JSR161:
1199
        if (ack_i) begin
1200 10 robfinch
                state <= IFETCH;
1201
                retstate <= IFETCH;
1202 5 robfinch
                cyc_o <= 1'b0;
1203
                stb_o <= 1'b0;
1204
                we_o <= 1'b0;
1205
                sel_o <= 4'h0;
1206
                pc <= {{16{ir[23]}},ir[23:8]};
1207
                isp <= isp_dec;
1208
                if (dhit) begin
1209
                        wrsel <= sel_o;
1210
                        wr <= 1'b1;
1211
                end
1212 10 robfinch
                else if (write_allocate) begin
1213
                        state <= WAIT_DHIT;
1214
                        dmiss <= `TRUE;
1215
                end
1216 5 robfinch
        end
1217
 
1218 20 robfinch
`include "php.v"
1219 5 robfinch
`include "byte_irq.v"
1220
 
1221
IRQ1:
1222
        if (ack_i) begin
1223 21 robfinch
                ir <= 64'd0;            // Force instruction decoder to BRK
1224 10 robfinch
                state <= IRQ2;
1225
                retstate <= IRQ2;
1226 5 robfinch
                cyc_o <= 1'b0;
1227
                stb_o <= 1'b0;
1228
                we_o <= 1'b0;
1229
                sel_o <= 4'h0;
1230
                isp <= isp_dec;
1231
                if (dhit) begin
1232
                        wrsel <= sel_o;
1233
                        wr <= 1'b1;
1234
                end
1235 10 robfinch
                else if (write_allocate) begin
1236
                        state <= WAIT_DHIT;
1237
                        dmiss <= `TRUE;
1238
                end
1239 5 robfinch
        end
1240
IRQ2:
1241
        begin
1242
                cyc_o <= 1'b1;
1243
                stb_o <= 1'b1;
1244
                we_o <= 1'b1;
1245
                sel_o <= 4'hF;
1246
                radr <= isp_dec;
1247
                wadr <= isp_dec;
1248
                wdat <= sr;
1249
                adr_o <= {isp_dec,2'b00};
1250
                dat_o <= sr;
1251
                state <= IRQ3;
1252
        end
1253
IRQ3:
1254
        if (ack_i) begin
1255 21 robfinch
                load_what <= `PC_310;
1256
                state <= LOAD_MAC1;
1257
                retstate <= LOAD_MAC1;
1258 5 robfinch
                cyc_o <= 1'b0;
1259
                stb_o <= 1'b0;
1260
                we_o <= 1'b0;
1261
                sel_o <= 4'h0;
1262
                isp <= isp_dec;
1263
                if (dhit) begin
1264
                        wrsel <= sel_o;
1265
                        wr <= 1'b1;
1266
                end
1267 10 robfinch
                else if (write_allocate) begin
1268
                        dmiss <= `TRUE;
1269
                        state <= WAIT_DHIT;
1270
                end
1271 5 robfinch
                radr <= vect[31:2];
1272
                if (!bf)
1273
                        im <= 1'b1;
1274
                em <= 1'b0;                     // make sure we process in native mode; we might have been called up during emulation mode
1275
        end
1276 21 robfinch
 
1277 12 robfinch
MULDIV1:
1278
        state <= MULDIV2;
1279
MULDIV2:
1280
        if (md_done) begin
1281
                state <= IFETCH;
1282
                case(ir[23:20])
1283
                `MUL_RR:        begin res <= prod[31:0]; end
1284
                `MULS_RR:       begin res <= prod[31:0]; end
1285
                `DIV_RR:        begin res <= q; end
1286
                `DIVS_RR:       begin res <= q; end
1287
                `MOD_RR:        begin res <= r; end
1288
                `MODS_RR:       begin res <= r; end
1289
                endcase
1290
        end
1291
 
1292 21 robfinch
BUS_ERROR:
1293
        begin
1294
                radr <= isp_dec;
1295
                wadr <= isp_dec;
1296
                wdat <= pc;
1297
                cyc_o <= 1'b1;
1298
                stb_o <= 1'b1;
1299
                we_o <= 1'b1;
1300
                sel_o <= 4'hF;
1301
                adr_o <= {isp_dec,2'b00};
1302
                dat_o <= pc;
1303
                vect <= {vbr[31:9],9'd508,2'b00};
1304
                state <= IRQ1;
1305
        end
1306
INSN_BUS_ERROR:
1307
        begin
1308
                radr <= isp_dec;
1309
                wadr <= isp_dec;
1310
                wdat <= pc;
1311
                cyc_o <= 1'b1;
1312
                stb_o <= 1'b1;
1313
                we_o <= 1'b1;
1314
                sel_o <= 4'hF;
1315
                adr_o <= {isp_dec,2'b00};
1316
                dat_o <= pc;
1317
                vect <= {vbr[31:9],9'd509,2'b00};
1318
                state <= IRQ1;
1319
        end
1320
 
1321 5 robfinch
endcase
1322
 
1323
`include "cache_controller.v"
1324
 
1325
end
1326
endmodule

powered by: WebSVN 2.1.0

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