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

Subversion Repositories or1k

[/] [or1k/] [tags/] [rel_23/] [or1200/] [rtl/] [verilog/] [or1200_defines.v] - Blame information for rev 1033

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

Line No. Rev Author Line
1 504 lampret
//////////////////////////////////////////////////////////////////////
2
////                                                              ////
3
////  OR1200's definitions                                        ////
4
////                                                              ////
5
////  This file is part of the OpenRISC 1200 project              ////
6
////  http://www.opencores.org/cores/or1k/                        ////
7
////                                                              ////
8
////  Description                                                 ////
9
////  Parameters of the OR1200 core                               ////
10
////                                                              ////
11
////  To Do:                                                      ////
12
////   - add parameters that are missing                          ////
13
////                                                              ////
14
////  Author(s):                                                  ////
15
////      - Damjan Lampret, lampret@opencores.org                 ////
16
////                                                              ////
17
//////////////////////////////////////////////////////////////////////
18
////                                                              ////
19
//// Copyright (C) 2000 Authors and OPENCORES.ORG                 ////
20
////                                                              ////
21
//// This source file may be used and distributed without         ////
22
//// restriction provided that this copyright statement is not    ////
23
//// removed from the file and that any derivative work contains  ////
24
//// the original copyright notice and the associated disclaimer. ////
25
////                                                              ////
26
//// This source file is free software; you can redistribute it   ////
27
//// and/or modify it under the terms of the GNU Lesser General   ////
28
//// Public License as published by the Free Software Foundation; ////
29
//// either version 2.1 of the License, or (at your option) any   ////
30
//// later version.                                               ////
31
////                                                              ////
32
//// This source is distributed in the hope that it will be       ////
33
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
34
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
35
//// PURPOSE.  See the GNU Lesser General Public License for more ////
36
//// details.                                                     ////
37
////                                                              ////
38
//// You should have received a copy of the GNU Lesser General    ////
39
//// Public License along with this source; if not, download it   ////
40
//// from http://www.opencores.org/lgpl.shtml                     ////
41
////                                                              ////
42
//////////////////////////////////////////////////////////////////////
43
//
44
// CVS Revision History
45
//
46
// $Log: not supported by cvs2svn $
47 1033 lampret
// Revision 1.24  2002/09/07 05:42:02  lampret
48
// Added optional SR[CY]. Added define to enable additional (compare) flag modifiers. Defines are OR1200_IMPL_ADDC and OR1200_ADDITIONAL_FLAG_MODIFIERS.
49
//
50 1032 lampret
// Revision 1.23  2002/09/04 00:50:34  lampret
51
// Now most of the configuration registers are updatded automatically based on defines in or1200_defines.v.
52
//
53 1023 lampret
// Revision 1.22  2002/09/03 22:28:21  lampret
54
// As per Taylor Su suggestion all case blocks are full case by default and optionally (OR1200_CASE_DEFAULT) can be disabled to increase clock frequncy.
55
//
56 1022 lampret
// Revision 1.21  2002/08/22 02:18:55  lampret
57
// Store buffer has been tested and it works. BY default it is still disabled until uClinux confirms correct operation on FPGA board.
58
//
59 994 lampret
// Revision 1.20  2002/08/18 21:59:45  lampret
60
// Disable SB until it is tested
61
//
62 984 lampret
// Revision 1.19  2002/08/18 19:53:08  lampret
63
// Added store buffer.
64
//
65 977 lampret
// Revision 1.18  2002/08/15 06:04:11  lampret
66
// Fixed Xilinx trace buffer address. REported by Taylor Su.
67
//
68 962 lampret
// Revision 1.17  2002/08/12 05:31:44  lampret
69
// Added OR1200_WB_RETRY. Moved WB registered outsputs / samples inputs into lower section.
70
//
71 944 lampret
// Revision 1.16  2002/07/14 22:17:17  lampret
72
// Added simple trace buffer [only for Xilinx Virtex target]. Fixed instruction fetch abort when new exception is recognized.
73
//
74 895 lampret
// Revision 1.15  2002/06/08 16:20:21  lampret
75
// Added defines for enabling generic FF based memory macro for register file.
76
//
77 870 lampret
// Revision 1.14  2002/03/29 16:24:06  lampret
78
// Changed comment about synopsys to _synopsys_ because synthesis was complaining about unknown directives
79
//
80 790 lampret
// Revision 1.13  2002/03/29 15:16:55  lampret
81
// Some of the warnings fixed.
82
//
83 788 lampret
// Revision 1.12  2002/03/28 19:25:42  lampret
84
// Added second type of Virtual Silicon two-port SRAM (for register file). Changed defines for VS STP RAMs.
85
//
86 778 lampret
// Revision 1.11  2002/03/28 19:13:17  lampret
87
// Updated defines.
88
//
89 776 lampret
// Revision 1.10  2002/03/14 00:30:24  lampret
90
// Added alternative for critical path in DU.
91
//
92 737 lampret
// Revision 1.9  2002/03/11 01:26:26  lampret
93
// Fixed async loop. Changed multiplier type for ASIC.
94
//
95 735 lampret
// Revision 1.8  2002/02/11 04:33:17  lampret
96
// Speed optimizations (removed duplicate _cyc_ and _stb_). Fixed D/IMMU cache-inhibit attr.
97
//
98 660 lampret
// Revision 1.7  2002/02/01 19:56:54  lampret
99
// Fixed combinational loops.
100
//
101 636 lampret
// Revision 1.6  2002/01/19 14:10:22  lampret
102
// Fixed OR1200_XILINX_RAM32X1D.
103
//
104 597 lampret
// Revision 1.5  2002/01/18 07:56:00  lampret
105
// No more low/high priority interrupts (PICPR removed). Added tick timer exception. Added exception prefix (SR[EPH]). Fixed single-step bug whenreading NPC.
106
//
107 589 lampret
// Revision 1.4  2002/01/14 09:44:12  lampret
108
// Default ASIC configuration does not sample WB inputs.
109
//
110 569 lampret
// Revision 1.3  2002/01/08 00:51:08  lampret
111
// Fixed typo. OR1200_REGISTERED_OUTPUTS was not defined. Should be.
112
//
113 536 lampret
// Revision 1.2  2002/01/03 21:23:03  lampret
114
// Uncommented OR1200_REGISTERED_OUTPUTS for FPGA target.
115
//
116 512 lampret
// Revision 1.1  2002/01/03 08:16:15  lampret
117
// New prefixes for RTL files, prefixed module names. Updated cache controllers and MMUs.
118
//
119 504 lampret
// Revision 1.20  2001/12/04 05:02:36  lampret
120
// Added OR1200_GENERIC_MULTP2_32X32 and OR1200_ASIC_MULTP2_32X32
121
//
122
// Revision 1.19  2001/11/27 19:46:57  lampret
123
// Now FPGA and ASIC target are separate.
124
//
125
// Revision 1.18  2001/11/23 21:42:31  simons
126
// Program counter divided to PPC and NPC.
127
//
128
// Revision 1.17  2001/11/23 08:38:51  lampret
129
// Changed DSR/DRR behavior and exception detection.
130
//
131
// Revision 1.16  2001/11/20 21:30:38  lampret
132
// Added OR1200_REGISTERED_INPUTS.
133
//
134
// Revision 1.15  2001/11/19 14:29:48  simons
135
// Cashes disabled.
136
//
137
// Revision 1.14  2001/11/13 10:02:21  lampret
138
// Added 'setpc'. Renamed some signals (except_flushpipe into flushpipe etc)
139
//
140
// Revision 1.13  2001/11/12 01:45:40  lampret
141
// Moved flag bit into SR. Changed RF enable from constant enable to dynamic enable for read ports.
142
//
143
// Revision 1.12  2001/11/10 03:43:57  lampret
144
// Fixed exceptions.
145
//
146
// Revision 1.11  2001/11/02 18:57:14  lampret
147
// Modified virtual silicon instantiations.
148
//
149
// Revision 1.10  2001/10/21 17:57:16  lampret
150
// Removed params from generic_XX.v. Added translate_off/on in sprs.v and id.v. Removed spr_addr from dc.v and ic.v. Fixed CR+LF.
151
//
152
// Revision 1.9  2001/10/19 23:28:46  lampret
153
// Fixed some synthesis warnings. Configured with caches and MMUs.
154
//
155
// Revision 1.8  2001/10/14 13:12:09  lampret
156
// MP3 version.
157
//
158
// Revision 1.1.1.1  2001/10/06 10:18:36  igorm
159
// no message
160
//
161
// Revision 1.3  2001/08/17 08:01:19  lampret
162
// IC enable/disable.
163
//
164
// Revision 1.2  2001/08/13 03:36:20  lampret
165
// Added cfg regs. Moved all defines into one defines.v file. More cleanup.
166
//
167
// Revision 1.1  2001/08/09 13:39:33  lampret
168
// Major clean-up.
169
//
170
// Revision 1.2  2001/07/22 03:31:54  lampret
171
// Fixed RAM's oen bug. Cache bypass under development.
172
//
173
// Revision 1.1  2001/07/20 00:46:03  lampret
174
// Development version of RTL. Libraries are missing.
175
//
176
//
177
 
