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

Subversion Repositories or1k

[/] [or1k/] [branches/] [mp3_stable/] [or1200/] [rtl/] [verilog/] [cpu.v] - Blame information for rev 203

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

Line No. Rev Author Line
1 161 lampret
//////////////////////////////////////////////////////////////////////
2
////                                                              ////
3
////  OR1200's CPU                                                ////
4
////                                                              ////
5
////  This file is part of the OpenRISC 1200 project              ////
6
////  http://www.opencores.org/cores/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
// CVS Revision History
46
//
47
// $Log: not supported by cvs2svn $
48 203 lampret
// Revision 1.4  2001/08/17 08:01:19  lampret
49
// IC enable/disable.
50
//
51 176 lampret
// Revision 1.3  2001/08/13 03:36:20  lampret
52
// Added cfg regs. Moved all defines into one defines.v file. More cleanup.
53
//
54 170 lampret
// Revision 1.2  2001/08/09 13:39:33  lampret
55
// Major clean-up.
56
//
57 168 lampret
// Revision 1.1  2001/07/20 00:46:03  lampret
58
// Development version of RTL. Libraries are missing.
59 161 lampret
//
60 168 lampret
//
61 161 lampret
 
62 203 lampret
// synopsys translate_off
63 168 lampret
`include "timescale.v"
64 203 lampret
// synopsys translate_on
65 168 lampret
`include "defines.v"
66 161 lampret
 
67
module cpu(
68
        // Clk & Rst
69
        clk, rst,
70
 
71
        // Insn interface
72 203 lampret
        ic_insn, ic_addr, ic_stall, ic_fetchop, ic_en,
73
        immu_en, immuexcept_miss, immuexcept_fault,
74 161 lampret
 
75
        // Trace port
76
        tp_dir_in, tp_sel, tp_in, tp_out,
77
 
78
        // Data interface
79 203 lampret
        dclsu_stall, dclsu_unstall, dclsu_addr, dclsu_datain, dclsu_dataout, dclsu_lsuop, dc_en,
80
        dmmu_en, dmmuexcept_miss, dmmuexcept_fault,
81 161 lampret
 
82
        // Interrupt exceptions
83
        int_high, int_low,
84
 
85
        // SPR interface
86 203 lampret
        supv, spr_addr, spr_dataout, spr_dat_pic, spr_dat_tt, spr_dat_pm, spr_dat_dmmu, spr_cs, spr_we,
87 161 lampret
 
88
        // Trace port
89 168 lampret
        tp2w, tp3w
90 161 lampret
);
91
 
92
parameter dw = `OPERAND_WIDTH;
93
parameter aw = `REGFILE_ADDR_WIDTH;
94
 
95
//
96
// I/O ports
97
//
98
 
99 168 lampret
//
100 161 lampret
// Clk & Rst
101 168 lampret
//
102
input                           clk;
103
input                           rst;
104 161 lampret
 
105 168 lampret
//
106
// Insn (IC) interface
107
//
108
input   [31:0]                   ic_insn;
109 203 lampret
output  [31:0]                   ic_addr;
110 168 lampret
input                           ic_stall;
111 203 lampret
output  [`FETCHOP_WIDTH-1:0]     ic_fetchop;
112 170 lampret
output                          ic_en;
113 161 lampret
 
114 168 lampret
//
115 203 lampret
// Insn (IMMU) interface
116
//
117
input                           immuexcept_miss;
118
input                           immuexcept_fault;
119
output                          immu_en;
120
 
121
//
122 161 lampret
// Trace
123 168 lampret
//
124
input                           tp_dir_in;
125
input   [1:0]                    tp_sel;
126
input   [31:0]                   tp_in;
127
output  [31:0]                   tp_out;
128
output  [`TP2W_WIDTH-1:0]        tp2w;
129
output  [`TP3W_WIDTH-1:0]        tp3w;
130 161 lampret
 
131 168 lampret
//
132
// Data (DC) interface
133
//
134
input                           dclsu_stall;
135 203 lampret
input                           dclsu_unstall;
136 168 lampret
output  [31:0]                   dclsu_addr;
137
input   [31:0]                   dclsu_datain;
138
output  [31:0]                   dclsu_dataout;
139
output  [`LSUOP_WIDTH-1:0]       dclsu_lsuop;
140
output                          dc_en;
141 161 lampret
 
