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

Subversion Repositories openrisc_me

[/] [openrisc/] [trunk/] [orpsocv2/] [rtl/] [verilog/] [or1200/] [or1200_cpu.v] - Blame information for rev 483

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 350 julius
//////////////////////////////////////////////////////////////////////
2
////                                                              ////
3
////  OR1200's CPU                                                ////
4
////                                                              ////
5
////  This file is part of the OpenRISC 1200 project              ////
6
////  http://www.opencores.org/project,or1k                       ////
7
////                                                              ////
8
////  Description                                                 ////
9
////  Instantiation of internal CPU blocks. IFETCH, SPRS, FRZ,    ////
10
////  ALU, EXCEPT, ID, WBMUX, OPERANDMUX, RF etc.                 ////
11
////                                                              ////
12
////  To Do:                                                      ////
13
////   - make it smaller and faster                               ////
14
////                                                              ////
15
////  Author(s):                                                  ////
16
////      - Damjan Lampret, lampret@opencores.org                 ////
17
////                                                              ////
18
//////////////////////////////////////////////////////////////////////
19
////                                                              ////
20
//// Copyright (C) 2000 Authors and OPENCORES.ORG                 ////
21
////                                                              ////
22
//// This source file may be used and distributed without         ////
23
//// restriction provided that this copyright statement is not    ////
24
//// removed from the file and that any derivative work contains  ////
25
//// the original copyright notice and the associated disclaimer. ////
26
////                                                              ////
27
//// This source file is free software; you can redistribute it   ////
28
//// and/or modify it under the terms of the GNU Lesser General   ////
29
//// Public License as published by the Free Software Foundation; ////
30
//// either version 2.1 of the License, or (at your option) any   ////
31
//// later version.                                               ////
32
////                                                              ////
33
//// This source is distributed in the hope that it will be       ////
34
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
35
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
36
//// PURPOSE.  See the GNU Lesser General Public License for more ////
37
//// details.                                                     ////
38
////                                                              ////
39
//// You should have received a copy of the GNU Lesser General    ////
40
//// Public License along with this source; if not, download it   ////
41
//// from http://www.opencores.org/lgpl.shtml                     ////
42
////                                                              ////
43
//////////////////////////////////////////////////////////////////////
44
//
45
// $Log: or1200_cpu.v,v $
46
// Revision 2.0  2010/06/30 11:00:00  ORSoC
47
// Major update: 
48
// Structure reordered and bugs fixed. 
49
 
50
// synopsys translate_off
51
`include "timescale.v"
52
// synopsys translate_on
53
`include "or1200_defines.v"
54
 
55
module or1200_cpu(
56
        // Clk & Rst
57
        clk, rst,
58
 
59
        // Insn interface
60
        ic_en,
61
        icpu_adr_o, icpu_cycstb_o, icpu_sel_o, icpu_tag_o,
62
        icpu_dat_i, icpu_ack_i, icpu_rty_i, icpu_err_i, icpu_adr_i, icpu_tag_i,
63
        immu_en,
64
 
65
        // Debug unit
66
        id_void, id_insn, ex_void,
67
        ex_insn, ex_freeze, wb_insn, wb_freeze, id_pc, ex_pc, wb_pc, branch_op,
68
        spr_dat_npc, rf_dataw, ex_flushpipe,
69
        du_stall, du_addr, du_dat_du, du_read, du_write, du_except_stop,
70
        du_except_trig, du_dsr, du_dmr1, du_hwbkpt, du_hwbkpt_ls_r, du_dat_cpu,
71
        du_lsu_store_dat, du_lsu_load_dat,
72
        abort_mvspr, abort_ex,
73
 
74
        // Data interface
75
        dc_en,
76
        dcpu_adr_o, dcpu_cycstb_o, dcpu_we_o, dcpu_sel_o, dcpu_tag_o,
77
        dcpu_dat_o, dcpu_dat_i, dcpu_ack_i, dcpu_rty_i, dcpu_err_i, dcpu_tag_i,
78
        sb_en, dmmu_en, dc_no_writethrough,
79
 
80
        // SR Interface
81
        boot_adr_sel_i,
82
 
83
        // Interrupt & tick exceptions
84
        sig_int, sig_tick,
85
 
86
        // SPR interface
87
        supv, spr_addr, spr_dat_cpu, spr_dat_pic, spr_dat_tt, spr_dat_pm,
88
        spr_dat_dmmu, spr_dat_immu, spr_dat_du, spr_cs, spr_we, mtspr_dc_done
89 483 julius
 
90
`ifdef OR1200_RAM_PARITY
91
        ,p_err_rf
92
`endif
93
 
94 350 julius
);
95
 