178
//
179
// Dump VCD
180
//
181
//`define OR1200_VCD_DUMP
182
 
183
//
184
// Generate debug messages during simulation
185
//
186
//`define OR1200_VERBOSE
187
 
188 737 lampret
//`define OR1200_ASIC
189 504 lampret
////////////////////////////////////////////////////////
190
//
191
// Typical configuration for an ASIC
192
//
193
`ifdef OR1200_ASIC
194
 
195
//
196
// Target ASIC memories
197
//
198
//`define OR1200_ARTISAN_SSP
199
//`define OR1200_ARTISAN_SDP
200
//`define OR1200_ARTISAN_STP
201
`define OR1200_VIRTUALSILICON_SSP
202 778 lampret
`define OR1200_VIRTUALSILICON_STP_T1
203
//`define OR1200_VIRTUALSILICON_STP_T2
204 504 lampret
 
205
//
206
// Do not implement Data cache
207
//
208
//`define OR1200_NO_DC
209
 
210
//
211
// Do not implement Insn cache
212
//
213
//`define OR1200_NO_IC
214
 
215
//
216
// Do not implement Data MMU
217
//
218
//`define OR1200_NO_DMMU
219
 
220
//
221
// Do not implement Insn MMU
222
//
223
//`define OR1200_NO_IMMU
224
 
225
//
226 944 lampret
// Select between ASIC optimized and generic multiplier
227 504 lampret
//
228 944 lampret
// (Generic seems to trigger a bug in the Cadence Ncsim simulator)
229 504 lampret
//
230 735 lampret
//`define OR1200_ASIC_MULTP2_32X32
231
`define OR1200_GENERIC_MULTP2_32X32
232 504 lampret
 
233
//
234
// Size/type of insn/data cache if implemented
235
//
236
// `define OR1200_IC_1W_4KB
237
`define OR1200_IC_1W_8KB
238
// `define OR1200_DC_1W_4KB
239
`define OR1200_DC_1W_8KB
240
 
241
`else
242
 
243
 
244
/////////////////////////////////////////////////////////
245
//
246
// Typical configuration for an FPGA
247
//
248
 
249
//
250
// Target FPGA memories
251
//
252
`define OR1200_XILINX_RAMB4
253 776 lampret
//`define OR1200_XILINX_RAM32X1D
254 895 lampret
//`define OR1200_USE_RAM16X1D_FOR_RAM32X1D
255 504 lampret
 
256
//
257
// Do not implement Data cache
258
//
259
//`define OR1200_NO_DC
260
 
261
//
262
// Do not implement Insn cache
263
//
264
//`define OR1200_NO_IC
265
 
266
//
267
// Do not implement Data MMU
268
//
269
//`define OR1200_NO_DMMU
270
 
271
//
272
// Do not implement Insn MMU
273
//
274
//`define OR1200_NO_IMMU
275
 
276
//
277 944 lampret
// Select between ASIC and generic multiplier
278 504 lampret
//
279 944 lampret
// (Generic seems to trigger a bug in the Cadence Ncsim simulator)
280 504 lampret
//
281
//`define OR1200_ASIC_MULTP2_32X32
282
`define OR1200_GENERIC_MULTP2_32X32
283
 
284
//
285
// Size/type of insn/data cache if implemented
286
// (consider available FPGA memory resources)
287
//
288
`define OR1200_IC_1W_4KB
289
//`define OR1200_IC_1W_8KB
290
`define OR1200_DC_1W_4KB
291
//`define OR1200_DC_1W_8KB
292
 
293
`endif
294
 
295
 
296
//////////////////////////////////////////////////////////
297
//
298
// Do not change below unless you know what you are doing
299
//
300
 
301 788 lampret
//
302 944 lampret
// Register OR1200 WISHBONE outputs
303
// (must be defined/enabled)
304
//
305
`define OR1200_REGISTERED_OUTPUTS
306
 
307
//
308
// Register OR1200 WISHBONE inputs
309
//
310
// (must be undefined/disabled)
311
//
312
//`define OR1200_REGISTERED_INPUTS
313
 
314
//
315 895 lampret
// Disable bursts if they are not supported by the
316
// memory subsystem (only affect cache line fill)
317
//
318
//`define OR1200_NO_BURSTS
319
//
320
 
321
//
322 944 lampret
// WISHBONE retry counter range
323
//
324
// 2^value range for retry counter. Retry counter
325
// is activated whenever *wb_rty_i is asserted and
326
// until retry counter expires, corresponding
327
// WISHBONE interface is deactivated.
328
//
329
// To disable retry counters and *wb_rty_i all together,
330
// undefine this macro.
331
//
332
//`define OR1200_WB_RETRY 7
333
 
334
//
335 788 lampret
// Enable additional synthesis directives if using
336 790 lampret
// _Synopsys_ synthesis tool
337 788 lampret
//
338
//`define OR1200_ADDITIONAL_SYNOPSYS_DIRECTIVES
339
 
340
//
341 1022 lampret
// Enables default statement in some case blocks
342
// and disables Synopsys synthesis directive full_case
343
//
344
// By default it is enabled. When disabled it
345
// can increase clock frequency.
346
//
347
`define OR1200_CASE_DEFAULT
348
 
349
//
350 504 lampret
// Operand width / register file address width
351 788 lampret
//
352
// (DO NOT CHANGE)
353
//
354 504 lampret
`define OR1200_OPERAND_WIDTH            32
355
`define OR1200_REGFILE_ADDR_WIDTH       5
356
 
357
//
358 1032 lampret
// l.add/l.addi/l.and and optional l.addc/l.addic
359
// also set (compare) flag when result of their
360
// operation equals zero
361
//
362
// At the time of writing this, default or32
363
// C/C++ compiler doesn't generate code that
364
// would benefit from this optimization.
365
//
366
// By default this optimization is disabled to
367
// save area.
368
//
369
//`define OR1200_ADDITIONAL_FLAG_MODIFIERS
370
 
371
//
372
// Implement l.addc/l.addic instructions and SR[CY]
373
//
374
// At the time of writing this, or32
375
// C/C++ compiler doesn't generate l.addc/l.addic
376
// instructions. However or32 assembler
377
// can assemble code that uses l.addc/l.addic insns.
378
//
379
// By default implementation of l.addc/l.addic
380
// instructions and SR[CY] is disabled to save
381
// area.
382
//
383 1033 lampret
// [Because this define controles implementation
384
//  of SR[CY] write enable, if it is not enabled,
385
//  l.add/l.addi also don't set SR[CY].]
386
//
387 1032 lampret
//`define OR1200_IMPL_ADDC
388
 
389
//
390 504 lampret
// Implement rotate in the ALU
391
//
392 1032 lampret
// At the time of writing this, or32
393
// C/C++ compiler doesn't generate rotate
394
// instructions. However or32 assembler
395
// can assemble code that uses rotate insn.
396
// This means that rotate instructions
397
// must be used manually inserted.
398
//
399
// By default implementation of rotate
400
// is disabled to save area and increase
401
// clock frequency.
402
//
403 504 lampret
//`define OR1200_IMPL_ALU_ROTATE
404
 
405
//
406
// Type of ALU compare to implement
407
//
408 1032 lampret
// Try either one to find what yields
409
// higher clock frequencyin your case.
410
//
411 504 lampret
//`define OR1200_IMPL_ALU_COMP1
412
`define OR1200_IMPL_ALU_COMP2
413
 
414
//
415
// Select between low-power (larger) multiplier or faster multiplier
416
//
417 776 lampret
//`define OR1200_LOWPWR_MULT
418 504 lampret
 
419
//
420
// Clock synchronization for RISC clk and WB divided clocks
421
//
422
// If you plan to run WB:RISC clock 1:1, you can comment these two
423
//
424
`define OR1200_CLKDIV_2_SUPPORTED
425 776 lampret
//`define OR1200_CLKDIV_4_SUPPORTED
426 504 lampret
 
