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

Subversion Repositories rtf65002

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

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 10 robfinch
`timescale 1ns / 1ps
2
// ============================================================================
3
//        __
4 38 robfinch
//   \\__/ o\    (C) 2013, 2014  Robert Finch, Stratford
5 10 robfinch
//    \  __ /    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 30 robfinch
`include "rtf65002_defines.v"
28 5 robfinch
 
29 35 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, rty_i, err_i, we_o, sel_o, adr_o, dat_i, dat_o, km_o);
30 30 robfinch
parameter RESET1 = 6'd0;
31
parameter IFETCH = 6'd1;
32
parameter DECODE = 6'd2;
33
parameter STORE1 = 6'd3;
34
parameter STORE2 = 6'd4;
35 32 robfinch
parameter CALC = 6'd5;
36
parameter JSR161 = 6'd6;
37
parameter RTS1 = 6'd7;
38
parameter IY3 = 6'd8;
39
parameter BSR1 = 6'd9;
40
parameter BYTE_IX5 = 6'd10;
41
parameter BYTE_IY5 = 6'd11;
42
parameter WAIT_DHIT = 6'd12;
43
parameter RESET2 = 6'd13;
44
parameter MULDIV1 = 6'd14;
45
parameter MULDIV2 = 6'd15;
46
parameter BYTE_DECODE = 6'd16;
47
parameter BYTE_CALC = 6'd17;
48
parameter BUS_ERROR = 6'd18;
49 35 robfinch
parameter LOAD_MAC1 = 6'd19;
50
parameter LOAD_MAC2 = 6'd20;
51
parameter LOAD_MAC3 = 6'd21;
52
parameter MVN3 = 6'd22;
53
parameter PUSHA1 = 6'd23;
54
parameter POPA1 = 6'd24;
55
parameter BYTE_IFETCH = 6'd25;
56
parameter LOAD_DCACHE = 6'd26;
57
parameter LOAD_ICACHE = 6'd27;
58
parameter LOAD_IBUF1 = 6'd28;
59
parameter LOAD_IBUF2 = 6'd29;
60
parameter LOAD_IBUF3 = 6'd30;
61
parameter ICACHE1 = 6'd31;
62
parameter IBUF1 = 6'd32;
63
parameter DCACHE1 = 6'd33;
64
parameter CMPS1 = 6'd34;
65 38 robfinch
parameter HALF_CALC = 6'd35;
66
parameter MVN816 = 6'd36;
67 5 robfinch
 
68 38 robfinch
parameter SPIN_CYCLES = 8'd30;
69
 
70 21 robfinch
input rst_md;           // reset mode, 1=emulation mode, 0=native mode
71 5 robfinch
input rst_i;
72
input clk_i;
73
input nmi_i;
74
input irq_i;
75 13 robfinch
input [8:0] irq_vect;
76 5 robfinch
output reg [1:0] bte_o;
77
output reg [2:0] cti_o;
78
output reg [5:0] bl_o;
79
output reg lock_o;
80
output reg cyc_o;
81
output reg stb_o;
82
input ack_i;
83 35 robfinch
input rty_i;
84 21 robfinch
input err_i;
85 5 robfinch
output reg we_o;
86
output reg [3:0] sel_o;
87
output reg [33:0] adr_o;
88
input [31:0] dat_i;
89
output reg [31:0] dat_o;
90
 
91 32 robfinch
output km_o;
92
 
93 30 robfinch
reg [5:0] state;
94
reg [5:0] retstate;
95 21 robfinch
wire [63:0] insn;
96
reg [63:0] ibuf;
97 5 robfinch
reg [31:0] bufadr;
98 25 robfinch
reg [63:0] exbuf;
99 5 robfinch
 