96
parameter dw = `OR1200_OPERAND_WIDTH;
97
parameter aw = `OR1200_REGFILE_ADDR_WIDTH;
98
 
99
//
100
// I/O ports
101
//
102
 
103
//
104
// Clk & Rst
105
//
106
input                           clk;
107
input                           rst;
108
 
109
//
110
// Insn (IC) interface
111
//
112
output                          ic_en;
113
output  [31:0]                   icpu_adr_o;
114
output                          icpu_cycstb_o;
115
output  [3:0]                    icpu_sel_o;
116
output  [3:0]                    icpu_tag_o;
117
input   [31:0]                   icpu_dat_i;
118
input                           icpu_ack_i;
119
input                           icpu_rty_i;
120
input                           icpu_err_i;
121
input   [31:0]                   icpu_adr_i;
122
input   [3:0]                    icpu_tag_i;
123
 
124
//
125
// Insn (IMMU) interface
126
//
127
output                          immu_en;
128
 
129
//
130
// Debug interface
131
//
132
output                          id_void;
133
output  [31:0]                   id_insn;
134
output                          ex_void;
135
output  [31:0]                   ex_insn;
136
output                          ex_freeze;
137
output  [31:0]                   wb_insn;
138
output                          wb_freeze;
139
output  [31:0]                   id_pc;
140
output  [31:0]                   ex_pc;
141
output  [31:0]                   wb_pc;
142
output                          ex_flushpipe;
143
output  [`OR1200_BRANCHOP_WIDTH-1:0]     branch_op;
144
 
145
input                           du_stall;
146
input   [dw-1:0]         du_addr;
147
input   [dw-1:0]         du_dat_du;
148
input                           du_read;
149
input                           du_write;
150
input   [`OR1200_DU_DSR_WIDTH-1:0]       du_dsr;
151
input   [24:0]                   du_dmr1;
152
input                           du_hwbkpt;
153
input                           du_hwbkpt_ls_r;
154
output  [13:0]                   du_except_trig;
155
output  [13:0]                   du_except_stop;
156
output  [dw-1:0]         du_dat_cpu;
157
output  [dw-1:0]         rf_dataw;
158
output  [dw-1:0]         du_lsu_store_dat;
159
output  [dw-1:0]         du_lsu_load_dat;
160
 
161
//
162
// Data (DC) interface
163
//
164
output  [31:0]                   dcpu_adr_o;
165
output                          dcpu_cycstb_o;
166
output                          dcpu_we_o;
167
output  [3:0]                    dcpu_sel_o;
168
output  [3:0]                    dcpu_tag_o;
169
output  [31:0]                   dcpu_dat_o;
170
input   [31:0]                   dcpu_dat_i;
171
input                           dcpu_ack_i;
172
input                           dcpu_rty_i;
173
input                           dcpu_err_i;
174
input   [3:0]                    dcpu_tag_i;
175
output                          dc_en;
176
output                          dc_no_writethrough;
177
 
178
//
179
// Data (DMMU) interface
180
//
181
output                          sb_en;
182
output                          dmmu_en;
183
output                          abort_ex;
184
output                          abort_mvspr;
185
 
186
//
187
// SR Interface 
188
//
189
input                           boot_adr_sel_i;
190
 
191
//
192
// SPR interface
193
//
194
output                          supv;
195
input   [dw-1:0]         spr_dat_pic;
196
input   [dw-1:0]         spr_dat_tt;
197
input   [dw-1:0]         spr_dat_pm;
198
input   [dw-1:0]         spr_dat_dmmu;
199
input   [dw-1:0]         spr_dat_immu;
200
input   [dw-1:0]         spr_dat_du;
201
output  [dw-1:0]         spr_addr;
202
output  [dw-1:0]         spr_dat_cpu;
203
output  [dw-1:0]         spr_dat_npc;
204
output  [31:0]                   spr_cs;
205
output                          spr_we;
206
input                           mtspr_dc_done;
207
 
208
//
209
// Interrupt exceptions
210
//
211
input                           sig_int;
212
input                           sig_tick;
213
 
214
//
215 483 julius
// Register file parity error indicator
216
//     
217
`ifdef OR1200_RAM_PARITY
218
output                          p_err_rf;
219
`endif
220
 
221
 