427
//
428
// Type of register file RAM
429
//
430 870 lampret
// Memory macro w/ two ports (see or1200_hdtp_32x32.v)
431 504 lampret
// `define OR1200_RFRAM_TWOPORT
432 870 lampret
//
433
// Memory macro dual port (see or1200_hddp_32x32.v)
434
`define OR1200_RFRAM_DUALPORT
435
//
436
// ... otherwise generic (flip-flop based) register file
437 504 lampret
 
438
//
439 776 lampret
// Type of mem2reg aligner to implement.
440 504 lampret
//
441 776 lampret
// Once OR1200_IMPL_MEM2REG2 yielded faster
442
// circuit, however with today tools it will
443
// most probably give you slower circuit.
444
//
445
`define OR1200_IMPL_MEM2REG1
446
//`define OR1200_IMPL_MEM2REG2
447 504 lampret
 
448
//
449
// Simulate l.div and l.divu
450
//
451
// If commented, l.div/l.divu will produce undefined result. If enabled,
452
// div instructions will be simulated, but not synthesized ! OR1200
453
// does not have a hardware divider.
454
//
455
`define OR1200_SIM_ALU_DIV
456
`define OR1200_SIM_ALU_DIVU
457
 
458
//
459
// ALUOPs
460
//
461
`define OR1200_ALUOP_WIDTH      4
462 636 lampret
`define OR1200_ALUOP_NOP        4'd4
463 504 lampret
/* Order defined by arith insns that have two source operands both in regs
464
   (see binutils/include/opcode/or32.h) */
465
`define OR1200_ALUOP_ADD        4'd0
466
`define OR1200_ALUOP_ADDC       4'd1
467
`define OR1200_ALUOP_SUB        4'd2
468
`define OR1200_ALUOP_AND        4'd3
469 636 lampret
`define OR1200_ALUOP_OR         4'd4
470 504 lampret
`define OR1200_ALUOP_XOR        4'd5
471
`define OR1200_ALUOP_MUL        4'd6
472
`define OR1200_ALUOP_SHROT      4'd8
473
`define OR1200_ALUOP_DIV        4'd9
474
`define OR1200_ALUOP_DIVU       4'd10
475
/* Order not specifically defined. */
476
`define OR1200_ALUOP_IMM        4'd11
477
`define OR1200_ALUOP_MOVHI      4'd12
478
`define OR1200_ALUOP_COMP       4'd13
479
`define OR1200_ALUOP_MTSR       4'd14
480
`define OR1200_ALUOP_MFSR       4'd15
481
 
482
//
483
// MACOPs
484
//
485
`define OR1200_MACOP_WIDTH      2
486
`define OR1200_MACOP_NOP        2'b00
487
`define OR1200_MACOP_MAC        2'b01
488
`define OR1200_MACOP_MSB        2'b10
489
 
490
//
491
// Shift/rotate ops
492
//
493
`define OR1200_SHROTOP_WIDTH    2
494
`define OR1200_SHROTOP_NOP      2'd0
495
`define OR1200_SHROTOP_SLL      2'd0
496
`define OR1200_SHROTOP_SRL      2'd1
497
`define OR1200_SHROTOP_SRA      2'd2
498
`define OR1200_SHROTOP_ROR      2'd3
499
 
500
// Execution cycles per instruction
501
`define OR1200_MULTICYCLE_WIDTH 2
502
`define OR1200_ONE_CYCLE                2'd0
503
`define OR1200_TWO_CYCLES               2'd1
504
 
505
// Operand MUX selects
506
`define OR1200_SEL_WIDTH                2
507
`define OR1200_SEL_RF                   2'd0
508
`define OR1200_SEL_IMM                  2'd1
509
`define OR1200_SEL_EX_FORW              2'd2
510
`define OR1200_SEL_WB_FORW              2'd3
511
 
512
//
513
// BRANCHOPs
514
//
515
`define OR1200_BRANCHOP_WIDTH           3
516
`define OR1200_BRANCHOP_NOP             3'd0
517
`define OR1200_BRANCHOP_J               3'd1
518
`define OR1200_BRANCHOP_JR              3'd2
519
`define OR1200_BRANCHOP_BAL             3'd3
520
`define OR1200_BRANCHOP_BF              3'd4
521
`define OR1200_BRANCHOP_BNF             3'd5
522
`define OR1200_BRANCHOP_RFE             3'd6
523
 
524
//
525
// LSUOPs
526
//
527
// Bit 0: sign extend
528
// Bits 1-2: 00 doubleword, 01 byte, 10 halfword, 11 singleword
529
// Bit 3: 0 load, 1 store
530
`define OR1200_LSUOP_WIDTH              4
531
`define OR1200_LSUOP_NOP                4'b0000
532
`define OR1200_LSUOP_LBZ                4'b0010
533
`define OR1200_LSUOP_LBS                4'b0011
534
`define OR1200_LSUOP_LHZ                4'b0100
535
`define OR1200_LSUOP_LHS                4'b0101
536
`define OR1200_LSUOP_LWZ                4'b0110
537
`define OR1200_LSUOP_LWS                4'b0111
538
`define OR1200_LSUOP_LD         4'b0001
539
`define OR1200_LSUOP_SD         4'b1000
540
`define OR1200_LSUOP_SB         4'b1010
541
`define OR1200_LSUOP_SH         4'b1100
542
`define OR1200_LSUOP_SW         4'b1110
543
 
544
// FETCHOPs
545
`define OR1200_FETCHOP_WIDTH            1
546
`define OR1200_FETCHOP_NOP              1'b0
547
`define OR1200_FETCHOP_LW               1'b1
548
 
549
//
550
// Register File Write-Back OPs
551
//
552
// Bit 0: register file write enable
553
// Bits 2-1: write-back mux selects
554
`define OR1200_RFWBOP_WIDTH             3
555
`define OR1200_RFWBOP_NOP               3'b000
556
`define OR1200_RFWBOP_ALU               3'b001
557
`define OR1200_RFWBOP_LSU               3'b011
558
`define OR1200_RFWBOP_SPRS              3'b101
559
`define OR1200_RFWBOP_LR                3'b111
560
 
561
// Compare instructions
562
`define OR1200_COP_SFEQ       3'b000
563
`define OR1200_COP_SFNE       3'b001
564
`define OR1200_COP_SFGT       3'b010
565
`define OR1200_COP_SFGE       3'b011
566
`define OR1200_COP_SFLT       3'b100
567
`define OR1200_COP_SFLE       3'b101
568
`define OR1200_COP_X          3'b111
569
`define OR1200_SIGNED_COMPARE 'd3
570
`define OR1200_COMPOP_WIDTH     4
571
 
572
//
573
// TAGs for instruction bus
574
//
575
`define OR1200_ITAG_IDLE        4'h0    // idle bus
576
`define OR1200_ITAG_NI          4'h1    // normal insn
577
`define OR1200_ITAG_BE          4'hb    // Bus error exception
578
`define OR1200_ITAG_PE          4'hc    // Page fault exception
579
`define OR1200_ITAG_TE          4'hd    // TLB miss exception
580
 
581
//
582
// TAGs for data bus
583
//
584
`define OR1200_DTAG_IDLE        4'h0    // idle bus
585
`define OR1200_DTAG_ND          4'h1    // normal data
586
`define OR1200_DTAG_AE          4'ha    // Alignment exception
587
`define OR1200_DTAG_BE          4'hb    // Bus error exception
588
`define OR1200_DTAG_PE          4'hc    // Page fault exception
589
`define OR1200_DTAG_TE          4'hd    // TLB miss exception
590
 
591
 
592
//////////////////////////////////////////////
593
//
594
// ORBIS32 ISA specifics
595
//
596
 
597
// SHROT_OP position in machine word
598
`define OR1200_SHROTOP_POS              7:6
599
 
