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

Subversion Repositories or1k

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

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

powered by: WebSVN 2.1.0

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