222
//
223 350 julius
// Internal wires
224
//
225
wire    [31:0]                   if_insn;
226
wire                            saving_if_insn;
227
wire    [31:0]                   if_pc;
228
wire    [aw-1:0]         rf_addrw;
229
wire    [aw-1:0]                 rf_addra;
230
wire    [aw-1:0]                 rf_addrb;
231
wire                            rf_rda;
232
wire                            rf_rdb;
233
wire    [dw-1:0]         id_simm;
234
wire    [dw-1:2]                id_branch_addrtarget;
235
wire    [dw-1:2]                ex_branch_addrtarget;
236
wire    [`OR1200_ALUOP_WIDTH-1:0]        alu_op;
237 403 julius
wire    [`OR1200_ALUOP2_WIDTH-1:0]       alu_op2;
238 350 julius
wire    [`OR1200_SHROTOP_WIDTH-1:0]      shrot_op;
239
wire    [`OR1200_COMPOP_WIDTH-1:0]       comp_op;
240
wire    [`OR1200_BRANCHOP_WIDTH-1:0]     pre_branch_op;
241
wire    [`OR1200_BRANCHOP_WIDTH-1:0]     branch_op;
242
wire    [`OR1200_LSUOP_WIDTH-1:0]        id_lsu_op;
243
wire                            genpc_freeze;
244
wire                            if_freeze;
245
wire                            id_freeze;
246
wire                            ex_freeze;
247
wire                            wb_freeze;
248
wire    [`OR1200_SEL_WIDTH-1:0]  sel_a;
249
wire    [`OR1200_SEL_WIDTH-1:0]  sel_b;
250
wire    [`OR1200_RFWBOP_WIDTH-1:0]       rfwb_op;
251
wire    [`OR1200_FPUOP_WIDTH-1:0]       fpu_op;
252
wire    [dw-1:0]         rf_dataw;
253
wire    [dw-1:0]         rf_dataa;
254
wire    [dw-1:0]         rf_datab;
255
wire    [dw-1:0]         muxed_a;
256
wire    [dw-1:0]         muxed_b;
257
wire    [dw-1:0]         wb_forw;
258
wire                            wbforw_valid;
259
wire    [dw-1:0]         operand_a;
260
wire    [dw-1:0]         operand_b;
261
wire    [dw-1:0]         alu_dataout;
262
wire    [dw-1:0]         lsu_dataout;
263
wire    [dw-1:0]         sprs_dataout;
264
wire    [dw-1:0]         fpu_dataout;
265
wire                            fpu_done;
266
wire    [31:0]                   ex_simm;
267
wire    [`OR1200_MULTICYCLE_WIDTH-1:0]   multicycle;
268
wire    [`OR1200_WAIT_ON_WIDTH-1:0]      wait_on;
269
wire    [`OR1200_EXCEPT_WIDTH-1:0]       except_type;
270
wire    [4:0]                    cust5_op;
271
wire    [5:0]                    cust5_limm;
272
wire                            if_flushpipe;
273
wire                            id_flushpipe;
274
wire                            ex_flushpipe;
275
wire                            wb_flushpipe;
276
wire                            extend_flush;
277
wire                            ex_branch_taken;
278
wire                            flag;
279
wire                            flagforw;
280
wire                            flag_we;
281
wire                            flagforw_alu;
282
wire                            flag_we_alu;
283
wire                            flagforw_fpu;
284
wire                            flag_we_fpu;
285
wire                            carry;
286
wire                            cyforw;
287
wire                            cy_we_alu;
288
wire                            cy_we_rf;
289
wire                            lsu_stall;
290
wire                            epcr_we;
291
wire                            eear_we;
292
wire                            esr_we;
293
wire                            pc_we;
294
wire    [31:0]                   epcr;
295
wire    [31:0]                   eear;
296
wire    [`OR1200_SR_WIDTH-1:0]   esr;
297
wire    [`OR1200_FPCSR_WIDTH-1:0]       fpcsr;
298
wire                            fpcsr_we;
299
wire                            sr_we;
300
wire    [`OR1200_SR_WIDTH-1:0]   to_sr;
301
wire    [`OR1200_SR_WIDTH-1:0]   sr;
302
wire                            except_flushpipe;
303
wire                            except_start;
304
wire                            except_started;
305
wire                            fpu_except_started;
306
wire    [31:0]                   wb_insn;
307
wire                            sig_syscall;
308
wire                            sig_trap;
309
wire                            sig_fp;
310
wire    [31:0]                   spr_dat_cfgr;
311
wire    [31:0]                   spr_dat_rf;
312
wire    [31:0]                  spr_dat_npc;
313
wire    [31:0]                   spr_dat_ppc;
314
wire    [31:0]                   spr_dat_mac;
315
wire [31:0]                      spr_dat_fpu;
316
wire                            mtspr_done;
317
wire                            force_dslot_fetch;
318
wire                            no_more_dslot;
319
wire                            ex_void;
320
wire                            ex_spr_read;
321
wire                            ex_spr_write;
322
wire                            if_stall;
323
wire                            id_macrc_op;
324
wire                            ex_macrc_op;
325
wire    [`OR1200_MACOP_WIDTH-1:0] id_mac_op;
326
wire    [`OR1200_MACOP_WIDTH-1:0] mac_op;
327
wire    [31:0]                   mult_mac_result;
328 435 julius
wire                            mult_mac_stall;
329 350 julius
wire    [13:0]                   except_trig;
330
wire    [13:0]                   except_stop;
331
wire                            genpc_refetch;
332
wire                            rfe;
333
wire                            lsu_unstall;
334
wire                            except_align;
335
wire                            except_dtlbmiss;
336
wire                            except_dmmufault;
337
wire                            except_illegal;
338
wire                            except_itlbmiss;
339
wire                            except_immufault;
340
wire                            except_ibuserr;
341
wire                            except_dbuserr;
342
wire                            abort_ex;
343
wire                            abort_mvspr;
344
 