600
// ALU instructions multicycle field in machine word
601
`define OR1200_ALUMCYC_POS              9:8
602
 
603
//
604
// Instruction opcode groups (basic)
605
//
606
`define OR1200_OR32_J                 6'b000000
607
`define OR1200_OR32_JAL               6'b000001
608
`define OR1200_OR32_BNF               6'b000011
609
`define OR1200_OR32_BF                6'b000100
610
`define OR1200_OR32_NOP               6'b000101
611
`define OR1200_OR32_MOVHI             6'b000110
612
`define OR1200_OR32_XSYNC             6'b001000
613
`define OR1200_OR32_RFE               6'b001001
614
/* */
615
`define OR1200_OR32_JR                6'b010001
616
`define OR1200_OR32_JALR              6'b010010
617
`define OR1200_OR32_MACI              6'b010011
618
/* */
619
`define OR1200_OR32_LWZ               6'b100001
620
`define OR1200_OR32_LBZ               6'b100011
621
`define OR1200_OR32_LBS               6'b100100
622
`define OR1200_OR32_LHZ               6'b100101
623
`define OR1200_OR32_LHS               6'b100110
624
`define OR1200_OR32_ADDI              6'b100111
625
`define OR1200_OR32_ADDIC             6'b101000
626
`define OR1200_OR32_ANDI              6'b101001
627
`define OR1200_OR32_ORI               6'b101010
628
`define OR1200_OR32_XORI              6'b101011
629
`define OR1200_OR32_MULI              6'b101100
630
`define OR1200_OR32_MFSPR             6'b101101
631
`define OR1200_OR32_SH_ROTI           6'b101110
632
`define OR1200_OR32_SFXXI             6'b101111
633
/* */
634
`define OR1200_OR32_MTSPR             6'b110000
635
`define OR1200_OR32_MACMSB            6'b110001
636
/* */
637
`define OR1200_OR32_SW                6'b110101
638
`define OR1200_OR32_SB                6'b110110
639
`define OR1200_OR32_SH                6'b110111
640
`define OR1200_OR32_ALU               6'b111000
641
`define OR1200_OR32_SFXX              6'b111001
642
 
643
 
644
/////////////////////////////////////////////////////
645
//
646
// Exceptions
647
//
648
`define OR1200_EXCEPT_WIDTH 4
649
`define OR1200_EXCEPT_UNUSED            `OR1200_EXCEPT_WIDTH'hf
650
`define OR1200_EXCEPT_TRAP              `OR1200_EXCEPT_WIDTH'he
651
`define OR1200_EXCEPT_BREAK             `OR1200_EXCEPT_WIDTH'hd
652
`define OR1200_EXCEPT_SYSCALL           `OR1200_EXCEPT_WIDTH'hc
653
`define OR1200_EXCEPT_RANGE             `OR1200_EXCEPT_WIDTH'hb
654
`define OR1200_EXCEPT_ITLBMISS          `OR1200_EXCEPT_WIDTH'ha
655
`define OR1200_EXCEPT_DTLBMISS          `OR1200_EXCEPT_WIDTH'h9
656 589 lampret
`define OR1200_EXCEPT_INT               `OR1200_EXCEPT_WIDTH'h8
657 504 lampret
`define OR1200_EXCEPT_ILLEGAL           `OR1200_EXCEPT_WIDTH'h7
658
`define OR1200_EXCEPT_ALIGN             `OR1200_EXCEPT_WIDTH'h6
659 589 lampret
`define OR1200_EXCEPT_TICK              `OR1200_EXCEPT_WIDTH'h5
660 504 lampret
`define OR1200_EXCEPT_IPF               `OR1200_EXCEPT_WIDTH'h4
661
`define OR1200_EXCEPT_DPF               `OR1200_EXCEPT_WIDTH'h3
662
`define OR1200_EXCEPT_BUSERR            `OR1200_EXCEPT_WIDTH'h2
663
`define OR1200_EXCEPT_RESET             `OR1200_EXCEPT_WIDTH'h1
664
`define OR1200_EXCEPT_NONE              `OR1200_EXCEPT_WIDTH'h0
665
 
666
 
667
/////////////////////////////////////////////////////
668
//
669
// SPR groups
670
//
671
 
672
// Bits that define the group
673
`define OR1200_SPR_GROUP_BITS   15:11
674
 
675
// Width of the group bits
676
`define OR1200_SPR_GROUP_WIDTH  5
677
 
678
// Bits that define offset inside the group
679
`define OR1200_SPR_OFS_BITS 10:0
680
 
681
// List of groups
682
`define OR1200_SPR_GROUP_SYS    5'd00
683
`define OR1200_SPR_GROUP_DMMU   5'd01
684
`define OR1200_SPR_GROUP_IMMU   5'd02
685
`define OR1200_SPR_GROUP_DC     5'd03
686
`define OR1200_SPR_GROUP_IC     5'd04
687
`define OR1200_SPR_GROUP_MAC    5'd05
688
`define OR1200_SPR_GROUP_DU     5'd06
689
`define OR1200_SPR_GROUP_PM     5'd08
690
`define OR1200_SPR_GROUP_PIC    5'd09
691
`define OR1200_SPR_GROUP_TT     5'd10
692
 
693
 
694
/////////////////////////////////////////////////////
695
//
696
// System group
697
//
698
 
699
//
700
// System registers
701
//
702
`define OR1200_SPR_CFGR         7'd0
703
`define OR1200_SPR_RF           6'd32   // 1024 >> 5
704
`define OR1200_SPR_NPC          11'd16
705
`define OR1200_SPR_SR           11'd17
706
`define OR1200_SPR_PPC          11'd18
707
`define OR1200_SPR_EPCR         11'd32
708
`define OR1200_SPR_EEAR         11'd48
709
`define OR1200_SPR_ESR          11'd64
710
 
711
//
712
// SR bits
713
//
714 589 lampret
`define OR1200_SR_WIDTH 16
715
`define OR1200_SR_SM   0
716
`define OR1200_SR_TEE  1
717
`define OR1200_SR_IEE  2
718 504 lampret
`define OR1200_SR_DCE  3
719
`define OR1200_SR_ICE  4
720
`define OR1200_SR_DME  5
721
`define OR1200_SR_IME  6
722
`define OR1200_SR_LEE  7
723
`define OR1200_SR_CE   8
724
`define OR1200_SR_F    9
725 589 lampret
`define OR1200_SR_CY   10       // Unused
726
`define OR1200_SR_OV   11       // Unused
727
`define OR1200_SR_OVE  12       // Unused
728
`define OR1200_SR_DSX  13       // Unused
729
`define OR1200_SR_EPH  14
730
`define OR1200_SR_FO   15
731
`define OR1200_SR_CID  31:28    // Unimplemented
732 504 lampret
 
733
// Bits that define offset inside the group
734
`define OR1200_SPROFS_BITS 10:0
735
 
736
 
737
/////////////////////////////////////////////////////
738
//
739
// Power Management (PM)
740
//
741
 
742
// Define it if you want PM implemented
743
`define OR1200_PM_IMPLEMENTED
744
 
745
// Bit positions inside PMR (don't change)
746
`define OR1200_PM_PMR_SDF 3:0
747
`define OR1200_PM_PMR_DME 4
748
`define OR1200_PM_PMR_SME 5
749
`define OR1200_PM_PMR_DCGE 6
750
`define OR1200_PM_PMR_UNUSED 31:7
751
 
752
// PMR offset inside PM group of registers
753
`define OR1200_PM_OFS_PMR 11'b0
754
 
755
// PM group
756
`define OR1200_SPRGRP_PM 5'd8
757
 
758
// Define if PMR can be read/written at any address inside PM group
759
`define OR1200_PM_PARTIAL_DECODING
760
 
761
// Define if reading PMR is allowed
762
`define OR1200_PM_READREGS
763
 
764
// Define if unused PMR bits should be zero
765
`define OR1200_PM_UNUSED_ZERO
766
 
767
 
768
/////////////////////////////////////////////////////
769
//
770
// Debug Unit (DU)
771
//
772
 
773
// Define it if you want DU implemented
774
`define OR1200_DU_IMPLEMENTED
775
 
776 895 lampret
// Define if you want trace buffer
777
// (for now only available for Xilinx Virtex FPGAs)
778 962 lampret
`ifdef OR1200_ASIC
779
`else
780 895 lampret
`define OR1200_DU_TB_IMPLEMENTED
781 962 lampret
`endif
782 895 lampret
 
783 504 lampret
// Address offsets of DU registers inside DU group
784 895 lampret
`define OR1200_DU_OFS_DMR1 11'd16
785
`define OR1200_DU_OFS_DMR2 11'd17
786
`define OR1200_DU_OFS_DSR 11'd20
787
`define OR1200_DU_OFS_DRR 11'd21
788 962 lampret
`define OR1200_DU_OFS_TBADR 11'h0ff
789
`define OR1200_DU_OFS_TBIA 11'h1xx
790
`define OR1200_DU_OFS_TBIM 11'h2xx
791
`define OR1200_DU_OFS_TBAR 11'h3xx
792
`define OR1200_DU_OFS_TBTS 11'h4xx
793 504 lampret
 
794
// Position of offset bits inside SPR address
795 895 lampret
`define OR1200_DUOFS_BITS 10:0
796 504 lampret
 