142 168 lampret
//
143 203 lampret
// Data (DMMU) interface
144
//
145
input                           dmmuexcept_miss;
146
input                           dmmuexcept_fault;
147
output                          dmmu_en;
148
 
149
//
150 161 lampret
// SPR interface
151 168 lampret
//
152 203 lampret
input                           supv;
153 168 lampret
input   [dw-1:0]         spr_dat_pic;
154
input   [dw-1:0]         spr_dat_tt;
155
input   [dw-1:0]         spr_dat_pm;
156 203 lampret
input   [dw-1:0]         spr_dat_dmmu;
157 168 lampret
output  [dw-1:0]         spr_addr;
158
output  [dw-1:0]         spr_dataout;
159
output  [31:0]                   spr_cs;
160
output                          spr_we;
161 161 lampret
 
162 168 lampret
//
163 161 lampret
// Interrupt exceptions
164 168 lampret
//
165
input                           int_high;
166
input                           int_low;
167 161 lampret
 
168
//
169
// Internal wires
170
//
171 168 lampret
wire    [31:0]                   insn;
172
wire    [31:0]                   if_pc;
173
wire    [31:2]                  lr_sav;
174
wire    [aw-1:0]         rf_addrw;
175
wire    [aw-1:0]                 rf_addra;
176
wire    [aw-1:0]                 rf_addrb;
177
wire    [dw-1:0]         simm;
178
wire    [dw-1:2]                branch_addrofs;
179
wire    [`ALUOP_WIDTH-1:0]       alu_op;
180
wire    [`SHROTOP_WIDTH-1:0]     shrot_op;
181
wire    [`COMPOP_WIDTH-1:0]      comp_op;
182
wire    [`BRANCHOP_WIDTH-1:0]    branch_op;
183
wire    [`LSUOP_WIDTH-1:0]       lsu_op;
184
wire                            pipeline_freeze;
185
wire    [`SEL_WIDTH-1:0] sel_a;
186
wire    [`SEL_WIDTH-1:0] sel_b;
187
wire    [`RFWBOP_WIDTH-1:0]      rfwb_op;
188
wire    [dw-1:0]         rf_dataw;
189
wire    [dw-1:0]         rf_dataa;
190
wire    [dw-1:0]         rf_datab;
191
wire    [dw-1:0]         muxed_b;
192
wire    [dw-1:0]         wb_forw;
193
wire                            wbforw_valid;
194
wire    [dw-1:0]         operand_a;
195
wire    [dw-1:0]         operand_b;
196
wire    [dw-1:0]         alu_dataout;
197
wire    [dw-1:0]         lsu_dataout;
198
wire    [dw-1:0]         sprs_dataout;
199
wire    [31:0]                   lsu_addrofs;
200
wire    [`MULTICYCLE_WIDTH-1:0]  multicycle;
201
wire    [`EXCEPT_WIDTH-1:0]      except_type;
202
wire                            except_flushpipe;
203
wire                            branch_taken;
204
wire                            flag;
205
wire                            lsu_stall;
206
wire                            branch_stall;
207
wire                            epcr_we;
208
wire                            eear_we;
209
wire                            esr_we;
210
wire    [31:0]                   epcr;
211
wire    [31:0]                   eear;
212
wire    [`SR_WIDTH-1:0]          esr;
213
wire    [`SR_WIDTH-1:0]          sr;
214
wire                            except_start;
215
wire                            except_started;
216
wire    [31:0]                   wb_pc;
217
wire    [31:0]                   wb_insn;
218
wire    [31:0]                   tp_insn;
219
wire                            tp_wr_insn;
220
wire    [15:0]                   spr_addrimm;
221
wire                            sig_syscall;
222 170 lampret
wire    [31:0]                   spr_dat_cfgr;
223 203 lampret
wire                            force_dslot_fetch;
224
wire                            if_stall;
225 161 lampret
 