100 35 robfinch
integer n;
101 5 robfinch
reg cf,nf,zf,vf,bf,im,df,em;
102 32 robfinch
reg tf;         // trace mode flag
103
reg ttrig;      // trace trigger
104 5 robfinch
reg em1;
105 32 robfinch
reg gie;        // global interrupt enable (set when sp is loaded)
106 25 robfinch
reg hwi;        // hardware interrupt indicator
107 5 robfinch
reg nmoi;       // native mode on interrupt
108 38 robfinch
wire [31:0] sr = {nf,vf,em,tf,17'b0,m816,m_bit,x_bit,3'b0,bf,df,im,zf,cf};
109
reg m_bit;      // acc/mem is 16 bit
110
reg x_bit;      // index regs are 16 bit
111
reg m816;       // 816 mode
112
wire m16 = m816 & ~m_bit;
113
wire xb16 = m816 & ~x_bit;
114
wire [7:0] sr8 = m816 ? {nf,vf,m_bit,x_bit,df,im,zf,cf} : {nf,vf,1'b0,bf,df,im,zf,cf};
115 5 robfinch
reg nmi1,nmi_edge;
116
reg wai;
117 38 robfinch
reg spi;                // spinlock interrupt
118
reg [7:0] spi_cnt;
119 36 robfinch
reg wrrf;               // write register file
120 5 robfinch
reg [31:0] acc;
121
reg [31:0] x;
122
reg [31:0] y;
123 38 robfinch
reg [15:0] sp;
124
reg [15:0] dpr;          // direct page register
125
reg [7:0] dbr;           // data bank register
126 13 robfinch
reg [31:0] spage;        // stack page
127 5 robfinch
wire [7:0] acc8 = acc[7:0];
128
wire [7:0] x8 = x[7:0];
129
wire [7:0] y8 = y[7:0];
130 38 robfinch
wire [15:0] acc16 = acc[15:0];
131
wire [15:0] x16 = x[15:0];
132
wire [15:0] y16 = y[15:0];
133
wire [31:0] x_dec = x - 32'd1;
134
wire [31:0] x_inc = x + 32'd1;
135
wire [31:0] y_dec = y - 32'd1;
136
wire [31:0] y_inc = y + 32'd1;
137
wire [31:0] acc_dec = acc - 32'd1;
138
wire [31:0] acc_inc = acc + 32'd1;
139 5 robfinch
reg [31:0] isp;          // interrupt stack pointer
140 35 robfinch
reg [31:0] oisp; // original isp for bus retry
141 12 robfinch
wire [63:0] prod;
142 38 robfinch
reg [15:0] tmp16;
143 12 robfinch
wire [31:0] q,r;
144
reg [31:0] tick;
145 38 robfinch
wire [15:0] sp_dec = sp - 16'd1;
146
wire [15:0] sp_inc = sp + 16'd1;
147
wire [15:0] sp_dec2 = sp - 16'd2;
148 5 robfinch
wire [31:0] isp_dec = isp - 32'd1;
149
wire [31:0] isp_inc = isp + 32'd1;
150 25 robfinch
reg [3:0] suppress_pcinc;
151 5 robfinch
reg [31:0] pc;
152 23 robfinch
reg [31:0] opc;
153 35 robfinch
wire [3:0] pc_inc;
154 38 robfinch
reg [3:0] pc_inc2;
155 35 robfinch
wire [3:0] pc_inc8;
156 30 robfinch
wire [31:0] pcp2 = pc + (32'd2 & suppress_pcinc);        // for branches
157
wire [31:0] pcp4 = pc + (32'd4 & suppress_pcinc);        // for branches
158
wire [31:0] pcp8 = pc + 32'd8;                                           // cache controller needs this
159 13 robfinch
reg [31:0] abs8; // 8 bit mode absolute address register
160
reg [31:0] vbr;          // vector table base register
161 5 robfinch
wire bhit=pc==bufadr;
162 35 robfinch
reg [2:0] bcnt;          // burst count for cache controller
163 5 robfinch
reg [31:0] regfile [15:0];
164 21 robfinch
reg [63:0] ir;
165 32 robfinch
reg pg2;
166
wire [8:0] ir9 = {pg2,ir[7:0]};
167 5 robfinch
wire [3:0] Ra = ir[11:8];
168
wire [3:0] Rb = ir[15:12];
169
reg [31:0] rfoa;
170
reg [31:0] rfob;
171
always @(Ra or x or y or acc)
172
case(Ra)
173
4'h0:   rfoa <= 32'd0;
174
4'h1:   rfoa <= acc;
175
4'h2:   rfoa <= x;
176
4'h3:   rfoa <= y;
177
default:        rfoa <= regfile[Ra];
178
endcase
179
always @(Rb or x or y or acc)
180
case(Rb)
181
4'h0:   rfob <= 32'd0;
182
4'h1:   rfob <= acc;
183
4'h2:   rfob <= x;
184
4'h3:   rfob <= y;
185
default:        rfob <= regfile[Rb];
186
endcase
187
reg [3:0] Rt;
188
reg [33:0] ea;
189
reg first_ifetch;
190 38 robfinch
reg [5:0] ic_whence;
191 12 robfinch
reg [31:0] lfsr;
192
wire lfsr_fb;
193
xnor(lfsr_fb,lfsr[0],lfsr[1],lfsr[21],lfsr[31]);
194 5 robfinch
reg [31:0] a, b;
195 32 robfinch
wire signed [31:0] as = a;
196
wire signed [31:0] bs = b;
197
wire lt = as < bs;
198
wire eq = a==b;
199
wire ltu = a < b;
200
 
201 5 robfinch
reg [7:0] b8;
202 38 robfinch
reg [15:0] b16;
203 32 robfinch
wire [32:0] alu_out;
204 5 robfinch
reg [32:0] res;
205 38 robfinch
reg [16:0] res16;
206 5 robfinch
reg [8:0] res8;
207 38 robfinch
wire resv8,resv16,resv32;
208 5 robfinch
wire resc8 = res8[8];
209 38 robfinch
wire resc16 = res16[16];
210 5 robfinch
wire resc32 = res[32];
211 38 robfinch
wire resz8 = ~|res8[7:0];
212
wire resz16 = ~|res16[15:0];
213
wire resz32 = ~|res[31:0];
214 5 robfinch
wire resn8 = res8[7];
215 38 robfinch
wire resn16 = res16[15];
216 5 robfinch
wire resn32 = res[31];
217
 
218 35 robfinch
reg [33:0] vect;
219 5 robfinch
reg [31:0] ia;                   // temporary reg to hold indirect address
220
reg isInsnCacheLoad;
221
reg isDataCacheLoad;
222 10 robfinch
reg isCacheReset;
223 5 robfinch
wire hit0,hit1;
224 30 robfinch
`ifdef SUPPORT_DCACHE
225 5 robfinch
wire dhit;
226 30 robfinch
`else
227
wire dhit = 1'b0;
228
`endif
229 10 robfinch
reg write_allocate;
230 32 robfinch
wire wr;
231 5 robfinch
reg [3:0] wrsel;
232
reg [31:0] radr;
233
reg [1:0] radr2LSB;
234
wire [33:0] radr34 = {radr,radr2LSB};
235
wire [33:0] radr34p1 = radr34 + 34'd1;
236
reg [31:0] wadr;
237
reg [1:0] wadr2LSB;
238
reg [31:0] wdat;
239
wire [31:0] rdat;
240 32 robfinch
reg [4:0] load_what;
241
reg [5:0] store_what;
242 35 robfinch
reg [8:0] intno;                 // interrupt number to take
243 23 robfinch
reg [31:0] derr_address;
244 5 robfinch
reg imiss;
245
reg dmiss;
246
reg icacheOn,dcacheOn;
247 30 robfinch
`ifdef SUPPORT_DCACHE
248 20 robfinch
wire unCachedData = radr[31:20]==12'hFFD || !dcacheOn;  // I/O area is uncached
249 30 robfinch
`else
250
wire unCachedData = 1'b1;
251
`endif
252
`ifdef SUPPORT_ICACHE
253 20 robfinch
wire unCachedInsn = pc[31:13]==19'h0 || !icacheOn;              // The lowest 8kB is uncached.
254 30 robfinch
`else
255
wire unCachedInsn = 1'b1;
256
`endif
257 32 robfinch
`ifdef ICACHE_2WAY
258
reg [31:0] clfsr;
259
wire clfsr_fb;
260
xnor(clfsr_fb,clfsr[0],clfsr[1],clfsr[21],clfsr[31]);
261
wire [1:0] whichrd;
262
wire whichwr=clfsr[0];
263
`endif
264 35 robfinch
reg [31:0] ilfsr;
265
wire ilfsr_fb;
266
xnor(ilfsr_fb,ilfsr[0],ilfsr[1],ilfsr[21],ilfsr[31]);
267 32 robfinch
reg km;                 // kernel mode indicator
268
assign km_o = km;
269 5 robfinch
 
270 35 robfinch
`ifdef DEBUG
271 32 robfinch
reg [31:0] history_buf [127:0];
272
reg [6:0] history_ndx;
273 30 robfinch
reg hist_capture;
274 35 robfinch
`endif
275 30 robfinch
 
276 32 robfinch
reg isBusErr;
277 30 robfinch
reg isBrk,isMove,isSts;
278 38 robfinch
reg isMove816;
279 30 robfinch
reg isRTI,isRTL,isRTS;
280
reg isOrb,isStb;
281
reg isRMW;
282
reg isSub,isSub8;
283 32 robfinch
reg isJsrIndx,isJsrInd;
284
reg ldMuldiv;
285
reg isPusha,isPopa;
286 30 robfinch
 
287 32 robfinch
wire isCmp = ir9==`CPX_ZPX || ir9==`CPX_ABS || ir9==`CPX_IMM32 ||
288
                         ir9==`CPY_ZPX || ir9==`CPY_ABS || ir9==`CPY_IMM32;
289 5 robfinch
wire isRMW32 =
290 32 robfinch
                         ir9==`ASL_ZPX || ir9==`ROL_ZPX || ir9==`LSR_ZPX || ir9==`ROR_ZPX || ir9==`INC_ZPX || ir9==`DEC_ZPX ||
291
                         ir9==`ASL_ABS || ir9==`ROL_ABS || ir9==`LSR_ABS || ir9==`ROR_ABS || ir9==`INC_ABS || ir9==`DEC_ABS ||
292
                         ir9==`ASL_ABSX || ir9==`ROL_ABSX || ir9==`LSR_ABSX || ir9==`ROR_ABSX || ir9==`INC_ABSX || ir9==`DEC_ABSX ||
293
                         ir9==`TRB_ZP || ir9==`TRB_ZPX || ir9==`TRB_ABS || ir9==`TSB_ZP || ir9==`TSB_ZPX || ir9==`TSB_ABS ||
294
                         ir9==`BMS_ZPX || ir9==`BMS_ABS || ir9==`BMS_ABSX ||
295
                         ir9==`BMC_ZPX || ir9==`BMC_ABS || ir9==`BMC_ABSX ||
296
                         ir9==`BMF_ZPX || ir9==`BMF_ABS || ir9==`BMF_ABSX
297 5 robfinch
                         ;
298
wire isRMW8 =
299 32 robfinch
                         ir9==`ASL_ZP || ir9==`ROL_ZP || ir9==`LSR_ZP || ir9==`ROR_ZP || ir9==`INC_ZP || ir9==`DEC_ZP ||
300
                         ir9==`ASL_ZPX || ir9==`ROL_ZPX || ir9==`LSR_ZPX || ir9==`ROR_ZPX || ir9==`INC_ZPX || ir9==`DEC_ZPX ||
301
                         ir9==`ASL_ABS || ir9==`ROL_ABS || ir9==`LSR_ABS || ir9==`ROR_ABS || ir9==`INC_ABS || ir9==`DEC_ABS ||
302
                         ir9==`ASL_ABSX || ir9==`ROL_ABSX || ir9==`LSR_ABSX || ir9==`ROR_ABSX || ir9==`INC_ABSX || ir9==`DEC_ABSX ||
303
                         ir9==`TRB_ZP || ir9==`TRB_ZPX || ir9==`TRB_ABS || ir9==`TSB_ZP || ir9==`TSB_ZPX || ir9==`TSB_ABS;
304 5 robfinch
                         ;
305 30 robfinch
 
306
// Registerable decodes
307
// The following decodes can be registered because they aren't needed until at least the cycle after
308
// the DECODE stage.
309
 
310
always @(posedge clk)
311 32 robfinch
        if (state==DECODE||state==BYTE_DECODE) begin
312
                isSub <= ir9==`SUB_ZPX || ir9==`SUB_IX || ir9==`SUB_IY ||
313
                         ir9==`SUB_ABS || ir9==`SUB_ABSX || ir9==`SUB_IMM8 || ir9==`SUB_IMM16 || ir9==`SUB_IMM32;
314
                isSub8 <= ir9==`SBC_ZP || ir9==`SBC_ZPX || ir9==`SBC_IX || ir9==`SBC_IY || ir9==`SBC_I ||
315
                         ir9==`SBC_ABS || ir9==`SBC_ABSX || ir9==`SBC_ABSY || ir9==`SBC_IMM;
316 30 robfinch
                isRMW <= em ? isRMW8 : isRMW32;
317 32 robfinch
                isOrb <= ir9==`ORB_ZPX || ir9==`ORB_IX || ir9==`ORB_IY || ir9==`ORB_ABS || ir9==`ORB_ABSX;
318
                isStb <= ir9==`STB_ZPX || ir9==`STB_ABS || ir9==`STB_ABSX;
319
                isRTI <= ir9==`RTI;
320
                isRTL <= ir9==`RTL;
321
                isRTS <= ir9==`RTS;
322
                isBrk <= ir9==`BRK;
323
                isMove <= ir9==`MVP || ir9==`MVN;
324
                isSts <= ir9==`STS;
325
                isJsrIndx <= ir9==`JSR_INDX;
326
                isJsrInd <= ir9==`JSR_IND;
327 35 robfinch
                ldMuldiv <= ir9==`MUL_IMM8 || ir9==`MUL_IMM16 || ir9==`MUL_IMM32 ||
328
                        ir9==`DIV_IMM8 || ir9==`MOD_IMM8 || ir9==`DIV_IMM16 || ir9==`DIV_IMM32 || ir9==`MOD_IMM16 || ir9==`MOD_IMM32 ||
329
                        (ir9==`RR && (
330 32 robfinch
                        ir[23:20]==`MUL_RR || ir[23:20]==`MULS_RR || ir[23:20]==`DIV_RR || ir[23:20]==`DIVS_RR || ir[23:20]==`MOD_RR || ir[23:20]==`MODS_RR));
331
                isPusha <= ir9==`PUSHA;
332
                isPopa <= ir9==`POPA;
333 30 robfinch
        end
334 32 robfinch
        else
335
                ldMuldiv <= 1'b0;
336 30 robfinch
 
337
`ifdef SUPPORT_EXEC
338 32 robfinch
wire isExec = ir9==`EXEC;
339
wire isAtni = ir9==`ATNI;
340 30 robfinch
`else
341
wire isExec = 1'b0;
342
wire isAtni = 1'b0;
343
`endif
344 12 robfinch
wire md_done;
345
wire clk;
346 21 robfinch
reg isIY;
347 38 robfinch
reg isIY24;
348
reg isI24;
349 12 robfinch
 
350 30 robfinch
rtf65002_pcinc upci1
351
(
352 32 robfinch
        .opcode(ir9),
353 30 robfinch
        .suppress_pcinc(suppress_pcinc),
354
        .inc(pc_inc)
355
);
356
 
357 32 robfinch
rtf65002_pcinc8 upci2
358
(
359
        .opcode(ir[7:0]),
360
        .suppress_pcinc(suppress_pcinc),
361 38 robfinch
        .inc(pc_inc8),
362
        .m16(m16),
363
        .xb16(xb16)
364 32 robfinch
);
365 35 robfinch
 
366 12 robfinch
mult_div umd1
367
(
368 30 robfinch
        .rst(rst_i),
369 12 robfinch
        .clk(clk),
370 32 robfinch
        .ld(ldMuldiv),
371
        .op(ir9),
372
        .fn(ir[23:20]),
373
        .a(a),
374
        .b(b),
375 12 robfinch
        .p(prod),
376
        .q(q),
377
        .r(r),
378
        .done(md_done)
379
);
380 30 robfinch
 
381 32 robfinch
`ifdef SUPPORT_ICACHE
382
`ifdef ICACHE_2WAY
383
rtf65002_icachemem2way icm0 (
384
        .whichrd(whichrd),
385
        .whichwr(whichwr),
386
        .wclk(clk),
387
        .wr(ack_i & isInsnCacheLoad),
388
        .adr(adr_o),
389
        .dat(dat_i),
390
        .rclk(~clk),
391
        .pc(pc),
392
        .insn(insn)
393
);
394
 
395
rtf65002_itagmem2way tgm0 (
396
        .whichrd(whichrd),
397
        .whichwr(isCacheReset ? adr_o[13]: whichwr),
398
        .wclk(clk),
399
        .wr((ack_i & isInsnCacheLoad)|isCacheReset),
400
        .adr({adr_o[31:1],!isCacheReset}),
401
        .rclk(~clk),
402
        .pc(pc),
403
        .hit0(hit0),
404
        .hit1(hit1)
405
);
406
`else
407
`ifdef ICACHE_4K
408
rtf65002_icachemem4k icm0 (
409
        .wclk(clk),
410
        .wr(ack_i & isInsnCacheLoad),
411
        .adr(adr_o),
412
        .dat(dat_i),
413
        .rclk(~clk),
414
        .pc(pc),
415
        .insn(insn)
416
);
417
 
418
rtf65002_itagmem4k tgm0 (
419
        .wclk(clk),
420
        .wr((ack_i & isInsnCacheLoad)|isCacheReset),
421 35 robfinch
        .adr({adr_o[33:1],!isCacheReset}),
422 32 robfinch
        .rclk(~clk),
423
        .pc(pc),
424
        .hit0(hit0),
425
        .hit1(hit1)
426
);
427
`endif
428
`ifdef ICACHE_8K
429
rtf65002_icachemem8k icm0 (
430
        .wclk(clk),
431
        .wr(ack_i & isInsnCacheLoad),
432
        .adr(adr_o),
433
        .dat(dat_i),
434
        .rclk(~clk),
435
        .pc(pc),
436
        .insn(insn)
437
);
438
 
439
rtf65002_itagmem8k tgm0 (
440
        .wclk(clk),
441
        .wr((ack_i & isInsnCacheLoad)|isCacheReset),
442 35 robfinch
        .adr({adr_o[33:1],!isCacheReset}),
443 32 robfinch
        .rclk(~clk),
444
        .pc(pc),
445
        .hit0(hit0),
446
        .hit1(hit1)
447
);
448
`endif
449
`ifdef ICACHE_16K
450 30 robfinch
rtf65002_icachemem icm0 (
451 12 robfinch
        .wclk(clk),
452 5 robfinch
        .wr(ack_i & isInsnCacheLoad),
453
        .adr(adr_o),
454
        .dat(dat_i),
455 30 robfinch
        .rclk(~clk),
456 5 robfinch
        .pc(pc),
457
        .insn(insn)
458
);
459
 
460 30 robfinch
rtf65002_itagmem tgm0 (
461 12 robfinch
        .wclk(clk),
462 10 robfinch
        .wr((ack_i & isInsnCacheLoad)|isCacheReset),
463
        .adr({adr_o[31:1],!isCacheReset}),
464 30 robfinch
        .rclk(~clk),
465 5 robfinch
        .pc(pc),
466
        .hit0(hit0),
467
        .hit1(hit1)
468
);
469 32 robfinch
`endif
470
`endif  // ICACHE_2WAY
471 5 robfinch
 
472
wire ihit = (hit0 & hit1);//(pc[2:0] > 3'd1 ? hit1 : 1'b1));
473 30 robfinch
`else
474
wire ihit = 1'b0;
475
`endif
476 5 robfinch
 
477 30 robfinch
`ifdef SUPPORT_DCACHE
478 32 robfinch
assign wr = state==STORE2 && dhit && ack_i;
479
 
480 30 robfinch
rtf65002_dcachemem dcm0 (
481 12 robfinch
        .wclk(clk),
482 5 robfinch
        .wr(wr | (ack_i & isDataCacheLoad)),
483 32 robfinch
        .sel(sel_o),
484
        .wadr(adr_o[33:2]),
485
        .wdat(wr ? dat_o : dat_i),
486 30 robfinch
        .rclk(~clk),
487 5 robfinch
        .radr(radr),
488
        .rdat(rdat)
489
);
490
 
491 30 robfinch
rtf65002_dtagmem dtm0 (
492 12 robfinch
        .wclk(clk),
493 32 robfinch
        .wr(wr | (ack_i & isDataCacheLoad) | isCacheReset),
494
        .wadr(adr_o[33:2]),
495
        .cr(!isCacheReset),
496 30 robfinch
        .rclk(~clk),
497 5 robfinch
        .radr(radr),
498
        .hit(dhit)
499
);
500 30 robfinch
`endif
501 5 robfinch
 
502
overflow uovr1 (
503
        .op(isSub),
504
        .a(a[31]),
505
        .b(b[31]),
506
        .s(res[31]),
507
        .v(resv32)
508
);
509
 
510
overflow uovr2 (
511
        .op(isSub8),
512
        .a(acc8[7]),
513
        .b(b8[7]),
514
        .s(res8[7]),
515
        .v(resv8)
516
);
517
 
518 38 robfinch
wire [15:0] bcaio;
519
wire [15:0] bcao;
520
wire [15:0] bcsio;
521
wire [15:0] bcso;
522 5 robfinch
wire bcaico,bcaco,bcsico,bcsco;
523 38 robfinch
wire bcaico8,bcaco8,bcsico8,bcsco8;
524 5 robfinch
 
525 30 robfinch
`ifdef SUPPORT_BCD
526 38 robfinch
BCDAdd4 ubcdai1 (.ci(cf),.a(acc16),.b(ir[23:8]),.o(bcaio),.c(bcaico),.c8(bcaico8));
527
BCDAdd4 ubcda2 (.ci(cf),.a(acc16),.b(b8),.o(bcao),.c(bcaco),.c8(bcaco8));
528
BCDSub4 ubcdsi1 (.ci(cf),.a(acc16),.b(ir[23:8]),.o(bcsio),.c(bcsico),.c8(bcsico8));
529
BCDSub4 ubcds2 (.ci(cf),.a(acc16),.b(b8),.o(bcso),.c(bcsco),.c8(bcsco8));
530 30 robfinch
`endif
531 5 robfinch
 
532
reg [7:0] dati;
533
always @(radr2LSB or dat_i)
534
case(radr2LSB)
535
2'd0:   dati <= dat_i[7:0];
536
2'd1:   dati <= dat_i[15:8];
537
2'd2:   dati <= dat_i[23:16];
538
2'd3:   dati <= dat_i[31:24];
539
endcase
540 35 robfinch
`ifdef SUPPORT_DCACHE
541 5 robfinch
reg [7:0] rdat8;
542
always @(radr2LSB or rdat)
543
case(radr2LSB)
544
2'd0:   rdat8 <= rdat[7:0];
545
2'd1:   rdat8 <= rdat[15:8];
546
2'd2:   rdat8 <= rdat[23:16];
547
2'd3:   rdat8 <= rdat[31:24];
548
endcase
549 35 robfinch
`endif
550 5 robfinch
 
551 32 robfinch
// Evaluate branches
552
// 
553 5 robfinch
reg takb;
554 32 robfinch
always @(ir9 or cf or vf or nf or zf)
555
case(ir9)
556 5 robfinch
`BEQ:   takb <= zf;
557
`BNE:   takb <= !zf;
558
`BPL:   takb <= !nf;
559
`BMI:   takb <= nf;
560
`BCS:   takb <= cf;
561
`BCC:   takb <= !cf;
562
`BVS:   takb <= vf;
563
`BVC:   takb <= !vf;
564
`BRA:   takb <= 1'b1;
565
`BRL:   takb <= 1'b1;
566 30 robfinch
`BHI:   takb <= cf & !zf;
567
`BLS:   takb <= !cf | zf;
568
`BGE:   takb <= (nf & vf)|(!nf & !vf);
569
`BLT:   takb <= (nf & !vf)|(!nf & vf);
570
`BGT:   takb <= (nf & vf & !zf) + (!nf & !vf & !zf);
571
`BLE:   takb <= zf | (nf & !vf)|(!nf & vf);
572 5 robfinch
default:        takb <= 1'b0;
573
endcase
574
 
575 38 robfinch
wire [31:0] mvnsrc_address       = {abs8[31:24],ir[23:16],x16};
576
wire [31:0] mvndst_address       = {abs8[31:24],ir[15: 8],y16};
577
wire [31:0] iapy8                        = ia + y16;             // Don't add in abs8, already included with ia
578
wire [31:0] zp_address           = {abs8[31:16],8'h00,ir[15:8]} + dpr;
579
wire [31:0] zpx_address  = {abs8[31:16],{8'h00,ir[15:8]} + x16} + dpr;
580
wire [31:0] zpy_address          = {abs8[31:16],{8'h00,ir[15:8]} + y16} + dpr;
581
wire [31:0] abs_address  = {abs8[31:24],dbr,ir[23:8]};
582
wire [31:0] absx_address         = {abs8[31:24],dbr,ir[23:8] + x16};     // simulates 64k bank wrap-around
583
wire [31:0] absy_address         = {abs8[31:24],dbr,ir[23:8] + y16};
584
wire [31:0] al_address           = {abs8[31:24],ir[31:8]};
585
wire [31:0] alx_address          = {abs8[31:24],ir[31:8] + x16};
586 30 robfinch
wire [31:0] zpx32xy_address      = ir[23:12] + rfoa;
587
wire [31:0] absx32xy_address     = ir[47:16] + rfob;
588
wire [31:0] zpx32_address                = ir[31:20] + rfob;
589
wire [31:0] absx32_address               = ir[55:24] + rfob;
590 5 robfinch
 
591 38 robfinch
wire [31:0] dsp_address = m816 ? {abs8[31:24],8'h00,sp + ir[15:8]} : {abs8[31:16],8'h01,sp[7:0]+ir[15:8]};
592
 
593 32 robfinch
rtf65002_alu ualu1
594
(
595
        .clk(clk),
596
        .state(state),
597
        .resin(res),
598
        .pg2(pg2),
599
        .ir(ir),
600
        .acc(acc),
601
        .x(x),
602
        .y(y),
603
        .isp(isp),
604
        .rfoa(rfoa),
605
        .rfob(rfob),
606
        .a(a),
607
        .b(b),
608
        .b8(b8),
609
        .Rt(Rt),
610
        .icacheOn(icacheOn),
611
        .dcacheOn(dcacheOn),
612
        .write_allocate(write_allocate),
613
        .prod(prod),
614
        .tick(tick),
615
        .lfsr(lfsr),
616
        .abs8(abs8),
617
        .vbr(vbr),
618
        .nmoi(nmoi),
619
        .derr_address(derr_address),
620
        .history_buf(history_buf[history_ndx]),
621
        .spage(spage),
622
        .sp(sp),
623
        .df(df),
624
        .cf(cf),
625
        .res(alu_out)
626
);
627 30 robfinch
 
628
 
629 5 robfinch
//-----------------------------------------------------------------------------
630
// Clock control
631
// - reset or NMI reenables the clock
632
// - this circuit must be under the clk_i domain
633
//-----------------------------------------------------------------------------
634
//
635
reg cpu_clk_en;
636
reg clk_en;
637
BUFGCE u20 (.CE(cpu_clk_en), .I(clk_i), .O(clk) );
638
 
639
always @(posedge clk_i)
640
if (rst_i) begin
641
        cpu_clk_en <= 1'b1;
642
        nmi1 <= 1'b0;
643
end
644
else begin
645
        nmi1 <= nmi_i;
646
        if (nmi_i)
647
                cpu_clk_en <= 1'b1;
648
        else
649
                cpu_clk_en <= clk_en;
650
end
651
 
652
always @(posedge clk)
653
if (rst_i) begin
654
        bte_o <= 2'b00;
655
        cti_o <= 3'b000;
656
        bl_o <= 6'd0;
657
        cyc_o <= 1'b0;
658
        stb_o <= 1'b0;
659
        we_o <= 1'b0;
660
        sel_o <= 4'h0;
661
        adr_o <= 34'd0;
662
        dat_o <= 32'd0;
663
        nmi_edge <= 1'b0;
664
        wai <= 1'b0;
665 38 robfinch
        spi <= 1'b0;
666
        spi_cnt <= SPIN_CYCLES;
667 5 robfinch
        cf <= 1'b0;
668 30 robfinch
        ir <= 64'hEAEAEAEAEAEAEAEA;
669 5 robfinch
        imiss <= `FALSE;
670
        dmiss <= `FALSE;
671
        dcacheOn <= 1'b0;
672
        icacheOn <= 1'b1;
673 10 robfinch
        write_allocate <= 1'b0;
674 5 robfinch
        nmoi <= 1'b1;
675 10 robfinch
        state <= RESET1;
676 38 robfinch
        m816 <= 1'b0;
677
        m_bit <= 1'b1;
678
        x_bit <= 1'b1;
679 21 robfinch
        if (rst_md) begin
680
                pc <= 32'h0000FFF0;             // set high-order pc to zero
681
                vect <= `BYTE_RST_VECT;
682
                em <= 1'b1;
683
        end
684
        else begin
685
                vect <= `RST_VECT;
686
                em <= 1'b0;
687
                pc <= 32'hFFFFFFF0;
688
        end
689 25 robfinch
        suppress_pcinc <= 4'hF;
690
        exbuf <= 64'd0;
691 38 robfinch
        dbr <= 8'h00;
692
        dpr <= 16'h0000;
693 13 robfinch
        spage <= 32'h00000100;
694 5 robfinch
        bufadr <= 32'd0;
695 13 robfinch
        abs8 <= 32'd0;
696 5 robfinch
        clk_en <= 1'b1;
697 10 robfinch
        isCacheReset <= `TRUE;
698
        gie <= 1'b0;
699 12 robfinch
        tick <= 32'd0;
700 21 robfinch
        isIY <= 1'b0;
701 38 robfinch
        isIY24 <= 1'b0;
702
        isI24 <= `FALSE;
703 30 robfinch
        load_what <= `NOTHING;
704 35 robfinch
`ifdef DEBUG
705 30 robfinch
        hist_capture <= `TRUE;
706
        history_ndx <= 6'd0;
707 35 robfinch
`endif
708 32 robfinch
        pg2 <= `FALSE;
709
        tf <= `FALSE;
710
        km <= `TRUE;
711 36 robfinch
        wrrf <= 1'b0;
712 5 robfinch
end
713
else begin
714 36 robfinch
wrrf <= 1'b0;
715 12 robfinch
tick <= tick + 32'd1;
716 35 robfinch
ilfsr <= {ilfsr,ilfsr_fb};
717 5 robfinch
if (nmi_i & !nmi1)
718
        nmi_edge <= 1'b1;
719
if (nmi_i|nmi1)
720
        clk_en <= 1'b1;
721
case(state)
722 32 robfinch
// Loop in this state until all the cache address tage have been flagged as
723
// invalid.
724
//
725 10 robfinch
RESET1:
726 5 robfinch
        begin
727 10 robfinch
                adr_o <= adr_o + 32'd4;
728
                if (adr_o[13:4]==10'h3FF) begin
729
                        state <= RESET2;
730
                        isCacheReset <= `FALSE;
731
                end
732
        end
733
RESET2:
734
        begin
735 5 robfinch
                radr <= vect[31:2];
736 21 robfinch
                radr2LSB <= vect[1:0];
737
                load_what <= em ? `PC_70 : `PC_310;
738
                state <= LOAD_MAC1;
739 5 robfinch
        end
740
 
741 20 robfinch
`include "ifetch.v"
742 30 robfinch
`ifdef SUPPORT_EM8
743 32 robfinch
`include "byte_ifetch.v"
744 20 robfinch
`include "byte_decode.v"
745 30 robfinch
`include "byte_calc.v"
746 38 robfinch
`ifdef SUPPORT_816
747
`include "half_calc.v"
748 30 robfinch
`endif
749 38 robfinch
`endif
750 10 robfinch
 
751 21 robfinch
`include "load_mac.v"
752 20 robfinch
`include "store.v"
753 10 robfinch
 
754 32 robfinch
// This state waits for a data hit before continuing. It's used after a store 
755
// operation when write allocation is taking place.
756 10 robfinch
WAIT_DHIT:
757
        if (dhit)
758
                state <= retstate;
759 5 robfinch
 
760 32 robfinch
DECODE: decode_tsk();
761
CALC:   calc_tsk();
762 5 robfinch
 
763 32 robfinch
MULDIV1:        state <= MULDIV2;
764
MULDIV2:
765
        if (md_done) begin
766 10 robfinch
                state <= IFETCH;
767 32 robfinch
                case(ir9)
768
                `RR:
769
                        case(ir[23:20])
770
                        `MUL_RR:        begin res <= prod[31:0]; end
771
                        `MULS_RR:       begin res <= prod[31:0]; end
772
`ifdef SUPPORT_DIVMOD
773
                        `DIV_RR:        begin res <= q; end
774
                        `DIVS_RR:       begin res <= q; end
775
                        `MOD_RR:        begin res <= r; end
776
                        `MODS_RR:       begin res <= r; end
777 30 robfinch
`endif
778 32 robfinch
                        endcase
779
                `MUL_IMM8,`MUL_IMM16,`MUL_IMM32:        res <= prod[31:0];
780
`ifdef SUPPORT_DIVMOD
781
                `DIV_IMM8,`DIV_IMM16,`DIV_IMM32:        res <= q;
782
                `MOD_IMM8,`MOD_IMM16,`MOD_IMM32:        res <= r;
783 30 robfinch
`endif
784 12 robfinch
                endcase
785
        end
786
 
787 30 robfinch
`ifdef SUPPORT_BERR
788 21 robfinch
BUS_ERROR:
789
        begin
790 32 robfinch
                pg2 <= `FALSE;
791
                ir <= {8{`BRK}};
792 35 robfinch
`ifdef DEBUG
793 32 robfinch
                hist_capture <= `FALSE;
794 35 robfinch
`endif
795 21 robfinch
                radr <= isp_dec;
796
                wadr <= isp_dec;
797 32 robfinch
                isp <= isp_dec;
798
                store_what <= `STW_OPC;
799 35 robfinch
                vect <= {vbr[31:9],intno,2'b00};
800 25 robfinch
                hwi <= `TRUE;
801 32 robfinch
                isBusErr <= `TRUE;
802 38 robfinch
                next_state(STORE1);
803 21 robfinch
        end
804 30 robfinch
`endif
805
 
806 32 robfinch
`include "rtf65002_string.v"
807 5 robfinch
`include "cache_controller.v"
808
 
809 32 robfinch
endcase
810 36 robfinch
 
811
if (wrrf || state==IFETCH || state==LOAD_MAC3) begin
812
        regfile[Rt] <= res[31:0];
813
        case(Rt)
814
        4'h1:   acc <= res[31:0];
815
        4'h2:   x <= res[31:0];
816
        4'h3:   y <= res[31:0];
817
        default:        ;
818
        endcase
819 5 robfinch
end
820 36 robfinch
 
821
end
822
 
823
 
824 32 robfinch
`include "decode.v"
825
`include "calc.v"
826
`include "load_tsk.v"
827 35 robfinch
`include "wb_task.v"
828 38 robfinch
`include "misc_task.v"
829 32 robfinch
 
830 35 robfinch
task next_state;
831
input [5:0] nxt;
832
begin
833
        state <= nxt;
834
end
835
endtask
836
 
837 36 robfinch
function [127:0] fnStateName;
838
input [5:0] state;
839
case(state)
840
RESET1: fnStateName = "RESET1     ";
841
RESET2: fnStateName = "RESET2     ";
842
IFETCH: fnStateName = "IFETCH     ";
843
DECODE: fnStateName = "DECODE     ";
844
STORE1: fnStateName = "STORE1     ";
845
STORE2: fnStateName = "STORE2     ";
846
CALC:   fnStateName = "CALC       ";
847
RTS1:   fnStateName = "RTS1       ";
848
IY3:    fnStateName = "IY3        ";
849
BYTE_IX5:       fnStateName = "BYTE_IX5   ";
850
BYTE_IY5:       fnStateName = "BYTE_IY5   ";
851
WAIT_DHIT:      fnStateName = "WAIT_DHIT  ";
852
MULDIV1:        fnStateName = "MULDIV1    ";
853
MULDIV2:        fnStateName = "MULDIV2    ";
854
BYTE_DECODE:    fnStateName = "BYTE_DECODE";
855
BYTE_CALC:      fnStateName = "BYTE_CALC  ";
856
BUS_ERROR:      fnStateName = "BUS_ERROR  ";
857
LOAD_MAC1:      fnStateName = "LOAD_MAC1  ";
858
LOAD_MAC2:      fnStateName = "LOAD_MAC2  ";
859
LOAD_MAC3:      fnStateName = "LOAD_MAC3  ";
860
MVN3:           fnStateName = "MVN3       ";
861
PUSHA1:         fnStateName = "PUSHA1     ";
862
POPA1:          fnStateName = "POPA1      ";
863
BYTE_IFETCH:    fnStateName = "BYTE_IFETCH";
864
LOAD_DCACHE:    fnStateName = "LOAD_DCACHE";
865
LOAD_ICACHE:    fnStateName = "LOAD_ICACHE";
866
LOAD_IBUF1:             fnStateName = "LOAD_IBUF1 ";
867
LOAD_IBUF2:             fnStateName = "LOAD_IBUF2 ";
868
LOAD_IBUF3:             fnStateName = "LOAD_IBUF3 ";
869
ICACHE1:                fnStateName = "ICACHE1    ";
870
IBUF1:                  fnStateName = "IBUF1      ";
871
DCACHE1:                fnStateName = "DCACHE1    ";
872
CMPS1:                  fnStateName = "CMPS1      ";
873 38 robfinch
HALF_CALC:              fnStateName = "HALF_CALC  ";
874 36 robfinch
default:                fnStateName = "UNKNOWN    ";
875
endcase
876
endfunction
877
 
878 5 robfinch
endmodule

powered by: WebSVN 2.1.0

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