797
// Define if you want these DU registers to be implemented
798
`define OR1200_DU_DMR1
799
`define OR1200_DU_DMR2
800
`define OR1200_DU_DSR
801
`define OR1200_DU_DRR
802
 
803
// DMR1 bits
804
`define OR1200_DU_DMR1_ST 22
805
 
806
// DSR bits
807
`define OR1200_DU_DSR_WIDTH     14
808
`define OR1200_DU_DSR_RSTE      0
809
`define OR1200_DU_DSR_BUSEE     1
810
`define OR1200_DU_DSR_DPFE      2
811
`define OR1200_DU_DSR_IPFE      3
812 589 lampret
`define OR1200_DU_DSR_TTE       4
813 504 lampret
`define OR1200_DU_DSR_AE        5
814
`define OR1200_DU_DSR_IIE       6
815 589 lampret
`define OR1200_DU_DSR_IE        7
816 504 lampret
`define OR1200_DU_DSR_DME       8
817
`define OR1200_DU_DSR_IME       9
818
`define OR1200_DU_DSR_RE        10
819
`define OR1200_DU_DSR_SCE       11
820
`define OR1200_DU_DSR_BE        12
821
`define OR1200_DU_DSR_TE        13
822
 
823
// DRR bits
824
`define OR1200_DU_DRR_RSTE      0
825
`define OR1200_DU_DRR_BUSEE     1
826
`define OR1200_DU_DRR_DPFE      2
827
`define OR1200_DU_DRR_IPFE      3
828 589 lampret
`define OR1200_DU_DRR_TTE       4
829 504 lampret
`define OR1200_DU_DRR_AE        5
830
`define OR1200_DU_DRR_IIE       6
831 589 lampret
`define OR1200_DU_DRR_IE        7
832 504 lampret
`define OR1200_DU_DRR_DME       8
833
`define OR1200_DU_DRR_IME       9
834
`define OR1200_DU_DRR_RE        10
835
`define OR1200_DU_DRR_SCE       11
836
`define OR1200_DU_DRR_BE        12
837
`define OR1200_DU_DRR_TE        13
838
 
839
// Define if reading DU regs is allowed
840
`define OR1200_DU_READREGS
841
 
842
// Define if unused DU registers bits should be zero
843
`define OR1200_DU_UNUSED_ZERO
844
 
845
// DU operation commands
846
`define OR1200_DU_OP_READSPR    3'd4
847
`define OR1200_DU_OP_WRITESPR   3'd5
848
 
849 737 lampret
// Define if IF/LSU status is not needed by devel i/f
850
`define OR1200_DU_STATUS_UNIMPLEMENTED
851 504 lampret
 
852
/////////////////////////////////////////////////////
853
//
854
// Programmable Interrupt Controller (PIC)
855
//
856
 
857
// Define it if you want PIC implemented
858
`define OR1200_PIC_IMPLEMENTED
859
 
860
// Define number of interrupt inputs (2-31)
861
`define OR1200_PIC_INTS 20
862
 
863
// Address offsets of PIC registers inside PIC group
864
`define OR1200_PIC_OFS_PICMR 2'd0
865
`define OR1200_PIC_OFS_PICSR 2'd2
866
 
867
// Position of offset bits inside SPR address
868
`define OR1200_PICOFS_BITS 1:0
869
 
870
// Define if you want these PIC registers to be implemented
871
`define OR1200_PIC_PICMR
872
`define OR1200_PIC_PICSR
873
 
874
// Define if reading PIC registers is allowed
875
`define OR1200_PIC_READREGS
876
 
877
// Define if unused PIC register bits should be zero
878
`define OR1200_PIC_UNUSED_ZERO
879
 
880
 
881
/////////////////////////////////////////////////////
882
//
883
// Tick Timer (TT)
884
//
885
 
886
// Define it if you want TT implemented
887
`define OR1200_TT_IMPLEMENTED
888
 
889
// Address offsets of TT registers inside TT group
890
`define OR1200_TT_OFS_TTMR 1'd0
891
`define OR1200_TT_OFS_TTCR 1'd1
892
 
893
// Position of offset bits inside SPR group
894
`define OR1200_TTOFS_BITS 0
895
 
896
// Define if you want these TT registers to be implemented
897
`define OR1200_TT_TTMR
898
`define OR1200_TT_TTCR
899
 
900
// TTMR bits
901
`define OR1200_TT_TTMR_TP 27:0
902
`define OR1200_TT_TTMR_IP 28
903
`define OR1200_TT_TTMR_IE 29
904
`define OR1200_TT_TTMR_M 31:30
905
 
906
// Define if reading TT registers is allowed
907
`define OR1200_TT_READREGS
908
 
909
 
910
//////////////////////////////////////////////
911
//
912
// MAC
913
//
914
`define OR1200_MAC_ADDR         0        // MACLO 0xxxxxxxx1, MACHI 0xxxxxxxx0
915
`define OR1200_MAC_SPR_WE               // Define if MACLO/MACHI are SPR writable
916
 
917
 
918
//////////////////////////////////////////////
919
//
920
// Data MMU (DMMU)
921
//
922
 
923
//
924
// Address that selects between TLB TR and MR
925
//
926 660 lampret
`define OR1200_DTLB_TM_ADDR     7
927 504 lampret
 
928
//
929
// DTLBMR fields
930
//
931
`define OR1200_DTLBMR_V_BITS    0
932
`define OR1200_DTLBMR_CID_BITS  4:1
933
`define OR1200_DTLBMR_RES_BITS  11:5
934
`define OR1200_DTLBMR_VPN_BITS  31:13
935
 
936
//
937
// DTLBTR fields
938
//
939
`define OR1200_DTLBTR_CC_BITS   0
940
`define OR1200_DTLBTR_CI_BITS   1
941
`define OR1200_DTLBTR_WBC_BITS  2
942
`define OR1200_DTLBTR_WOM_BITS  3
943
`define OR1200_DTLBTR_A_BITS    4
944
`define OR1200_DTLBTR_D_BITS    5
945
`define OR1200_DTLBTR_URE_BITS  6
946
`define OR1200_DTLBTR_UWE_BITS  7
947
`define OR1200_DTLBTR_SRE_BITS  8
948
`define OR1200_DTLBTR_SWE_BITS  9
949
`define OR1200_DTLBTR_RES_BITS  11:10
950
`define OR1200_DTLBTR_PPN_BITS  31:13
951
 
952
//
953
// DTLB configuration
954
//
955
`define OR1200_DMMU_PS          13                                      // 13 for 8KB page size
956
`define OR1200_DTLB_INDXW       6                                       // 6 for 64 entry DTLB  7 for 128 entries
957
`define OR1200_DTLB_INDXL       `OR1200_DMMU_PS                         // 13                   13
958
`define OR1200_DTLB_INDXH       `OR1200_DMMU_PS+`OR1200_DTLB_INDXW-1    // 18                   19
959
`define OR1200_DTLB_INDX        `OR1200_DTLB_INDXH:`OR1200_DTLB_INDXL   // 18:13                19:13
960
`define OR1200_DTLB_TAGW        32-`OR1200_DTLB_INDXW-`OR1200_DMMU_PS   // 13                   12
961
`define OR1200_DTLB_TAGL        `OR1200_DTLB_INDXH+1                    // 19                   20
962
`define OR1200_DTLB_TAG         31:`OR1200_DTLB_TAGL                    // 31:19                31:20
963
`define OR1200_DTLBMRW          `OR1200_DTLB_TAGW+1                     // +1 because of V bit
964
`define OR1200_DTLBTRW          32-`OR1200_DMMU_PS+5                    // +5 because of protection bits and CI
965
 
966 660 lampret
//
967
// Cache inhibit while DMMU is not enabled/implemented
968
//
969
// cache inhibited 0GB-4GB              1'b1
970 735 lampret
// cache inhibited 0GB-2GB              !dcpu_adr_i[31]
971
// cache inhibited 0GB-1GB 2GB-3GB      !dcpu_adr_i[30]
972
// cache inhibited 1GB-2GB 3GB-4GB      dcpu_adr_i[30]
973
// cache inhibited 2GB-4GB (default)    dcpu_adr_i[31]
974 660 lampret
// cached 0GB-4GB                       1'b0
975
//
976
`define OR1200_DMMU_CI                  dcpu_adr_i[31]
977 504 lampret
 