226 168 lampret
//
227 161 lampret
// Trace port
228 168 lampret
//
229
wire    [31:0]                   rfa_tqa;
230
wire    [31:0]                   rfb_tqa;
231
wire    [`TP1R_WIDTH-1:0]        rfa_tmuxed;
232
wire    [`TP1R_WIDTH-1:0]        rfb_tmuxed;
233
wire    [`TP1W_WIDTH-1:0]        tp1w;
234 161 lampret
 
235
//
236 168 lampret
// Data cache enable
237
//
238
assign dc_en = sr[`SR_DCE];
239
 
240
//
241 170 lampret
// Instruction cache enable
242
//
243 203 lampret
//assign ic_en = 1'b1;
244 176 lampret
assign ic_en = sr[`SR_ICE];
245 170 lampret
 
246
//
247 203 lampret
// DMMU enable
248
//
249
assign dmmu_en = sr[`SR_DME];
250
 
251
//
252
// IMMU enable
253
//
254
assign immu_en = sr[`SR_IME];
255
 
256
//
257
// SUPV bit
258
//
259
assign supv = sr[`SR_SUPV];
260
 
261
//
262 161 lampret
// Instantiation of exception block
263
//
264
except except(
265
        .clk(clk),
266
        .rst(rst),
267 203 lampret
        .sig_dtlbmiss(dmmuexcept_miss),
268
        .sig_dmmufault(dmmuexcept_fault),
269 161 lampret
        .sig_inthigh(int_high),
270 168 lampret
        .sig_syscall(sig_syscall),
271 203 lampret
        .sig_itlbmiss(immuexcept_miss),
272
        .sig_immufault(immuexcept_fault),
273 161 lampret
        .sig_intlow(int_low),
274
        .branch_taken(branch_taken),
275
        .pipeline_freeze(pipeline_freeze),
276 203 lampret
        .if_stall(if_stall),
277 161 lampret
        .if_pc(if_pc),
278
        .lr_sav(lr_sav),
279
        .except_flushpipe(except_flushpipe),
280
        .except_type(except_type),
281
        .except_start(except_start),
282
        .except_started(except_started),
283
        .wb_pc(wb_pc),
284
 
285
        .datain(operand_b),
286
        .epcr_we(epcr_we),
287
        .eear_we(eear_we),
288
        .esr_we(esr_we),
289
        .epcr(epcr),
290
        .eear(eear),
291
        .esr(esr),
292
 
293
        .lsu_addr(dclsu_addr),
294
        .sr(sr)
295
);
296
 
297
//
298
// Instantiation of instruction fetch block
299
//
300
ifetch ifetch(
301
        .clk(clk),
302
        .rst(rst),
303
        .ic_insn(ic_insn),
304 203 lampret
        .ic_addr(ic_addr),
305 161 lampret
        .ic_stall(ic_stall),
306 203 lampret
        .ic_fetchop(ic_fetchop),
307 161 lampret
        .tp_insn(tp_insn),
308
        .tp_wr_insn(tp_wr_insn),
309
        .pipeline_freeze(pipeline_freeze),
310
        .if_insn(insn),
311
        .if_pc(if_pc),
312
        .branch_op(branch_op),
313
        .except_type(except_type),
314
        .except_start(except_start),
315
        .branch_addrofs(branch_addrofs),
316
        .lr_restor(operand_b),
317
        .flag(flag),
318
        .taken(branch_taken),
319
        .binsn_addr(lr_sav),
320 203 lampret
        .epcr(epcr),
321
        .force_dslot_fetch(force_dslot_fetch),
322
        .if_stall(if_stall),
323
        .branch_stall(branch_stall)
324 161 lampret
);
325
 