345
//
346
// Send exceptions to Debug Unit
347
//
348
assign du_except_trig = except_trig;
349
assign du_except_stop = except_stop;
350
assign du_lsu_store_dat = operand_b;
351
assign du_lsu_load_dat  = lsu_dataout;
352
 
353
//
354
// Data cache enable
355
//
356
`ifdef OR1200_NO_DC
357
assign dc_en = 1'b0;
358
`else
359
   assign dc_en = sr[`OR1200_SR_DCE];
360
`endif
361
 
362
//
363
// Instruction cache enable
364
//
365
`ifdef OR1200_NO_IC
366
assign ic_en = 1'b0;
367
`else
368
assign ic_en = sr[`OR1200_SR_ICE];
369
`endif
370
 
371
//
372
// SB enable
373
//
374
`ifdef OR1200_SB_IMPLEMENTED
375
//assign sb_en = sr[`OR1200_SR_SBE]; // SBE not defined  -- jb
376
`else
377
assign sb_en = 1'b0;
378
`endif
379
 
380
//
381
// DMMU enable
382
//
383
`ifdef OR1200_NO_DMMU
384
assign dmmu_en = 1'b0;
385
`else
386
assign dmmu_en = sr[`OR1200_SR_DME];
387
`endif
388
 
389
//
390
// IMMU enable
391
//
392
`ifdef OR1200_NO_IMMU
393
assign immu_en = 1'b0;
394
`else
395
assign immu_en = sr[`OR1200_SR_IME] & ~except_started;
396
`endif
397
 
398
//
399
// SUPV bit
400
//
401
assign supv = sr[`OR1200_SR_SM];
402
 
403
//
404
// FLAG write enable
405
//
406
assign flagforw = (flag_we_alu & flagforw_alu) | (flagforw_fpu & flag_we_fpu);
407
assign flag_we = (flag_we_alu | flag_we_fpu) & ~abort_mvspr;
408
 
409
//
410
//  Flag for any MTSPR instructions, that must block execution, to indicate done
411
//
412
assign mtspr_done = mtspr_dc_done;
413
 
414
 
415
//
416
// Instantiation of instruction fetch block
417
//
418
or1200_genpc or1200_genpc(
419
        .clk(clk),
420
        .rst(rst),
421
        .icpu_adr_o(icpu_adr_o),
422
        .icpu_cycstb_o(icpu_cycstb_o),
423
        .icpu_sel_o(icpu_sel_o),
424
        .icpu_tag_o(icpu_tag_o),
425
        .icpu_rty_i(icpu_rty_i),
426
        .icpu_adr_i(icpu_adr_i),
427
 
428
        .pre_branch_op(pre_branch_op),
429
        .branch_op(branch_op),
430
        .except_type(except_type),
431
        .except_start(except_start),
432
        .except_prefix(sr[`OR1200_SR_EPH]),
433
        .id_branch_addrtarget(id_branch_addrtarget),
434
        .ex_branch_addrtarget(ex_branch_addrtarget),
435
        .muxed_b(muxed_b),
436
        .operand_b(operand_b),
437
        .flag(flag),
438
        .flagforw(flagforw),
439
        .ex_branch_taken(ex_branch_taken),
440
        .epcr(epcr),
441
        .spr_dat_i(spr_dat_cpu),
442
        .spr_pc_we(pc_we),
443
        .genpc_refetch(genpc_refetch),
444
        .genpc_freeze(genpc_freeze),
445
        .no_more_dslot(no_more_dslot)
446
);
447
 
448
//
449
// Instantiation of instruction fetch block
450
//
451
or1200_if or1200_if(
452
        .clk(clk),
453
        .rst(rst),
454
        .icpu_dat_i(icpu_dat_i),
455
        .icpu_ack_i(icpu_ack_i),
456
        .icpu_err_i(icpu_err_i),
457
        .icpu_adr_i(icpu_adr_i),
458
        .icpu_tag_i(icpu_tag_i),
459
 
460
        .if_freeze(if_freeze),
461
        .if_insn(if_insn),
462
        .if_pc(if_pc),
463
        .saving_if_insn(saving_if_insn),
464
        .if_flushpipe(if_flushpipe),
465
        .if_stall(if_stall),
466
        .no_more_dslot(no_more_dslot),
467
        .genpc_refetch(genpc_refetch),
468
        .rfe(rfe),
469
        .except_itlbmiss(except_itlbmiss),
470
        .except_immufault(except_immufault),
471
        .except_ibuserr(except_ibuserr)
472
);
473
 
474
//
475
// Instantiation of instruction decode/control logic
476
//
477
or1200_ctrl or1200_ctrl(
478
        .clk(clk),
479
        .rst(rst),
480
        .id_freeze(id_freeze),
481
        .ex_freeze(ex_freeze),
482
        .wb_freeze(wb_freeze),
483
        .if_flushpipe(if_flushpipe),
484
        .id_flushpipe(id_flushpipe),
485
        .ex_flushpipe(ex_flushpipe),
486
        .wb_flushpipe(wb_flushpipe),
487
        .extend_flush(extend_flush),
488
        .except_flushpipe(except_flushpipe),
489
        .abort_mvspr(abort_mvspr),
490
        .if_insn(if_insn),
491
        .id_insn(id_insn),
492
        .ex_insn(ex_insn),
493
        .id_branch_op(pre_branch_op),
494
        .ex_branch_op(branch_op),
495
        .ex_branch_taken(ex_branch_taken),
496
        .rf_addra(rf_addra),
497
        .rf_addrb(rf_addrb),
498
        .rf_rda(rf_rda),
499
        .rf_rdb(rf_rdb),
500
        .alu_op(alu_op),
501 403 julius
        .alu_op2(alu_op2),
502 350 julius
        .mac_op(mac_op),
503
        .shrot_op(shrot_op),
504
        .comp_op(comp_op),
505
        .rf_addrw(rf_addrw),
506
        .rfwb_op(rfwb_op),
507
        .fpu_op(fpu_op),
508
        .pc_we(pc_we),
509
        .wb_insn(wb_insn),
510
        .id_simm(id_simm),
511
        .id_branch_addrtarget(id_branch_addrtarget),
512
        .ex_branch_addrtarget(ex_branch_addrtarget),
513
        .ex_simm(ex_simm),
514
        .sel_a(sel_a),
515
        .sel_b(sel_b),
516
        .id_lsu_op(id_lsu_op),
517
        .cust5_op(cust5_op),
518
        .cust5_limm(cust5_limm),
519
        .id_pc(id_pc),
520
        .ex_pc(ex_pc),
521
        .multicycle(multicycle),
522
        .wait_on(wait_on),
523
        .wbforw_valid(wbforw_valid),
524
        .sig_syscall(sig_syscall),
525
        .sig_trap(sig_trap),
526
        .force_dslot_fetch(force_dslot_fetch),
527
        .no_more_dslot(no_more_dslot),
528
        .id_void(id_void),
529
        .ex_void(ex_void),
530
        .ex_spr_read(ex_spr_read),
531
        .ex_spr_write(ex_spr_write),
532
        .id_mac_op(id_mac_op),
533
        .id_macrc_op(id_macrc_op),
534
        .ex_macrc_op(ex_macrc_op),
535
        .rfe(rfe),
536
        .du_hwbkpt(du_hwbkpt),
537
        .except_illegal(except_illegal),
538
        .dc_no_writethrough(dc_no_writethrough)
539
);
540
 
541
//
542
// Instantiation of register file
543
//
544
or1200_rf or1200_rf(
545
        .clk(clk),
546
        .rst(rst),
547 483 julius
`ifdef OR1200_RAM_PARITY
548
        .p_err(p_err_rf),
549
`endif
550 350 julius
        .cy_we_i(cy_we_alu),
551
        .cy_we_o(cy_we_rf),
552
        .supv(sr[`OR1200_SR_SM]),
553
        .wb_freeze(wb_freeze),
554
        .addrw(rf_addrw),
555
        .dataw(rf_dataw),
556
        .id_freeze(id_freeze),
557
        .we(rfwb_op[0]),
558
        .flushpipe(wb_flushpipe),
559
        .addra(rf_addra),
560
        .rda(rf_rda),
561
        .dataa(rf_dataa),
562
        .addrb(rf_addrb),
563
        .rdb(rf_rdb),
564
        .datab(rf_datab),
565
        .spr_cs(spr_cs[`OR1200_SPR_GROUP_SYS]),
566
        .spr_write(spr_we),
567
        .spr_addr(spr_addr),
568
        .spr_dat_i(spr_dat_cpu),
569
        .spr_dat_o(spr_dat_rf),
570
        .du_read(du_read)
571
);
572
 
573
//
574
// Instantiation of operand muxes
575
//
576
or1200_operandmuxes or1200_operandmuxes(
577
        .clk(clk),
578
        .rst(rst),
579
        .id_freeze(id_freeze),
580
        .ex_freeze(ex_freeze),
581
        .rf_dataa(rf_dataa),
582
        .rf_datab(rf_datab),
583
        .ex_forw(rf_dataw),
584
        .wb_forw(wb_forw),
585
        .simm(id_simm),
586
        .sel_a(sel_a),
587
        .sel_b(sel_b),
588
        .operand_a(operand_a),
589
        .operand_b(operand_b),
590
        .muxed_a(muxed_a),
591
        .muxed_b(muxed_b)
592
);
593
 
594
//
595
// Instantiation of CPU's ALU
596
//
597
or1200_alu or1200_alu(
598
        .a(operand_a),
599
        .b(operand_b),
600
        .mult_mac_result(mult_mac_result),
601
        .macrc_op(ex_macrc_op),
602
        .alu_op(alu_op),
603 403 julius
        .alu_op2(alu_op2),
604 350 julius
        .shrot_op(shrot_op),
605
        .comp_op(comp_op),
606
        .cust5_op(cust5_op),
607
        .cust5_limm(cust5_limm),
608
        .result(alu_dataout),
609
        .flagforw(flagforw_alu),
610
        .flag_we(flag_we_alu),
611
        .cyforw(cyforw),
612
        .cy_we(cy_we_alu),
613
        .flag(flag),
614
        .carry(carry)
615
);
616
 
617
 
618
//
619
// FPU's exception is being dealt with
620
//    
621
assign fpu_except_started = except_started && (except_type == `OR1200_EXCEPT_FLOAT);
622
 
623
//
624
// Instantiation of FPU
625
//
626
or1200_fpu or1200_fpu(
627
        .clk(clk),
628
        .rst(rst),
629
        .ex_freeze(ex_freeze),
630
        .a(operand_a),
631
        .b(operand_b),
632
        .fpu_op(fpu_op),
633
        .result(fpu_dataout),
634
        .done(fpu_done),
635
        .flagforw(flagforw_fpu),
636
        .flag_we(flag_we_fpu),
637
        .sig_fp(sig_fp),
638
        .except_started(fpu_except_started),
639
        .fpcsr_we(fpcsr_we),
640
        .fpcsr(fpcsr),
641
        .spr_cs(spr_cs[`OR1200_SPR_GROUP_FPU]),