978 660 lampret
 
979 504 lampret
//////////////////////////////////////////////
980
//
981
// Insn MMU (IMMU)
982
//
983
 
984
//
985
// Address that selects between TLB TR and MR
986
//
987 660 lampret
`define OR1200_ITLB_TM_ADDR     7
988 504 lampret
 
989
//
990
// ITLBMR fields
991
//
992
`define OR1200_ITLBMR_V_BITS    0
993
`define OR1200_ITLBMR_CID_BITS  4:1
994
`define OR1200_ITLBMR_RES_BITS  11:5
995
`define OR1200_ITLBMR_VPN_BITS  31:13
996
 
997
//
998
// ITLBTR fields
999
//
1000
`define OR1200_ITLBTR_CC_BITS   0
1001
`define OR1200_ITLBTR_CI_BITS   1
1002
`define OR1200_ITLBTR_WBC_BITS  2
1003
`define OR1200_ITLBTR_WOM_BITS  3
1004
`define OR1200_ITLBTR_A_BITS    4
1005
`define OR1200_ITLBTR_D_BITS    5
1006
`define OR1200_ITLBTR_SXE_BITS  6
1007
`define OR1200_ITLBTR_UXE_BITS  7
1008
`define OR1200_ITLBTR_RES_BITS  11:8
1009
`define OR1200_ITLBTR_PPN_BITS  31:13
1010
 
1011
//
1012
// ITLB configuration
1013
//
1014
`define OR1200_IMMU_PS          13                                      // 13 for 8KB page size
1015
`define OR1200_ITLB_INDXW       6                                       // 6 for 64 entry ITLB  7 for 128 entries
1016
`define OR1200_ITLB_INDXL       `OR1200_IMMU_PS                         // 13                   13
1017
`define OR1200_ITLB_INDXH       `OR1200_IMMU_PS+`OR1200_ITLB_INDXW-1    // 18                   19
1018
`define OR1200_ITLB_INDX        `OR1200_ITLB_INDXH:`OR1200_ITLB_INDXL   // 18:13                19:13
1019
`define OR1200_ITLB_TAGW        32-`OR1200_ITLB_INDXW-`OR1200_IMMU_PS   // 13                   12
1020
`define OR1200_ITLB_TAGL        `OR1200_ITLB_INDXH+1                    // 19                   20
1021
`define OR1200_ITLB_TAG         31:`OR1200_ITLB_TAGL                    // 31:19                31:20
1022
`define OR1200_ITLBMRW          `OR1200_ITLB_TAGW+1                     // +1 because of V bit
1023
`define OR1200_ITLBTRW          32-`OR1200_IMMU_PS+3                    // +3 because of protection bits and CI
1024
 
1025 660 lampret
//
1026
// Cache inhibit while IMMU is not enabled/implemented
1027 735 lampret
// Note: all combinations that use icpu_adr_i cause async loop
1028 660 lampret
//
1029
// cache inhibited 0GB-4GB              1'b1
1030 735 lampret
// cache inhibited 0GB-2GB              !icpu_adr_i[31]
1031
// cache inhibited 0GB-1GB 2GB-3GB      !icpu_adr_i[30]
1032
// cache inhibited 1GB-2GB 3GB-4GB      icpu_adr_i[30]
1033
// cache inhibited 2GB-4GB (default)    icpu_adr_i[31]
1034 660 lampret
// cached 0GB-4GB                       1'b0
1035
//
1036 735 lampret
`define OR1200_IMMU_CI                  1'b0
1037 504 lampret
 
1038 660 lampret
 
1039 504 lampret
/////////////////////////////////////////////////
1040
//
1041
// Insn cache (IC)
1042
//
1043
 
1044
// 3 for 8 bytes, 4 for 16 bytes etc
1045
`define OR1200_ICLS             4
1046
 
1047
//
1048
// IC configurations
1049
//
1050
`ifdef OR1200_IC_1W_4KB
1051
`define OR1200_ICSIZE                   12                      // 4096
1052
`define OR1200_ICINDX                   `OR1200_ICSIZE-2        // 10
1053
`define OR1200_ICINDXH                  `OR1200_ICSIZE-1        // 11
1054
`define OR1200_ICTAGL                   `OR1200_ICINDXH+1       // 12
1055
`define OR1200_ICTAG                    `OR1200_ICSIZE-`OR1200_ICLS     // 8
1056
`define OR1200_ICTAG_W                  21
1057
`endif
1058
`ifdef OR1200_IC_1W_8KB
1059
`define OR1200_ICSIZE                   13                      // 8192
1060
`define OR1200_ICINDX                   `OR1200_ICSIZE-2        // 11
1061
`define OR1200_ICINDXH                  `OR1200_ICSIZE-1        // 12
1062
`define OR1200_ICTAGL                   `OR1200_ICINDXH+1       // 13
1063
`define OR1200_ICTAG                    `OR1200_ICSIZE-`OR1200_ICLS     // 9
1064
`define OR1200_ICTAG_W                  20
1065
`endif
1066
 
1067
 
1068
/////////////////////////////////////////////////
1069
//
1070
// Data cache (DC)
1071
//
1072
 
1073
// 3 for 8 bytes, 4 for 16 bytes etc
1074
`define OR1200_DCLS             4
1075
 
1076 636 lampret
// Define to perform store refill (potential performance penalty)
1077
// `define OR1200_DC_STORE_REFILL
1078
 
1079 504 lampret
//
1080
// DC configurations
1081
//
1082
`ifdef OR1200_DC_1W_4KB
1083
`define OR1200_DCSIZE                   12                      // 4096
1084
`define OR1200_DCINDX                   `OR1200_DCSIZE-2        // 10
1085
`define OR1200_DCINDXH                  `OR1200_DCSIZE-1        // 11
1086
`define OR1200_DCTAGL                   `OR1200_DCINDXH+1       // 12
1087
`define OR1200_DCTAG                    `OR1200_DCSIZE-`OR1200_DCLS     // 8
1088
`define OR1200_DCTAG_W                  21
1089
`endif
1090
`ifdef OR1200_DC_1W_8KB
1091
`define OR1200_DCSIZE                   13                      // 8192
1092
`define OR1200_DCINDX                   `OR1200_DCSIZE-2        // 11
1093
`define OR1200_DCINDXH                  `OR1200_DCSIZE-1        // 12
1094
`define OR1200_DCTAGL                   `OR1200_DCINDXH+1       // 13
1095
`define OR1200_DCTAG                    `OR1200_DCSIZE-`OR1200_DCLS     // 9
1096
`define OR1200_DCTAG_W                  20
1097
`endif
1098 994 lampret
 
1099
/////////////////////////////////////////////////
1100
//
1101
// Store buffer (SB)
1102
//
1103
 
1104
//
1105
// Store buffer
1106
//
1107
// It will improve performance by "caching" CPU stores
1108
// using store buffer. This is most important for function
1109
// prologues because DC can only work in write though mode
1110
// and all stores would have to complete external WB writes
1111
// to memory.
1112
// Store buffer is between DC and data BIU.
1113
// All stores will be stored into store buffer and immediately
1114
// completed by the CPU, even though actual external writes
1115
// will be performed later. As a consequence store buffer masks
1116
// all data bus errors related to stores (data bus errors
1117
// related to loads are delivered normally).
1118
// All pending CPU loads will wait until store buffer is empty to
1119
// ensure strict memory model. Right now this is necessary because
1120
// we don't make destinction between cached and cache inhibited
1121
// address space, so we simply empty store buffer until loads
1122
// can begin.
1123
//
1124
// It makes design a bit bigger, depending what is the number of
1125
// entries in SB FIFO. Number of entries can be changed further
1126
// down.
1127
//
1128
//`define OR1200_SB_IMPLEMENTED
1129
 
1130
//
1131
// Number of store buffer entries
1132
//
1133
// Verified number of entries are 4 and 8 entries
1134
// (2 and 3 for OR1200_SB_LOG). OR1200_SB_ENTRIES must
1135
// always match 2**OR1200_SB_LOG.
1136
// To disable store buffer, undefine
1137
// OR1200_SB_IMPLEMENTED.
1138
//
1139
`define OR1200_SB_LOG           2       // 2 or 3
1140
`define OR1200_SB_ENTRIES       4       // 4 or 8
1141 1023 lampret
 
1142
 