326
//
327
// Instantiation of instruction decode/control logic
328
//
329
id id(
330
        .clk(clk),
331
        .rst(rst),
332
        .pipeline_freeze(pipeline_freeze),
333
        .except_flushpipe(except_flushpipe),
334
        .if_insn(insn),
335
        .branch_op(branch_op),
336
        .rf_addra(rf_addra),
337
        .rf_addrb(rf_addrb),
338
        .alu_op(alu_op),
339
        .shrot_op(shrot_op),
340
        .comp_op(comp_op),
341
        .rf_addrw(rf_addrw),
342
        .rfwb_op(rfwb_op),
343
        .wb_insn(wb_insn),
344
        .simm(simm),
345
        .branch_addrofs(branch_addrofs),
346
        .lsu_addrofs(lsu_addrofs),
347
        .sel_a(sel_a),
348
        .sel_b(sel_b),
349
        .lsu_op(lsu_op),
350
        .multicycle(multicycle),
351 168 lampret
        .spr_addrimm(spr_addrimm),
352
        .wbforw_valid(wbforw_valid),
353 203 lampret
        .sig_syscall(sig_syscall),
354
        .force_dslot_fetch(force_dslot_fetch)
355 161 lampret
);
356
 
357
//
358
// Instantiation of write-back muxes
359
//
360
wbmux wbmux(
361
        .clk(clk),
362
        .rst(rst),
363
        .pipeline_freeze(pipeline_freeze),
364
        .rfwb_op(rfwb_op),
365
        .muxin_a(alu_dataout),
366
        .muxin_b(lsu_dataout),
367
        .muxin_c(sprs_dataout),
368
        .muxin_d({lr_sav, 2'b0}),
369
        .muxout(rf_dataw),
370
        .muxreg(wb_forw),
371
        .muxreg_valid(wbforw_valid)
372
);
373
 
374
//
375
// Instantiation of register file
376
//
377
rf rf(
378
        .clk(clk),
379
        .rst(rst),
380
        .addrw(rf_addrw),
381
        .dataw(rf_dataw),
382
        .pipeline_freeze(pipeline_freeze),
383
        .we(rfwb_op[0]),
384
        .addra(rf_addra),
385
        .dataa(rf_dataa),
386
        .addrb(rf_addrb),
387
        .datab(rf_datab),
388
        .rfa_tqa(rfa_tqa),
389
        .rfb_tqa(rfb_tqa),
390
        .rfa_tmuxed(rfa_tmuxed),
391
        .rfb_tmuxed(rfb_tmuxed),
392 168 lampret
        .tp1w(tp1w)
393 161 lampret
);
394
 
395
//
396
// Instantiation of operand muxes
397
//
398
operandmuxes operandmuxes(
399
        .clk(clk),
400
        .rst(rst),
401
        .pipeline_freeze(pipeline_freeze),
402
        .rf_dataa(rf_dataa),
403
        .rf_datab(rf_datab),
404
        .ex_forw(rf_dataw),
405
        .wb_forw(wb_forw),
406
        .simm(simm),
407
        .sel_a(sel_a),
408
        .sel_b(sel_b),
409
        .operand_a(operand_a),
410
        .operand_b(operand_b),
411
        .muxed_b(muxed_b)
412
);
413
 
414
//
415
// Instantiation of CPU's ALU
416
//
417
alu alu(
418
        .clk(clk),
419
        .rst(rst),
420
        .a(operand_a),
421
        .b(operand_b),
422
        .alu_op(alu_op),
423
        .shrot_op(shrot_op),
424
        .comp_op(comp_op),
425
        .result(alu_dataout),
426
        .flag(flag)
427
);
428
 
429
//
430
// Instantiation of CPU's SPRS block
431
//
432
sprs sprs(
433
        .clk(clk),
434
        .rst(rst),
435 168 lampret
        .addrbase(operand_a),
436
        .addrofs(spr_addrimm),
437
        .dat_i(operand_b),
438 161 lampret
        .alu_op(alu_op),
439
        .flag(flag),
440
        .to_wbmux(sprs_dataout),
441
 
442
        .spr_addr(spr_addr),
443
        .spr_dat_pic(spr_dat_pic),
444
        .spr_dat_tt(spr_dat_tt),
445
        .spr_dat_pm(spr_dat_pm),
446 203 lampret
        .spr_dat_cfgr(spr_dat_cfgr),
447
        .spr_dat_dmmu(spr_dat_dmmu),
448 161 lampret
        .spr_dataout(spr_dataout),
449
        .spr_cs(spr_cs),
450
        .spr_we(spr_we),
451
 
452
        .epcr_we(epcr_we),
453
        .eear_we(eear_we),
454
        .esr_we(esr_we),
455
        .epcr(epcr),
456
        .eear(eear),
457
        .esr(esr),
458
        .except_start(except_start),
459
        .except_started(except_started),
460
 
461
        .sr(sr),
462
        .branch_op(branch_op)
463
);
464
 
465
//
466
// Instantiation of load/store unit
467
//
468
lsu lsu(
469
        .clk(clk),
470
        .rst(rst),
471
        .addrbase(operand_a),
472
        .addrofs(lsu_addrofs),
473
        .lsu_op(lsu_op),
474
        .lsu_datain(operand_b),
475
        .lsu_dataout(lsu_dataout),
476
        .lsu_stall(lsu_stall),
477
        .dc_stall(dclsu_stall),
478
        .dc_addr(dclsu_addr),
479
        .dc_datain(dclsu_datain),
480
        .dc_dataout(dclsu_dataout),
481
        .dc_lsuop(dclsu_lsuop)
482
);
483
 
484
//
485
// Instantiation of freeze logic
486
//
487
frz_logic frz_logic(
488
        .clk(clk),
489
        .rst(rst),
490
        .multicycle(multicycle),
491
        .except_flushpipe(except_flushpipe),
492
        .lsu_stall(lsu_stall),
493 203 lampret
        .if_stall(if_stall),
494
        .dclsu_unstall(dclsu_unstall),
495 161 lampret
        .branch_stall(branch_stall),
496 203 lampret
        .force_dslot_fetch(force_dslot_fetch),
497 161 lampret
        .pipeline_freeze(pipeline_freeze)
498
);
499
 
500
//
501 170 lampret
// Instantiation of configuration registers
502
//
503
cfgr cfgr(
504
        .clk(clk),
505
        .rst(clk),
506
        .spr_addr(spr_addr),
507
        .spr_dat_o(spr_dat_cfgr)
508
);
509
 
510
//
511 161 lampret
// Instantiation of Trace port
512
//
513
traceport traceport(
514
        // Trace port connection to outside world         
515
        .tp_dir_in(tp_dir_in),
516
        .tp_sel(tp_sel),
517
        .tp_in(tp_in),
518
        .tp_out(tp_out),
519
 
520
        // Trace sources coming from RISC core
521
        .rst(rst),
522
        .rfa_tqa(rfa_tqa),
523
        .rfb_tqa(rfb_tqa),
524
        .rfa_tmuxed(rfa_tmuxed),
525
        .rfb_tmuxed(rfb_tmuxed),
526
        .wb_pc(wb_pc),
527
        .wb_insn(wb_insn),
528
        .wb_forw(wb_forw),
529
 
530
        // To RISC core
531
        .wr_insn(tp_wr_insn),
532
        .insn(tp_insn),
533
        .tp1w(tp1w),
534
        .tp2w(tp2w),
535 203 lampret
        .tp3w(tp3w),
536
        .tp4w(),
537
        .tpdw()
538 161 lampret
);
539
 
540
endmodule
541
 
542
 

powered by: WebSVN 2.1.0

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