642
        .spr_write(spr_we),
643
        .spr_addr(spr_addr),
644
        .spr_dat_i(spr_dat_cpu),
645
        .spr_dat_o(spr_dat_fpu)
646
);
647
 
648
 
649
//
650
// Instantiation of CPU's multiply unit
651
//
652
or1200_mult_mac or1200_mult_mac(
653
        .clk(clk),
654
        .rst(rst),
655
        .ex_freeze(ex_freeze),
656
        .id_macrc_op(id_macrc_op),
657
        .macrc_op(ex_macrc_op),
658
        .a(operand_a),
659
        .b(operand_b),
660
        .mac_op(mac_op),
661
        .alu_op(alu_op),
662
        .result(mult_mac_result),
663 435 julius
        .mult_mac_stall(mult_mac_stall),
664 350 julius
        .spr_cs(spr_cs[`OR1200_SPR_GROUP_MAC]),
665
        .spr_write(spr_we),
666
        .spr_addr(spr_addr),
667
        .spr_dat_i(spr_dat_cpu),
668
        .spr_dat_o(spr_dat_mac)
669
);
670
 
671
//
672
// Instantiation of CPU's SPRS block
673
//
674
or1200_sprs or1200_sprs(
675
        .clk(clk),
676
        .rst(rst),
677
        .addrbase(operand_a),
678
        .addrofs(ex_simm[15:0]),
679
        .dat_i(operand_b),
680
        .ex_spr_read(ex_spr_read),
681
        .ex_spr_write(ex_spr_write),
682
        .flagforw(flagforw),
683
        .flag_we(flag_we),
684
        .flag(flag),
685
        .cyforw(cyforw),
686
        .cy_we(cy_we_rf),
687
        .carry(carry),
688
        .to_wbmux(sprs_dataout),
689
 
690
        .du_addr(du_addr),
691
        .du_dat_du(du_dat_du),
692
        .du_read(du_read),
693
        .du_write(du_write),
694
        .du_dat_cpu(du_dat_cpu),
695
        .boot_adr_sel_i(boot_adr_sel_i),
696
        .spr_addr(spr_addr),
697
        .spr_dat_pic(spr_dat_pic),
698
        .spr_dat_tt(spr_dat_tt),
699
        .spr_dat_pm(spr_dat_pm),
700
        .spr_dat_cfgr(spr_dat_cfgr),
701
        .spr_dat_rf(spr_dat_rf),
702
        .spr_dat_npc(spr_dat_npc),
703
        .spr_dat_ppc(spr_dat_ppc),
704
        .spr_dat_mac(spr_dat_mac),
705
        .spr_dat_dmmu(spr_dat_dmmu),
706
        .spr_dat_immu(spr_dat_immu),
707
        .spr_dat_du(spr_dat_du),
708
        .spr_dat_o(spr_dat_cpu),
709
        .spr_cs(spr_cs),
710
        .spr_we(spr_we),
711
 
712
        .epcr_we(epcr_we),
713
        .eear_we(eear_we),
714
        .esr_we(esr_we),
715
        .pc_we(pc_we),
716
        .epcr(epcr),
717
        .eear(eear),
718
        .esr(esr),
719
        .except_started(except_started),
720
 
721
        .fpcsr(fpcsr),
722
        .fpcsr_we(fpcsr_we),
723
        .spr_dat_fpu(spr_dat_fpu),
724
 
725
        .sr_we(sr_we),
726
        .to_sr(to_sr),
727
        .sr(sr),
728
        .branch_op(branch_op)
729
);
730
 
731
//
732
// Instantiation of load/store unit
733
//
734
or1200_lsu or1200_lsu(
735
        .clk(clk),
736
        .rst(rst),
737
        .id_addrbase(muxed_a),
738
        .id_addrofs(id_simm),
739
        .ex_addrbase(operand_a),
740
        .ex_addrofs(ex_simm),
741
        .id_lsu_op(id_lsu_op),
742
        .lsu_datain(operand_b),
743
        .lsu_dataout(lsu_dataout),
744
        .lsu_stall(lsu_stall),
745
        .lsu_unstall(lsu_unstall),
746
        .du_stall(du_stall),
747
        .except_align(except_align),
748
        .except_dtlbmiss(except_dtlbmiss),
749
        .except_dmmufault(except_dmmufault),
750
        .except_dbuserr(except_dbuserr),
751
        .id_freeze(id_freeze),
752
        .ex_freeze(ex_freeze),
753
        .flushpipe(ex_flushpipe),
754
 
755
        .dcpu_adr_o(dcpu_adr_o),
756
        .dcpu_cycstb_o(dcpu_cycstb_o),
757
        .dcpu_we_o(dcpu_we_o),
758
        .dcpu_sel_o(dcpu_sel_o),
759
        .dcpu_tag_o(dcpu_tag_o),
760
        .dcpu_dat_o(dcpu_dat_o),
761
        .dcpu_dat_i(dcpu_dat_i),
762
        .dcpu_ack_i(dcpu_ack_i),
763
        .dcpu_rty_i(dcpu_rty_i),
764
        .dcpu_err_i(dcpu_err_i),
765
        .dcpu_tag_i(dcpu_tag_i)
766
);
767
 
768
//
769
// Instantiation of write-back muxes
770
//
771
or1200_wbmux or1200_wbmux(
772
        .clk(clk),
773
        .rst(rst),
774
        .wb_freeze(wb_freeze),
775
        .rfwb_op(rfwb_op),
776
        .muxin_a(alu_dataout),
777
        .muxin_b(lsu_dataout),
778
        .muxin_c(sprs_dataout),
779
        .muxin_d(ex_pc),
780
        .muxin_e(fpu_dataout),
781
        .muxout(rf_dataw),
782
        .muxreg(wb_forw),
783
        .muxreg_valid(wbforw_valid)
784
);
785
 
786
//
787
// Instantiation of freeze logic
788
//
789
or1200_freeze or1200_freeze(
790
        .clk(clk),
791
        .rst(rst),
792
        .multicycle(multicycle),
793
        .wait_on(wait_on),
794
        .fpu_done(fpu_done),
795
        .mtspr_done(mtspr_done),
796
        .flushpipe(wb_flushpipe),
797
        .extend_flush(extend_flush),
798
        .lsu_stall(lsu_stall),
799
        .if_stall(if_stall),
800
        .lsu_unstall(lsu_unstall),
801
        .force_dslot_fetch(force_dslot_fetch),
802
        .abort_ex(abort_ex),
803
        .du_stall(du_stall),
804 435 julius
        .mac_stall(mult_mac_stall),
805 350 julius
        .saving_if_insn(saving_if_insn),
806
        .genpc_freeze(genpc_freeze),
807
        .if_freeze(if_freeze),
808
        .id_freeze(id_freeze),
809
        .ex_freeze(ex_freeze),
810
        .wb_freeze(wb_freeze),
811
        .icpu_ack_i(icpu_ack_i),
812
        .icpu_err_i(icpu_err_i)
813
);
814
 
815
//
816
// Instantiation of exception block
817
//
818
or1200_except or1200_except(
819
        .clk(clk),
820
        .rst(rst),
821
        .sig_ibuserr(except_ibuserr),
822
        .sig_dbuserr(except_dbuserr),
823
        .sig_illegal(except_illegal),
824
        .sig_align(except_align),
825
        .sig_range(1'b0),
826
        .sig_dtlbmiss(except_dtlbmiss),
827
        .sig_dmmufault(except_dmmufault),
828
        .sig_int(sig_int),
829
        .sig_syscall(sig_syscall),
830
        .sig_trap(sig_trap),
831
        .sig_itlbmiss(except_itlbmiss),
832
        .sig_immufault(except_immufault),
833
        .sig_tick(sig_tick),
834
        .sig_fp(sig_fp),
835
        .fpcsr_fpee(fpcsr[`OR1200_FPCSR_FPEE]),
836
        .ex_branch_taken(ex_branch_taken),
837
        .icpu_ack_i(icpu_ack_i),
838
        .icpu_err_i(icpu_err_i),
839
        .dcpu_ack_i(dcpu_ack_i),
840
        .dcpu_err_i(dcpu_err_i),
841
        .genpc_freeze(genpc_freeze),
842
        .id_freeze(id_freeze),
843
        .ex_freeze(ex_freeze),
844
        .wb_freeze(wb_freeze),
845
        .if_stall(if_stall),
846
        .if_pc(if_pc),
847
        .id_pc(id_pc),
848
        .ex_pc(ex_pc),
849
        .wb_pc(wb_pc),
850
        .id_flushpipe(id_flushpipe),
851
        .ex_flushpipe(ex_flushpipe),
852
        .extend_flush(extend_flush),
853
        .except_flushpipe(except_flushpipe),
854
        .abort_mvspr(abort_mvspr),
855
        .except_type(except_type),
856
        .except_start(except_start),
857
        .except_started(except_started),
858
        .except_stop(except_stop),
859
        .except_trig(except_trig),
860
        .ex_void(ex_void),
861
        .spr_dat_ppc(spr_dat_ppc),
862
        .spr_dat_npc(spr_dat_npc),
863
 
864
        .datain(spr_dat_cpu),
865
        .branch_op(branch_op),
866
        .du_dsr(du_dsr),
867
        .du_dmr1(du_dmr1),
868
        .du_hwbkpt(du_hwbkpt),
869
        .du_hwbkpt_ls_r(du_hwbkpt_ls_r),
870
        .epcr_we(epcr_we),
871
        .eear_we(eear_we),
872
        .esr_we(esr_we),
873
        .pc_we(pc_we),
874
        .epcr(epcr),
875
        .eear(eear),
876
        .esr(esr),
877
 
878
        .lsu_addr(dcpu_adr_o),
879
        .sr_we(sr_we),
880
        .to_sr(to_sr),
881
        .sr(sr),
882
        .abort_ex(abort_ex)
883
);
884
 
885
//
886
// Instantiation of configuration registers
887
//
888
or1200_cfgr or1200_cfgr(
889
        .spr_addr(spr_addr),
890
        .spr_dat_o(spr_dat_cfgr)
891
);
892
 
893
endmodule

powered by: WebSVN 2.1.0

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