1143
/////////////////////////////////////////////////////
1144
//
1145
// VR, UPR and Configuration Registers
1146
//
1147
//
1148
// VR, UPR and configuration registers are optional. If 
1149
// implemented, operating system can automatically figure
1150
// out how to use the processor because it knows 
1151
// what units are available in the processor and how they
1152
// are configured.
1153
//
1154
// This section must be last in or1200_defines.v file so
1155
// that all units are already configured and thus
1156
// configuration registers are properly set.
1157
// 
1158
 
1159
// Define if you want configuration registers implemented
1160
`define OR1200_CFGR_IMPLEMENTED
1161
 
1162
// Define if you want full address decode inside SYS group
1163
`define OR1200_SYS_FULL_DECODE
1164
 
1165
// Offsets of VR, UPR and CFGR registers
1166
`define OR1200_SPRGRP_SYS_VR            4'h0
1167
`define OR1200_SPRGRP_SYS_UPR           4'h1
1168
`define OR1200_SPRGRP_SYS_CPUCFGR       4'h2
1169
`define OR1200_SPRGRP_SYS_DMMUCFGR      4'h3
1170
`define OR1200_SPRGRP_SYS_IMMUCFGR      4'h4
1171
`define OR1200_SPRGRP_SYS_DCCFGR        4'h5
1172
`define OR1200_SPRGRP_SYS_ICCFGR        4'h6
1173
`define OR1200_SPRGRP_SYS_DCFGR 4'h7
1174
 
1175
// VR fields
1176
`define OR1200_VR_REV_BITS              5:0
1177
`define OR1200_VR_RES1_BITS             15:6
1178
`define OR1200_VR_CFG_BITS              23:16
1179
`define OR1200_VR_VER_BITS              31:24
1180
 
1181
// VR values
1182
`define OR1200_VR_REV                   6'h00
1183
`define OR1200_VR_RES1                  10'h000
1184
`define OR1200_VR_CFG                   8'h00
1185
`define OR1200_VR_VER                   8'h12
1186
 
1187
// UPR fields
1188
`define OR1200_UPR_UP_BITS              0
1189
`define OR1200_UPR_DCP_BITS             1
1190
`define OR1200_UPR_ICP_BITS             2
1191
`define OR1200_UPR_DMP_BITS             3
1192
`define OR1200_UPR_IMP_BITS             4
1193
`define OR1200_UPR_MP_BITS              5
1194
`define OR1200_UPR_DUP_BITS             6
1195
`define OR1200_UPR_PCUP_BITS            7
1196
`define OR1200_UPR_PMP_BITS             8
1197
`define OR1200_UPR_PICP_BITS            9
1198
`define OR1200_UPR_TTP_BITS             10
1199
`define OR1200_UPR_RES1_BITS            23:11
1200
`define OR1200_UPR_CUP_BITS             31:24
1201
 
1202
// UPR values
1203
`define OR1200_UPR_UP                   1'b1
1204
`ifdef OR1200_NO_DC
1205
`define OR1200_UPR_DCP                  1'b0
1206
`else
1207
`define OR1200_UPR_DCP                  1'b1
1208
`endif
1209
`ifdef OR1200_NO_IC
1210
`define OR1200_UPR_ICP                  1'b0
1211
`else
1212
`define OR1200_UPR_ICP                  1'b1
1213
`endif
1214
`ifdef OR1200_NO_DMMU
1215
`define OR1200_UPR_DMP                  1'b0
1216
`else
1217
`define OR1200_UPR_DMP                  1'b1
1218
`endif
1219
`ifdef OR1200_NO_IMMU
1220
`define OR1200_UPR_IMP                  1'b0
1221
`else
1222
`define OR1200_UPR_IMP                  1'b1
1223
`endif
1224
`define OR1200_UPR_MP                   1'b1    // MAC always present
1225
`ifdef OR1200_DU_IMPLEMENTED
1226
`define OR1200_UPR_DUP                  1'b1
1227
`else
1228
`define OR1200_UPR_DUP                  1'b0
1229
`endif
1230
`define OR1200_UPR_PCUP                 1'b0    // Performance counters not present
1231
`ifdef OR1200_DU_IMPLEMENTED
1232
`define OR1200_UPR_PMP                  1'b1
1233
`else
1234
`define OR1200_UPR_PMP                  1'b0
1235
`endif
1236
`ifdef OR1200_DU_IMPLEMENTED
1237
`define OR1200_UPR_PICP                 1'b1
1238
`else
1239
`define OR1200_UPR_PICP                 1'b0
1240
`endif
1241
`ifdef OR1200_DU_IMPLEMENTED
1242
`define OR1200_UPR_TTP                  1'b1
1243
`else
1244
`define OR1200_UPR_TTP                  1'b0
1245
`endif
1246
`define OR1200_UPR_RES1                 13'h0000
1247
`define OR1200_UPR_CUP                  8'h00
1248
 
1249
// CPUCFGR fields
1250
`define OR1200_CPUCFGR_NSGF_BITS        3:0
1251
`define OR1200_CPUCFGR_HGF_BITS 4
1252
`define OR1200_CPUCFGR_OB32S_BITS       5
1253
`define OR1200_CPUCFGR_OB64S_BITS       6
1254
`define OR1200_CPUCFGR_OF32S_BITS       7
1255
`define OR1200_CPUCFGR_OF64S_BITS       8
1256
`define OR1200_CPUCFGR_OV64S_BITS       9
1257
`define OR1200_CPUCFGR_RES1_BITS        31:10
1258
 
1259
// CPUCFGR values
1260
`define OR1200_CPUCFGR_NSGF             4'h0
1261
`define OR1200_CPUCFGR_HGF              1'b0
1262
`define OR1200_CPUCFGR_OB32S            1'b1
1263
`define OR1200_CPUCFGR_OB64S            1'b0
1264
`define OR1200_CPUCFGR_OF32S            1'b0
1265
`define OR1200_CPUCFGR_OF64S            1'b0
1266
`define OR1200_CPUCFGR_OV64S            1'b0
1267
`define OR1200_CPUCFGR_RES1             22'h000000
1268
 
1269
// DMMUCFGR fields
1270
`define OR1200_DMMUCFGR_NTW_BITS        1:0
1271
`define OR1200_DMMUCFGR_NTS_BITS        4:2
1272
`define OR1200_DMMUCFGR_NAE_BITS        7:5
1273
`define OR1200_DMMUCFGR_CRI_BITS        8
1274
`define OR1200_DMMUCFGR_PRI_BITS        9
1275
`define OR1200_DMMUCFGR_TEIRI_BITS      10
1276
`define OR1200_DMMUCFGR_HTR_BITS        11
1277
`define OR1200_DMMUCFGR_RES1_BITS       31:12
1278
 
1279
// DMMUCFGR values
1280
`ifdef OR1200_NO_DMMU
1281
`define OR1200_DMMUCFGR_NTW             2'h0    // Irrelevant
1282
`define OR1200_DMMUCFGR_NTS             3'h0    // Irrelevant
1283
`define OR1200_DMMUCFGR_NAE             3'h0    // Irrelevant
1284
`define OR1200_DMMUCFGR_CRI             1'b0    // Irrelevant
1285
`define OR1200_DMMUCFGR_PRI             1'b0    // Irrelevant
1286
`define OR1200_DMMUCFGR_TEIRI           1'b0    // Irrelevant
1287
`define OR1200_DMMUCFGR_HTR             1'b0    // Irrelevant
1288
`define OR1200_DMMUCFGR_RES1            20'h00000
1289
`else
1290
`define OR1200_DMMUCFGR_NTW             2'h0    // 1 TLB way
1291
`define OR1200_DMMUCFGR_NTS 3'h`OR1200_DTLB_INDXW       // Num TLB sets
1292
`define OR1200_DMMUCFGR_NAE             3'h0    // No ATB entries
1293
`define OR1200_DMMUCFGR_CRI             1'b0    // No control register
1294
`define OR1200_DMMUCFGR_PRI             1'b0    // No protection reg
1295
`define OR1200_DMMUCFGR_TEIRI           1'b1    // TLB entry inv reg impl.
1296
`define OR1200_DMMUCFGR_HTR             1'b0    // No HW TLB reload
1297
`define OR1200_DMMUCFGR_RES1            20'h00000
1298
`endif
1299
 
1300
// IMMUCFGR fields
1301
`define OR1200_IMMUCFGR_NTW_BITS        1:0
1302
`define OR1200_IMMUCFGR_NTS_BITS        4:2
1303
`define OR1200_IMMUCFGR_NAE_BITS        7:5
1304
`define OR1200_IMMUCFGR_CRI_BITS        8
1305
`define OR1200_IMMUCFGR_PRI_BITS        9
1306
`define OR1200_IMMUCFGR_TEIRI_BITS      10
1307
`define OR1200_IMMUCFGR_HTR_BITS        11
1308
`define OR1200_IMMUCFGR_RES1_BITS       31:12
1309
 
1310
// IMMUCFGR values
1311
`ifdef OR1200_NO_IMMU
1312
`define OR1200_IMMUCFGR_NTW             2'h0    // Irrelevant
1313
`define OR1200_IMMUCFGR_NTS             3'h0    // Irrelevant
1314
`define OR1200_IMMUCFGR_NAE             3'h0    // Irrelevant
1315
`define OR1200_IMMUCFGR_CRI             1'b0    // Irrelevant
1316
`define OR1200_IMMUCFGR_PRI             1'b0    // Irrelevant
1317
`define OR1200_IMMUCFGR_TEIRI           1'b0    // Irrelevant
1318
`define OR1200_IMMUCFGR_HTR             1'b0    // Irrelevant
1319
`define OR1200_IMMUCFGR_RES1            20'h00000
1320
`else
1321
`define OR1200_IMMUCFGR_NTW             2'h0    // 1 TLB way
1322
`define OR1200_IMMUCFGR_NTS 3'h`OR1200_ITLB_INDXW       // Num TLB sets
1323
`define OR1200_IMMUCFGR_NAE             3'h0    // No ATB entry
1324
`define OR1200_IMMUCFGR_CRI             1'b0    // No control reg
1325
`define OR1200_IMMUCFGR_PRI             1'b0    // No protection reg
1326
`define OR1200_IMMUCFGR_TEIRI           1'b1    // TLB entry inv reg impl
1327
`define OR1200_IMMUCFGR_HTR             1'b0    // No HW TLB reload
1328
`define OR1200_IMMUCFGR_RES1            20'h00000
1329
`endif
1330
 
1331
// DCCFGR fields
1332
`define OR1200_DCCFGR_NCW_BITS          2:0
1333
`define OR1200_DCCFGR_NCS_BITS          6:3
1334
`define OR1200_DCCFGR_CBS_BITS          7
1335
`define OR1200_DCCFGR_CWS_BITS          8
1336
`define OR1200_DCCFGR_CCRI_BITS         9
1337
`define OR1200_DCCFGR_CBIRI_BITS        10
1338
`define OR1200_DCCFGR_CBPRI_BITS        11
1339
`define OR1200_DCCFGR_CBLRI_BITS        12
1340
`define OR1200_DCCFGR_CBFRI_BITS        13
1341
`define OR1200_DCCFGR_CBWBRI_BITS       14
1342
`define OR1200_DCCFGR_RES1_BITS 31:15
1343
 
1344
// DCCFGR values
1345
`ifdef OR1200_NO_DC
1346
`define OR1200_DCCFGR_NCW               3'h0    // Irrelevant
1347
`define OR1200_DCCFGR_NCS               4'h0    // Irrelevant
1348
`define OR1200_DCCFGR_CBS               1'b0    // Irrelevant
1349
`define OR1200_DCCFGR_CWS               1'b0    // Irrelevant
1350
`define OR1200_DCCFGR_CCRI              1'b1    // Irrelevant
1351
`define OR1200_DCCFGR_CBIRI             1'b1    // Irrelevant
1352
`define OR1200_DCCFGR_CBPRI             1'b0    // Irrelevant
1353
`define OR1200_DCCFGR_CBLRI             1'b0    // Irrelevant
1354
`define OR1200_DCCFGR_CBFRI             1'b1    // Irrelevant
1355
`define OR1200_DCCFGR_CBWBRI            1'b0    // Irrelevant
1356
`define OR1200_DCCFGR_RES1              17'h00000
1357
`else
1358
`define OR1200_DCCFGR_NCW               3'h0    // 1 cache way
1359
`define OR1200_DCCFGR_NCS (`OR1200_DCTAG)       // Num cache sets
1360
`define OR1200_DCCFGR_CBS (`OR1200_DCLS-4)      // 16 byte cache block
1361
`define OR1200_DCCFGR_CWS               1'b0    // Write-through strategy
1362
`define OR1200_DCCFGR_CCRI              1'b1    // Cache control reg impl.
1363
`define OR1200_DCCFGR_CBIRI             1'b1    // Cache block inv reg impl.
1364
`define OR1200_DCCFGR_CBPRI             1'b0    // Cache block prefetch reg not impl.
1365
`define OR1200_DCCFGR_CBLRI             1'b0    // Cache block lock reg not impl.
1366
`define OR1200_DCCFGR_CBFRI             1'b1    // Cache block flush reg impl.
1367
`define OR1200_DCCFGR_CBWBRI            1'b0    // Cache block WB reg not impl.
1368
`define OR1200_DCCFGR_RES1              17'h00000
1369
`endif
1370
 
1371
// ICCFGR fields
1372
`define OR1200_ICCFGR_NCW_BITS          2:0
1373
`define OR1200_ICCFGR_NCS_BITS          6:3
1374
`define OR1200_ICCFGR_CBS_BITS          7
1375
`define OR1200_ICCFGR_CWS_BITS          8
1376
`define OR1200_ICCFGR_CCRI_BITS         9
1377
`define OR1200_ICCFGR_CBIRI_BITS        10
1378
`define OR1200_ICCFGR_CBPRI_BITS        11
1379
`define OR1200_ICCFGR_CBLRI_BITS        12
1380
`define OR1200_ICCFGR_CBFRI_BITS        13
1381
`define OR1200_ICCFGR_CBWBRI_BITS       14
1382
`define OR1200_ICCFGR_RES1_BITS 31:15
1383
 
1384
// ICCFGR values
1385
`ifdef OR1200_NO_IC
1386
`define OR1200_ICCFGR_NCW               3'h0    // Irrelevant
1387
`define OR1200_ICCFGR_NCS               4'h0    // Irrelevant
1388
`define OR1200_ICCFGR_CBS               1'b0    // Irrelevant
1389
`define OR1200_ICCFGR_CWS               1'b0    // Irrelevant
1390
`define OR1200_ICCFGR_CCRI              1'b0    // Irrelevant
1391
`define OR1200_ICCFGR_CBIRI             1'b0    // Irrelevant
1392
`define OR1200_ICCFGR_CBPRI             1'b0    // Irrelevant
1393
`define OR1200_ICCFGR_CBLRI             1'b0    // Irrelevant
1394
`define OR1200_ICCFGR_CBFRI             1'b0    // Irrelevant
1395
`define OR1200_ICCFGR_CBWBRI            1'b0    // Irrelevant
1396
`define OR1200_ICCFGR_RES1              17'h00000
1397
`else
1398
`define OR1200_ICCFGR_NCW               3'h0    // 1 cache way
1399
`define OR1200_ICCFGR_NCS (`OR1200_ICTAG)       // Num cache sets
1400
`define OR1200_ICCFGR_CBS (`OR1200_ICLS-4)      // 16 byte cache block
1401
`define OR1200_ICCFGR_CWS               1'b0    // Irrelevant
1402
`define OR1200_ICCFGR_CCRI              1'b1    // Cache control reg impl.
1403
`define OR1200_ICCFGR_CBIRI             1'b1    // Cache block inv reg impl.
1404
`define OR1200_ICCFGR_CBPRI             1'b0    // Cache block prefetch reg not impl.
1405
`define OR1200_ICCFGR_CBLRI             1'b0    // Cache block lock reg not impl.
1406
`define OR1200_ICCFGR_CBFRI             1'b1    // Cache block flush reg impl.
1407
`define OR1200_ICCFGR_CBWBRI            1'b0    // Irrelevant
1408
`define OR1200_ICCFGR_RES1              17'h00000
1409
`endif
1410
 
1411
// DCFGR fields
1412
`define OR1200_DCFGR_NDP_BITS           2:0
1413
`define OR1200_DCFGR_WPCI_BITS          3
1414
`define OR1200_DCFGR_RES1_BITS          31:4
1415
 
1416
// DCFGR values
1417
`define OR1200_DCFGR_NDP                3'h0    // Zero DVR/DCR pairs
1418
`define OR1200_DCFGR_WPCI               1'b0    // WP counters not impl.
1419
`define OR1200_DCFGR_RES1               28'h0000000

powered by: WebSVN 2.1.0

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