1 //////////////////////////////////////////////////////////////////////
3 //// OR1200's definitions ////
5 //// This file is part of the OpenRISC 1200 project ////
6 //// http://www.opencores.org/cores/or1k/ ////
9 //// Parameters of the OR1200 core ////
12 //// - add parameters that are missing ////
15 //// - Damjan Lampret, lampret@opencores.org ////
17 //////////////////////////////////////////////////////////////////////
19 //// Copyright (C) 2000 Authors and OPENCORES.ORG ////
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. ////
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. ////
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 ////
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 ////
42 //////////////////////////////////////////////////////////////////////
44 // CVS Revision History
47 // Revision 1.18 2002/08/15 06:04:11 lampret
48 // Fixed Xilinx trace buffer address. REported by Taylor Su.
50 // Revision 1.17 2002/08/12 05:31:44 lampret
51 // Added OR1200_WB_RETRY. Moved WB registered outsputs / samples inputs into lower section.
53 // Revision 1.16 2002/07/14 22:17:17 lampret
54 // Added simple trace buffer [only for Xilinx Virtex target]. Fixed instruction fetch abort when new exception is recognized.
56 // Revision 1.15 2002/06/08 16:20:21 lampret
57 // Added defines for enabling generic FF based memory macro for register file.
59 // Revision 1.14 2002/03/29 16:24:06 lampret
60 // Changed comment about synopsys to _synopsys_ because synthesis was complaining about unknown directives
62 // Revision 1.13 2002/03/29 15:16:55 lampret
63 // Some of the warnings fixed.
65 // Revision 1.12 2002/03/28 19:25:42 lampret
66 // Added second type of Virtual Silicon two-port SRAM (for register file). Changed defines for VS STP RAMs.
68 // Revision 1.11 2002/03/28 19:13:17 lampret
71 // Revision 1.10 2002/03/14 00:30:24 lampret
72 // Added alternative for critical path in DU.
74 // Revision 1.9 2002/03/11 01:26:26 lampret
75 // Fixed async loop. Changed multiplier type for ASIC.
77 // Revision 1.8 2002/02/11 04:33:17 lampret
78 // Speed optimizations (removed duplicate _cyc_ and _stb_). Fixed D/IMMU cache-inhibit attr.
80 // Revision 1.7 2002/02/01 19:56:54 lampret
81 // Fixed combinational loops.
83 // Revision 1.6 2002/01/19 14:10:22 lampret
84 // Fixed OR1200_XILINX_RAM32X1D.
86 // Revision 1.5 2002/01/18 07:56:00 lampret
87 // No more low/high priority interrupts (PICPR removed). Added tick timer exception. Added exception prefix (SR[EPH]). Fixed single-step bug whenreading NPC.
89 // Revision 1.4 2002/01/14 09:44:12 lampret
90 // Default ASIC configuration does not sample WB inputs.
92 // Revision 1.3 2002/01/08 00:51:08 lampret
93 // Fixed typo. OR1200_REGISTERED_OUTPUTS was not defined. Should be.
95 // Revision 1.2 2002/01/03 21:23:03 lampret
96 // Uncommented OR1200_REGISTERED_OUTPUTS for FPGA target.
98 // Revision 1.1 2002/01/03 08:16:15 lampret
99 // New prefixes for RTL files, prefixed module names. Updated cache controllers and MMUs.
101 // Revision 1.20 2001/12/04 05:02:36 lampret
102 // Added OR1200_GENERIC_MULTP2_32X32 and OR1200_ASIC_MULTP2_32X32
104 // Revision 1.19 2001/11/27 19:46:57 lampret
105 // Now FPGA and ASIC target are separate.
107 // Revision 1.18 2001/11/23 21:42:31 simons
108 // Program counter divided to PPC and NPC.
110 // Revision 1.17 2001/11/23 08:38:51 lampret
111 // Changed DSR/DRR behavior and exception detection.
113 // Revision 1.16 2001/11/20 21:30:38 lampret
114 // Added OR1200_REGISTERED_INPUTS.
116 // Revision 1.15 2001/11/19 14:29:48 simons
119 // Revision 1.14 2001/11/13 10:02:21 lampret
120 // Added 'setpc'. Renamed some signals (except_flushpipe into flushpipe etc)
122 // Revision 1.13 2001/11/12 01:45:40 lampret
123 // Moved flag bit into SR. Changed RF enable from constant enable to dynamic enable for read ports.
125 // Revision 1.12 2001/11/10 03:43:57 lampret
128 // Revision 1.11 2001/11/02 18:57:14 lampret
129 // Modified virtual silicon instantiations.
131 // Revision 1.10 2001/10/21 17:57:16 lampret
132 // 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.
134 // Revision 1.9 2001/10/19 23:28:46 lampret
135 // Fixed some synthesis warnings. Configured with caches and MMUs.
137 // Revision 1.8 2001/10/14 13:12:09 lampret
140 // Revision 1.1.1.1 2001/10/06 10:18:36 igorm
143 // Revision 1.3 2001/08/17 08:01:19 lampret
144 // IC enable/disable.
146 // Revision 1.2 2001/08/13 03:36:20 lampret
147 // Added cfg regs. Moved all defines into one defines.v file. More cleanup.
149 // Revision 1.1 2001/08/09 13:39:33 lampret
152 // Revision 1.2 2001/07/22 03:31:54 lampret
153 // Fixed RAM's oen bug. Cache bypass under development.
155 // Revision 1.1 2001/07/20 00:46:03 lampret
156 // Development version of RTL. Libraries are missing.
163 //`define OR1200_VCD_DUMP
166 // Generate debug messages during simulation
168 //`define OR1200_VERBOSE
170 //`define OR1200_ASIC
171 ////////////////////////////////////////////////////////
173 // Typical configuration for an ASIC
178 // Target ASIC memories
180 //`define OR1200_ARTISAN_SSP
181 //`define OR1200_ARTISAN_SDP
182 //`define OR1200_ARTISAN_STP
183 `define OR1200_VIRTUALSILICON_SSP
184 `define OR1200_VIRTUALSILICON_STP_T1
185 //`define OR1200_VIRTUALSILICON_STP_T2
188 // Do not implement Data cache
190 //`define OR1200_NO_DC
193 // Do not implement Insn cache
195 //`define OR1200_NO_IC
198 // Do not implement Data MMU
200 //`define OR1200_NO_DMMU
203 // Do not implement Insn MMU
205 //`define OR1200_NO_IMMU
208 // Select between ASIC optimized and generic multiplier
210 // (Generic seems to trigger a bug in the Cadence Ncsim simulator)
212 //`define OR1200_ASIC_MULTP2_32X32
213 `define OR1200_GENERIC_MULTP2_32X32
216 // Size/type of insn/data cache if implemented
218 // `define OR1200_IC_1W_4KB
219 `define OR1200_IC_1W_8KB
220 // `define OR1200_DC_1W_4KB
221 `define OR1200_DC_1W_8KB
226 /////////////////////////////////////////////////////////
228 // Typical configuration for an FPGA
232 // Target FPGA memories
234 `define OR1200_XILINX_RAMB4
235 //`define OR1200_XILINX_RAM32X1D
236 //`define OR1200_USE_RAM16X1D_FOR_RAM32X1D
239 // Do not implement Data cache
241 //`define OR1200_NO_DC
244 // Do not implement Insn cache
246 //`define OR1200_NO_IC
249 // Do not implement Data MMU
251 //`define OR1200_NO_DMMU
254 // Do not implement Insn MMU
256 //`define OR1200_NO_IMMU
259 // Select between ASIC and generic multiplier
261 // (Generic seems to trigger a bug in the Cadence Ncsim simulator)
263 //`define OR1200_ASIC_MULTP2_32X32
264 `define OR1200_GENERIC_MULTP2_32X32
267 // Size/type of insn/data cache if implemented
268 // (consider available FPGA memory resources)
270 `define OR1200_IC_1W_4KB
271 //`define OR1200_IC_1W_8KB
272 `define OR1200_DC_1W_4KB
273 //`define OR1200_DC_1W_8KB
278 //////////////////////////////////////////////////////////
280 // Do not change below unless you know what you are doing
284 // Register OR1200 WISHBONE outputs
285 // (must be defined/enabled)
287 `define OR1200_REGISTERED_OUTPUTS
290 // Register OR1200 WISHBONE inputs
292 // (must be undefined/disabled)
294 //`define OR1200_REGISTERED_INPUTS
297 // Disable bursts if they are not supported by the
298 // memory subsystem (only affect cache line fill)
300 //`define OR1200_NO_BURSTS
304 // WISHBONE retry counter range
306 // 2^value range for retry counter. Retry counter
307 // is activated whenever *wb_rty_i is asserted and
308 // until retry counter expires, corresponding
309 // WISHBONE interface is deactivated.
311 // To disable retry counters and *wb_rty_i all together,
312 // undefine this macro.
314 //`define OR1200_WB_RETRY 7
317 // Enable additional synthesis directives if using
318 // _Synopsys_ synthesis tool
320 //`define OR1200_ADDITIONAL_SYNOPSYS_DIRECTIVES
323 // Operand width / register file address width
327 `define OR1200_OPERAND_WIDTH 32
328 `define OR1200_REGFILE_ADDR_WIDTH 5
331 // Implement rotate in the ALU
333 //`define OR1200_IMPL_ALU_ROTATE
336 // Type of ALU compare to implement
338 //`define OR1200_IMPL_ALU_COMP1
339 `define OR1200_IMPL_ALU_COMP2
342 // Select between low-power (larger) multiplier or faster multiplier
344 //`define OR1200_LOWPWR_MULT
347 // Clock synchronization for RISC clk and WB divided clocks
349 // If you plan to run WB:RISC clock 1:1, you can comment these two
351 `define OR1200_CLKDIV_2_SUPPORTED
352 //`define OR1200_CLKDIV_4_SUPPORTED
355 // Type of register file RAM
357 // Memory macro w/ two ports (see or1200_hdtp_32x32.v)
358 // `define OR1200_RFRAM_TWOPORT
360 // Memory macro dual port (see or1200_hddp_32x32.v)
361 `define OR1200_RFRAM_DUALPORT
363 // ... otherwise generic (flip-flop based) register file
366 // Type of mem2reg aligner to implement.
368 // Once OR1200_IMPL_MEM2REG2 yielded faster
369 // circuit, however with today tools it will
370 // most probably give you slower circuit.
372 `define OR1200_IMPL_MEM2REG1
373 //`define OR1200_IMPL_MEM2REG2
376 // Simulate l.div and l.divu
378 // If commented, l.div/l.divu will produce undefined result. If enabled,
379 // div instructions will be simulated, but not synthesized ! OR1200
380 // does not have a hardware divider.
382 `define OR1200_SIM_ALU_DIV
383 `define OR1200_SIM_ALU_DIVU
388 `define OR1200_ALUOP_WIDTH 4
389 `define OR1200_ALUOP_NOP 4'd4
390 /* Order defined by arith insns that have two source operands both in regs
391 (see binutils/include/opcode/or32.h) */
392 `define OR1200_ALUOP_ADD 4'd0
393 `define OR1200_ALUOP_ADDC 4'd1
394 `define OR1200_ALUOP_SUB 4'd2
395 `define OR1200_ALUOP_AND 4'd3
396 `define OR1200_ALUOP_OR 4'd4
397 `define OR1200_ALUOP_XOR 4'd5
398 `define OR1200_ALUOP_MUL 4'd6
399 `define OR1200_ALUOP_SHROT 4'd8
400 `define OR1200_ALUOP_DIV 4'd9
401 `define OR1200_ALUOP_DIVU 4'd10
402 /* Order not specifically defined. */
403 `define OR1200_ALUOP_IMM 4'd11
404 `define OR1200_ALUOP_MOVHI 4'd12
405 `define OR1200_ALUOP_COMP 4'd13
406 `define OR1200_ALUOP_MTSR 4'd14
407 `define OR1200_ALUOP_MFSR 4'd15
412 `define OR1200_MACOP_WIDTH 2
413 `define OR1200_MACOP_NOP 2'b00
414 `define OR1200_MACOP_MAC 2'b01
415 `define OR1200_MACOP_MSB 2'b10
420 `define OR1200_SHROTOP_WIDTH 2
421 `define OR1200_SHROTOP_NOP 2'd0
422 `define OR1200_SHROTOP_SLL 2'd0
423 `define OR1200_SHROTOP_SRL 2'd1
424 `define OR1200_SHROTOP_SRA 2'd2
425 `define OR1200_SHROTOP_ROR 2'd3
427 // Execution cycles per instruction
428 `define OR1200_MULTICYCLE_WIDTH 2
429 `define OR1200_ONE_CYCLE 2'd0
430 `define OR1200_TWO_CYCLES 2'd1
432 // Operand MUX selects
433 `define OR1200_SEL_WIDTH 2
434 `define OR1200_SEL_RF 2'd0
435 `define OR1200_SEL_IMM 2'd1
436 `define OR1200_SEL_EX_FORW 2'd2
437 `define OR1200_SEL_WB_FORW 2'd3
442 `define OR1200_BRANCHOP_WIDTH 3
443 `define OR1200_BRANCHOP_NOP 3'd0
444 `define OR1200_BRANCHOP_J 3'd1
445 `define OR1200_BRANCHOP_JR 3'd2
446 `define OR1200_BRANCHOP_BAL 3'd3
447 `define OR1200_BRANCHOP_BF 3'd4
448 `define OR1200_BRANCHOP_BNF 3'd5
449 `define OR1200_BRANCHOP_RFE 3'd6
454 // Bit 0: sign extend
455 // Bits 1-2: 00 doubleword, 01 byte, 10 halfword, 11 singleword
456 // Bit 3: 0 load, 1 store
457 `define OR1200_LSUOP_WIDTH 4
458 `define OR1200_LSUOP_NOP 4'b0000
459 `define OR1200_LSUOP_LBZ 4'b0010
460 `define OR1200_LSUOP_LBS 4'b0011
461 `define OR1200_LSUOP_LHZ 4'b0100
462 `define OR1200_LSUOP_LHS 4'b0101
463 `define OR1200_LSUOP_LWZ 4'b0110
464 `define OR1200_LSUOP_LWS 4'b0111
465 `define OR1200_LSUOP_LD 4'b0001
466 `define OR1200_LSUOP_SD 4'b1000
467 `define OR1200_LSUOP_SB 4'b1010
468 `define OR1200_LSUOP_SH 4'b1100
469 `define OR1200_LSUOP_SW 4'b1110
472 `define OR1200_FETCHOP_WIDTH 1
473 `define OR1200_FETCHOP_NOP 1'b0
474 `define OR1200_FETCHOP_LW 1'b1
477 // Register File Write-Back OPs
479 // Bit 0: register file write enable
480 // Bits 2-1: write-back mux selects
481 `define OR1200_RFWBOP_WIDTH 3
482 `define OR1200_RFWBOP_NOP 3'b000
483 `define OR1200_RFWBOP_ALU 3'b001
484 `define OR1200_RFWBOP_LSU 3'b011
485 `define OR1200_RFWBOP_SPRS 3'b101
486 `define OR1200_RFWBOP_LR 3'b111
488 // Compare instructions
489 `define OR1200_COP_SFEQ 3'b000
490 `define OR1200_COP_SFNE 3'b001
491 `define OR1200_COP_SFGT 3'b010
492 `define OR1200_COP_SFGE 3'b011
493 `define OR1200_COP_SFLT 3'b100
494 `define OR1200_COP_SFLE 3'b101
495 `define OR1200_COP_X 3'b111
496 `define OR1200_SIGNED_COMPARE 'd3
497 `define OR1200_COMPOP_WIDTH 4
500 // TAGs for instruction bus
502 `define OR1200_ITAG_IDLE 4'h0 // idle bus
503 `define OR1200_ITAG_NI 4'h1 // normal insn
504 `define OR1200_ITAG_BE 4'hb // Bus error exception
505 `define OR1200_ITAG_PE 4'hc // Page fault exception
506 `define OR1200_ITAG_TE 4'hd // TLB miss exception
511 `define OR1200_DTAG_IDLE 4'h0 // idle bus
512 `define OR1200_DTAG_ND 4'h1 // normal data
513 `define OR1200_DTAG_AE 4'ha // Alignment exception
514 `define OR1200_DTAG_BE 4'hb // Bus error exception
515 `define OR1200_DTAG_PE 4'hc // Page fault exception
516 `define OR1200_DTAG_TE 4'hd // TLB miss exception
519 //////////////////////////////////////////////
521 // ORBIS32 ISA specifics
524 // SHROT_OP position in machine word
525 `define OR1200_SHROTOP_POS 7:6
527 // ALU instructions multicycle field in machine word
528 `define OR1200_ALUMCYC_POS 9:8
531 // Instruction opcode groups (basic)
533 `define OR1200_OR32_J 6'b000000
534 `define OR1200_OR32_JAL 6'b000001
535 `define OR1200_OR32_BNF 6'b000011
536 `define OR1200_OR32_BF 6'b000100
537 `define OR1200_OR32_NOP 6'b000101
538 `define OR1200_OR32_MOVHI 6'b000110
539 `define OR1200_OR32_XSYNC 6'b001000
540 `define OR1200_OR32_RFE 6'b001001
542 `define OR1200_OR32_JR 6'b010001
543 `define OR1200_OR32_JALR 6'b010010
544 `define OR1200_OR32_MACI 6'b010011
546 `define OR1200_OR32_LWZ 6'b100001
547 `define OR1200_OR32_LBZ 6'b100011
548 `define OR1200_OR32_LBS 6'b100100
549 `define OR1200_OR32_LHZ 6'b100101
550 `define OR1200_OR32_LHS 6'b100110
551 `define OR1200_OR32_ADDI 6'b100111
552 `define OR1200_OR32_ADDIC 6'b101000
553 `define OR1200_OR32_ANDI 6'b101001
554 `define OR1200_OR32_ORI 6'b101010
555 `define OR1200_OR32_XORI 6'b101011
556 `define OR1200_OR32_MULI 6'b101100
557 `define OR1200_OR32_MFSPR 6'b101101
558 `define OR1200_OR32_SH_ROTI 6'b101110
559 `define OR1200_OR32_SFXXI 6'b101111
561 `define OR1200_OR32_MTSPR 6'b110000
562 `define OR1200_OR32_MACMSB 6'b110001
564 `define OR1200_OR32_SW 6'b110101
565 `define OR1200_OR32_SB 6'b110110
566 `define OR1200_OR32_SH 6'b110111
567 `define OR1200_OR32_ALU 6'b111000
568 `define OR1200_OR32_SFXX 6'b111001
571 /////////////////////////////////////////////////////
575 `define OR1200_EXCEPT_WIDTH 4
576 `define OR1200_EXCEPT_UNUSED `OR1200_EXCEPT_WIDTH'hf
577 `define OR1200_EXCEPT_TRAP `OR1200_EXCEPT_WIDTH'he
578 `define OR1200_EXCEPT_BREAK `OR1200_EXCEPT_WIDTH'hd
579 `define OR1200_EXCEPT_SYSCALL `OR1200_EXCEPT_WIDTH'hc
580 `define OR1200_EXCEPT_RANGE `OR1200_EXCEPT_WIDTH'hb
581 `define OR1200_EXCEPT_ITLBMISS `OR1200_EXCEPT_WIDTH'ha
582 `define OR1200_EXCEPT_DTLBMISS `OR1200_EXCEPT_WIDTH'h9
583 `define OR1200_EXCEPT_INT `OR1200_EXCEPT_WIDTH'h8
584 `define OR1200_EXCEPT_ILLEGAL `OR1200_EXCEPT_WIDTH'h7
585 `define OR1200_EXCEPT_ALIGN `OR1200_EXCEPT_WIDTH'h6
586 `define OR1200_EXCEPT_TICK `OR1200_EXCEPT_WIDTH'h5
587 `define OR1200_EXCEPT_IPF `OR1200_EXCEPT_WIDTH'h4
588 `define OR1200_EXCEPT_DPF `OR1200_EXCEPT_WIDTH'h3
589 `define OR1200_EXCEPT_BUSERR `OR1200_EXCEPT_WIDTH'h2
590 `define OR1200_EXCEPT_RESET `OR1200_EXCEPT_WIDTH'h1
591 `define OR1200_EXCEPT_NONE `OR1200_EXCEPT_WIDTH'h0
594 /////////////////////////////////////////////////////
599 // Bits that define the group
600 `define OR1200_SPR_GROUP_BITS 15:11
602 // Width of the group bits
603 `define OR1200_SPR_GROUP_WIDTH 5
605 // Bits that define offset inside the group
606 `define OR1200_SPR_OFS_BITS 10:0
609 `define OR1200_SPR_GROUP_SYS 5'd00
610 `define OR1200_SPR_GROUP_DMMU 5'd01
611 `define OR1200_SPR_GROUP_IMMU 5'd02
612 `define OR1200_SPR_GROUP_DC 5'd03
613 `define OR1200_SPR_GROUP_IC 5'd04
614 `define OR1200_SPR_GROUP_MAC 5'd05
615 `define OR1200_SPR_GROUP_DU 5'd06
616 `define OR1200_SPR_GROUP_PM 5'd08
617 `define OR1200_SPR_GROUP_PIC 5'd09
618 `define OR1200_SPR_GROUP_TT 5'd10
621 /////////////////////////////////////////////////////
629 `define OR1200_SPR_CFGR 7'd0
630 `define OR1200_SPR_RF 6'd32 // 1024 >> 5
631 `define OR1200_SPR_NPC 11'd16
632 `define OR1200_SPR_SR 11'd17
633 `define OR1200_SPR_PPC 11'd18
634 `define OR1200_SPR_EPCR 11'd32
635 `define OR1200_SPR_EEAR 11'd48
636 `define OR1200_SPR_ESR 11'd64
641 `define OR1200_SR_WIDTH 16
642 `define OR1200_SR_SM 0
643 `define OR1200_SR_TEE 1
644 `define OR1200_SR_IEE 2
645 `define OR1200_SR_DCE 3
646 `define OR1200_SR_ICE 4
647 `define OR1200_SR_DME 5
648 `define OR1200_SR_IME 6
649 `define OR1200_SR_LEE 7
650 `define OR1200_SR_CE 8
651 `define OR1200_SR_F 9
652 `define OR1200_SR_CY 10 // Unused
653 `define OR1200_SR_OV 11 // Unused
654 `define OR1200_SR_OVE 12 // Unused
655 `define OR1200_SR_DSX 13 // Unused
656 `define OR1200_SR_EPH 14
657 `define OR1200_SR_FO 15
658 `define OR1200_SR_CID 31:28 // Unimplemented
660 // Bits that define offset inside the group
661 `define OR1200_SPROFS_BITS 10:0
664 // VR, UPR and Configuration Registers
667 // Define if you want configuration registers implemented
668 `define OR1200_CFGR_IMPLEMENTED
670 // Define if you want full address decode inside SYS group
671 `define OR1200_SYS_FULL_DECODE
673 // Offsets of VR, UPR and CFGR registers
674 `define OR1200_SPRGRP_SYS_VR 4'h0
675 `define OR1200_SPRGRP_SYS_UPR 4'h1
676 `define OR1200_SPRGRP_SYS_CPUCFGR 4'h2
677 `define OR1200_SPRGRP_SYS_DMMUCFGR 4'h3
678 `define OR1200_SPRGRP_SYS_IMMUCFGR 4'h4
679 `define OR1200_SPRGRP_SYS_DCCFGR 4'h5
680 `define OR1200_SPRGRP_SYS_ICCFGR 4'h6
681 `define OR1200_SPRGRP_SYS_DCFGR 4'h7
684 `define OR1200_VR_REV_BITS 5:0
685 `define OR1200_VR_RES1_BITS 15:6
686 `define OR1200_VR_CFG_BITS 23:16
687 `define OR1200_VR_VER_BITS 31:24
690 `define OR1200_VR_REV 6'h00
691 `define OR1200_VR_RES1 10'h000
692 `define OR1200_VR_CFG 8'h00
693 `define OR1200_VR_VER 8'h12
696 `define OR1200_UPR_UP_BITS 0
697 `define OR1200_UPR_DCP_BITS 1
698 `define OR1200_UPR_ICP_BITS 2
699 `define OR1200_UPR_DMP_BITS 3
700 `define OR1200_UPR_IMP_BITS 4
701 `define OR1200_UPR_MP_BITS 5
702 `define OR1200_UPR_DUP_BITS 6
703 `define OR1200_UPR_PCUP_BITS 7
704 `define OR1200_UPR_PMP_BITS 8
705 `define OR1200_UPR_PICP_BITS 9
706 `define OR1200_UPR_TTP_BITS 10
707 `define OR1200_UPR_RES1_BITS 23:11
708 `define OR1200_UPR_CUP_BITS 31:24
711 `define OR1200_UPR_UP 1'b1
712 `define OR1200_UPR_DCP 1'b1
713 `define OR1200_UPR_ICP 1'b1
714 `define OR1200_UPR_DMP 1'b1
715 `define OR1200_UPR_IMP 1'b1
716 `define OR1200_UPR_MP 1'b1
717 `define OR1200_UPR_DUP 1'b1
718 `define OR1200_UPR_PCUP 1'b0
719 `define OR1200_UPR_PMP 1'b1
720 `define OR1200_UPR_PICP 1'b1
721 `define OR1200_UPR_TTP 1'b1
722 `define OR1200_UPR_RES1 13'h0000
723 `define OR1200_UPR_CUP 8'h00
726 `define OR1200_CPUCFGR_NSGF_BITS 3:0
727 `define OR1200_CPUCFGR_HGF_BITS 4
728 `define OR1200_CPUCFGR_OB32S_BITS 5
729 `define OR1200_CPUCFGR_OB64S_BITS 6
730 `define OR1200_CPUCFGR_OF32S_BITS 7
731 `define OR1200_CPUCFGR_OF64S_BITS 8
732 `define OR1200_CPUCFGR_OV64S_BITS 9
733 `define OR1200_CPUCFGR_RES1_BITS 31:10
736 `define OR1200_CPUCFGR_NSGF 4'h0
737 `define OR1200_CPUCFGR_HGF 1'b0
738 `define OR1200_CPUCFGR_OB32S 1'b1
739 `define OR1200_CPUCFGR_OB64S 1'b0
740 `define OR1200_CPUCFGR_OF32S 1'b0
741 `define OR1200_CPUCFGR_OF64S 1'b0
742 `define OR1200_CPUCFGR_OV64S 1'b0
743 `define OR1200_CPUCFGR_RES1 22'h000000
746 `define OR1200_DMMUCFGR_NTW_BITS 1:0
747 `define OR1200_DMMUCFGR_NTS_BITS 4:2
748 `define OR1200_DMMUCFGR_NAE_BITS 7:5
749 `define OR1200_DMMUCFGR_CRI_BITS 8
750 `define OR1200_DMMUCFGR_PRI_BITS 9
751 `define OR1200_DMMUCFGR_TEIRI_BITS 10
752 `define OR1200_DMMUCFGR_HTR_BITS 11
753 `define OR1200_DMMUCFGR_RES1_BITS 31:12
756 `define OR1200_DMMUCFGR_NTW 2'h0
757 `define OR1200_DMMUCFGR_NTS 3'h5
758 `define OR1200_DMMUCFGR_NAE 3'h0
759 `define OR1200_DMMUCFGR_CRI 1'b0
760 `define OR1200_DMMUCFGR_PRI 1'b0
761 `define OR1200_DMMUCFGR_TEIRI 1'b1
762 `define OR1200_DMMUCFGR_HTR 1'b0
763 `define OR1200_DMMUCFGR_RES1 20'h00000
766 `define OR1200_IMMUCFGR_NTW_BITS 1:0
767 `define OR1200_IMMUCFGR_NTS_BITS 4:2
768 `define OR1200_IMMUCFGR_NAE_BITS 7:5
769 `define OR1200_IMMUCFGR_CRI_BITS 8
770 `define OR1200_IMMUCFGR_PRI_BITS 9
771 `define OR1200_IMMUCFGR_TEIRI_BITS 10
772 `define OR1200_IMMUCFGR_HTR_BITS 11
773 `define OR1200_IMMUCFGR_RES1_BITS 31:12
776 `define OR1200_IMMUCFGR_NTW 2'h0
777 `define OR1200_IMMUCFGR_NTS 3'h5
778 `define OR1200_IMMUCFGR_NAE 3'h0
779 `define OR1200_IMMUCFGR_CRI 1'b0
780 `define OR1200_IMMUCFGR_PRI 1'b0
781 `define OR1200_IMMUCFGR_TEIRI 1'b1
782 `define OR1200_IMMUCFGR_HTR 1'b0
783 `define OR1200_IMMUCFGR_RES1 20'h00000
786 `define OR1200_DCCFGR_NCW_BITS 2:0
787 `define OR1200_DCCFGR_NCS_BITS 6:3
788 `define OR1200_DCCFGR_CBS_BITS 7
789 `define OR1200_DCCFGR_CWS_BITS 8
790 `define OR1200_DCCFGR_CCRI_BITS 9
791 `define OR1200_DCCFGR_CBIRI_BITS 10
792 `define OR1200_DCCFGR_CBPRI_BITS 11
793 `define OR1200_DCCFGR_CBLRI_BITS 12
794 `define OR1200_DCCFGR_CBFRI_BITS 13
795 `define OR1200_DCCFGR_CBWBRI_BITS 14
796 `define OR1200_DCCFGR_RES1_BITS 31:15
799 `define OR1200_DCCFGR_NCW 3'h0
800 `define OR1200_DCCFGR_NCS 4'h5
801 `define OR1200_DCCFGR_CBS 1'b0
802 `define OR1200_DCCFGR_CWS 1'b0
803 `define OR1200_DCCFGR_CCRI 1'b1
804 `define OR1200_DCCFGR_CBIRI 1'b1
805 `define OR1200_DCCFGR_CBPRI 1'b0
806 `define OR1200_DCCFGR_CBLRI 1'b0
807 `define OR1200_DCCFGR_CBFRI 1'b0
808 `define OR1200_DCCFGR_CBWBRI 1'b1
809 `define OR1200_DCCFGR_RES1 17'h00000
812 `define OR1200_ICCFGR_NCW_BITS 2:0
813 `define OR1200_ICCFGR_NCS_BITS 6:3
814 `define OR1200_ICCFGR_CBS_BITS 7
815 `define OR1200_ICCFGR_CWS_BITS 8
816 `define OR1200_ICCFGR_CCRI_BITS 9
817 `define OR1200_ICCFGR_CBIRI_BITS 10
818 `define OR1200_ICCFGR_CBPRI_BITS 11
819 `define OR1200_ICCFGR_CBLRI_BITS 12
820 `define OR1200_ICCFGR_CBFRI_BITS 13
821 `define OR1200_ICCFGR_CBWBRI_BITS 14
822 `define OR1200_ICCFGR_RES1_BITS 31:15
825 `define OR1200_ICCFGR_NCW 3'h0
826 `define OR1200_ICCFGR_NCS 4'h5
827 `define OR1200_ICCFGR_CBS 1'b0
828 `define OR1200_ICCFGR_CWS 1'b0
829 `define OR1200_ICCFGR_CCRI 1'b1
830 `define OR1200_ICCFGR_CBIRI 1'b1
831 `define OR1200_ICCFGR_CBPRI 1'b0
832 `define OR1200_ICCFGR_CBLRI 1'b0
833 `define OR1200_ICCFGR_CBFRI 1'b0
834 `define OR1200_ICCFGR_CBWBRI 1'b1
835 `define OR1200_ICCFGR_RES1 17'h00000
838 `define OR1200_DCFGR_NDP_BITS 2:0
839 `define OR1200_DCFGR_WPCI_BITS 3
840 `define OR1200_DCFGR_RES1_BITS 31:4
843 `define OR1200_DCFGR_NDP 3'h0
844 `define OR1200_DCFGR_WPCI 1'b0
845 `define OR1200_DCFGR_RES1 28'h0000000
848 /////////////////////////////////////////////////////
850 // Power Management (PM)
853 // Define it if you want PM implemented
854 `define OR1200_PM_IMPLEMENTED
856 // Bit positions inside PMR (don't change)
857 `define OR1200_PM_PMR_SDF 3:0
858 `define OR1200_PM_PMR_DME 4
859 `define OR1200_PM_PMR_SME 5
860 `define OR1200_PM_PMR_DCGE 6
861 `define OR1200_PM_PMR_UNUSED 31:7
863 // PMR offset inside PM group of registers
864 `define OR1200_PM_OFS_PMR 11'b0
867 `define OR1200_SPRGRP_PM 5'd8
869 // Define if PMR can be read/written at any address inside PM group
870 `define OR1200_PM_PARTIAL_DECODING
872 // Define if reading PMR is allowed
873 `define OR1200_PM_READREGS
875 // Define if unused PMR bits should be zero
876 `define OR1200_PM_UNUSED_ZERO
879 /////////////////////////////////////////////////////
884 // Define it if you want DU implemented
885 `define OR1200_DU_IMPLEMENTED
887 // Define if you want trace buffer
888 // (for now only available for Xilinx Virtex FPGAs)
891 `define OR1200_DU_TB_IMPLEMENTED
894 // Address offsets of DU registers inside DU group
895 `define OR1200_DU_OFS_DMR1 11'd16
896 `define OR1200_DU_OFS_DMR2 11'd17
897 `define OR1200_DU_OFS_DSR 11'd20
898 `define OR1200_DU_OFS_DRR 11'd21
899 `define OR1200_DU_OFS_TBADR 11'h0ff
900 `define OR1200_DU_OFS_TBIA 11'h1xx
901 `define OR1200_DU_OFS_TBIM 11'h2xx
902 `define OR1200_DU_OFS_TBAR 11'h3xx
903 `define OR1200_DU_OFS_TBTS 11'h4xx
905 // Position of offset bits inside SPR address
906 `define OR1200_DUOFS_BITS 10:0
908 // Define if you want these DU registers to be implemented
909 `define OR1200_DU_DMR1
910 `define OR1200_DU_DMR2
911 `define OR1200_DU_DSR
912 `define OR1200_DU_DRR
915 `define OR1200_DU_DMR1_ST 22
918 `define OR1200_DU_DSR_WIDTH 14
919 `define OR1200_DU_DSR_RSTE 0
920 `define OR1200_DU_DSR_BUSEE 1
921 `define OR1200_DU_DSR_DPFE 2
922 `define OR1200_DU_DSR_IPFE 3
923 `define OR1200_DU_DSR_TTE 4
924 `define OR1200_DU_DSR_AE 5
925 `define OR1200_DU_DSR_IIE 6
926 `define OR1200_DU_DSR_IE 7
927 `define OR1200_DU_DSR_DME 8
928 `define OR1200_DU_DSR_IME 9
929 `define OR1200_DU_DSR_RE 10
930 `define OR1200_DU_DSR_SCE 11
931 `define OR1200_DU_DSR_BE 12
932 `define OR1200_DU_DSR_TE 13
935 `define OR1200_DU_DRR_RSTE 0
936 `define OR1200_DU_DRR_BUSEE 1
937 `define OR1200_DU_DRR_DPFE 2
938 `define OR1200_DU_DRR_IPFE 3
939 `define OR1200_DU_DRR_TTE 4
940 `define OR1200_DU_DRR_AE 5
941 `define OR1200_DU_DRR_IIE 6
942 `define OR1200_DU_DRR_IE 7
943 `define OR1200_DU_DRR_DME 8
944 `define OR1200_DU_DRR_IME 9
945 `define OR1200_DU_DRR_RE 10
946 `define OR1200_DU_DRR_SCE 11
947 `define OR1200_DU_DRR_BE 12
948 `define OR1200_DU_DRR_TE 13
950 // Define if reading DU regs is allowed
951 `define OR1200_DU_READREGS
953 // Define if unused DU registers bits should be zero
954 `define OR1200_DU_UNUSED_ZERO
956 // DU operation commands
957 `define OR1200_DU_OP_READSPR 3'd4
958 `define OR1200_DU_OP_WRITESPR 3'd5
960 // Define if IF/LSU status is not needed by devel i/f
961 `define OR1200_DU_STATUS_UNIMPLEMENTED
963 /////////////////////////////////////////////////////
965 // Programmable Interrupt Controller (PIC)
968 // Define it if you want PIC implemented
969 `define OR1200_PIC_IMPLEMENTED
971 // Define number of interrupt inputs (2-31)
972 `define OR1200_PIC_INTS 20
974 // Address offsets of PIC registers inside PIC group
975 `define OR1200_PIC_OFS_PICMR 2'd0
976 `define OR1200_PIC_OFS_PICSR 2'd2
978 // Position of offset bits inside SPR address
979 `define OR1200_PICOFS_BITS 1:0
981 // Define if you want these PIC registers to be implemented
982 `define OR1200_PIC_PICMR
983 `define OR1200_PIC_PICSR
985 // Define if reading PIC registers is allowed
986 `define OR1200_PIC_READREGS
988 // Define if unused PIC register bits should be zero
989 `define OR1200_PIC_UNUSED_ZERO
992 /////////////////////////////////////////////////////
997 // Define it if you want TT implemented
998 `define OR1200_TT_IMPLEMENTED
1000 // Address offsets of TT registers inside TT group
1001 `define OR1200_TT_OFS_TTMR 1'd0
1002 `define OR1200_TT_OFS_TTCR 1'd1
1004 // Position of offset bits inside SPR group
1005 `define OR1200_TTOFS_BITS 0
1007 // Define if you want these TT registers to be implemented
1008 `define OR1200_TT_TTMR
1009 `define OR1200_TT_TTCR
1012 `define OR1200_TT_TTMR_TP 27:0
1013 `define OR1200_TT_TTMR_IP 28
1014 `define OR1200_TT_TTMR_IE 29
1015 `define OR1200_TT_TTMR_M 31:30
1017 // Define if reading TT registers is allowed
1018 `define OR1200_TT_READREGS
1021 //////////////////////////////////////////////
1025 `define OR1200_MAC_ADDR 0 // MACLO 0xxxxxxxx1, MACHI 0xxxxxxxx0
1026 `define OR1200_MAC_SPR_WE // Define if MACLO/MACHI are SPR writable
1029 //////////////////////////////////////////////
1035 // Address that selects between TLB TR and MR
1037 `define OR1200_DTLB_TM_ADDR 7
1042 `define OR1200_DTLBMR_V_BITS 0
1043 `define OR1200_DTLBMR_CID_BITS 4:1
1044 `define OR1200_DTLBMR_RES_BITS 11:5
1045 `define OR1200_DTLBMR_VPN_BITS 31:13
1050 `define OR1200_DTLBTR_CC_BITS 0
1051 `define OR1200_DTLBTR_CI_BITS 1
1052 `define OR1200_DTLBTR_WBC_BITS 2
1053 `define OR1200_DTLBTR_WOM_BITS 3
1054 `define OR1200_DTLBTR_A_BITS 4
1055 `define OR1200_DTLBTR_D_BITS 5
1056 `define OR1200_DTLBTR_URE_BITS 6
1057 `define OR1200_DTLBTR_UWE_BITS 7
1058 `define OR1200_DTLBTR_SRE_BITS 8
1059 `define OR1200_DTLBTR_SWE_BITS 9
1060 `define OR1200_DTLBTR_RES_BITS 11:10
1061 `define OR1200_DTLBTR_PPN_BITS 31:13
1064 // DTLB configuration
1066 `define OR1200_DMMU_PS 13 // 13 for 8KB page size
1067 `define OR1200_DTLB_INDXW 6 // 6 for 64 entry DTLB 7 for 128 entries
1068 `define OR1200_DTLB_INDXL `OR1200_DMMU_PS // 13 13
1069 `define OR1200_DTLB_INDXH `OR1200_DMMU_PS+`OR1200_DTLB_INDXW-1 // 18 19
1070 `define OR1200_DTLB_INDX `OR1200_DTLB_INDXH:`OR1200_DTLB_INDXL // 18:13 19:13
1071 `define OR1200_DTLB_TAGW 32-`OR1200_DTLB_INDXW-`OR1200_DMMU_PS // 13 12
1072 `define OR1200_DTLB_TAGL `OR1200_DTLB_INDXH+1 // 19 20
1073 `define OR1200_DTLB_TAG 31:`OR1200_DTLB_TAGL // 31:19 31:20
1074 `define OR1200_DTLBMRW `OR1200_DTLB_TAGW+1 // +1 because of V bit
1075 `define OR1200_DTLBTRW 32-`OR1200_DMMU_PS+5 // +5 because of protection bits and CI
1078 // Cache inhibit while DMMU is not enabled/implemented
1080 // cache inhibited 0GB-4GB 1'b1
1081 // cache inhibited 0GB-2GB !dcpu_adr_i[31]
1082 // cache inhibited 0GB-1GB 2GB-3GB !dcpu_adr_i[30]
1083 // cache inhibited 1GB-2GB 3GB-4GB dcpu_adr_i[30]
1084 // cache inhibited 2GB-4GB (default) dcpu_adr_i[31]
1085 // cached 0GB-4GB 1'b0
1087 `define OR1200_DMMU_CI dcpu_adr_i[31]
1090 //////////////////////////////////////////////
1096 // Address that selects between TLB TR and MR
1098 `define OR1200_ITLB_TM_ADDR 7
1103 `define OR1200_ITLBMR_V_BITS 0
1104 `define OR1200_ITLBMR_CID_BITS 4:1
1105 `define OR1200_ITLBMR_RES_BITS 11:5
1106 `define OR1200_ITLBMR_VPN_BITS 31:13
1111 `define OR1200_ITLBTR_CC_BITS 0
1112 `define OR1200_ITLBTR_CI_BITS 1
1113 `define OR1200_ITLBTR_WBC_BITS 2
1114 `define OR1200_ITLBTR_WOM_BITS 3
1115 `define OR1200_ITLBTR_A_BITS 4
1116 `define OR1200_ITLBTR_D_BITS 5
1117 `define OR1200_ITLBTR_SXE_BITS 6
1118 `define OR1200_ITLBTR_UXE_BITS 7
1119 `define OR1200_ITLBTR_RES_BITS 11:8
1120 `define OR1200_ITLBTR_PPN_BITS 31:13
1123 // ITLB configuration
1125 `define OR1200_IMMU_PS 13 // 13 for 8KB page size
1126 `define OR1200_ITLB_INDXW 6 // 6 for 64 entry ITLB 7 for 128 entries
1127 `define OR1200_ITLB_INDXL `OR1200_IMMU_PS // 13 13
1128 `define OR1200_ITLB_INDXH `OR1200_IMMU_PS+`OR1200_ITLB_INDXW-1 // 18 19
1129 `define OR1200_ITLB_INDX `OR1200_ITLB_INDXH:`OR1200_ITLB_INDXL // 18:13 19:13
1130 `define OR1200_ITLB_TAGW 32-`OR1200_ITLB_INDXW-`OR1200_IMMU_PS // 13 12
1131 `define OR1200_ITLB_TAGL `OR1200_ITLB_INDXH+1 // 19 20
1132 `define OR1200_ITLB_TAG 31:`OR1200_ITLB_TAGL // 31:19 31:20
1133 `define OR1200_ITLBMRW `OR1200_ITLB_TAGW+1 // +1 because of V bit
1134 `define OR1200_ITLBTRW 32-`OR1200_IMMU_PS+3 // +3 because of protection bits and CI
1137 // Cache inhibit while IMMU is not enabled/implemented
1138 // Note: all combinations that use icpu_adr_i cause async loop
1140 // cache inhibited 0GB-4GB 1'b1
1141 // cache inhibited 0GB-2GB !icpu_adr_i[31]
1142 // cache inhibited 0GB-1GB 2GB-3GB !icpu_adr_i[30]
1143 // cache inhibited 1GB-2GB 3GB-4GB icpu_adr_i[30]
1144 // cache inhibited 2GB-4GB (default) icpu_adr_i[31]
1145 // cached 0GB-4GB 1'b0
1147 `define OR1200_IMMU_CI 1'b0
1150 /////////////////////////////////////////////////
1155 // 3 for 8 bytes, 4 for 16 bytes etc
1156 `define OR1200_ICLS 4
1159 // IC configurations
1161 `ifdef OR1200_IC_1W_4KB
1162 `define OR1200_ICSIZE 12 // 4096
1163 `define OR1200_ICINDX `OR1200_ICSIZE-2 // 10
1164 `define OR1200_ICINDXH `OR1200_ICSIZE-1 // 11
1165 `define OR1200_ICTAGL `OR1200_ICINDXH+1 // 12
1166 `define OR1200_ICTAG `OR1200_ICSIZE-`OR1200_ICLS // 8
1167 `define OR1200_ICTAG_W 21
1169 `ifdef OR1200_IC_1W_8KB
1170 `define OR1200_ICSIZE 13 // 8192
1171 `define OR1200_ICINDX `OR1200_ICSIZE-2 // 11
1172 `define OR1200_ICINDXH `OR1200_ICSIZE-1 // 12
1173 `define OR1200_ICTAGL `OR1200_ICINDXH+1 // 13
1174 `define OR1200_ICTAG `OR1200_ICSIZE-`OR1200_ICLS // 9
1175 `define OR1200_ICTAG_W 20
1179 /////////////////////////////////////////////////
1184 // 3 for 8 bytes, 4 for 16 bytes etc
1185 `define OR1200_DCLS 4
1187 // Define to perform store refill (potential performance penalty)
1188 // `define OR1200_DC_STORE_REFILL
1191 // DC configurations
1193 `ifdef OR1200_DC_1W_4KB
1194 `define OR1200_DCSIZE 12 // 4096
1195 `define OR1200_DCINDX `OR1200_DCSIZE-2 // 10
1196 `define OR1200_DCINDXH `OR1200_DCSIZE-1 // 11
1197 `define OR1200_DCTAGL `OR1200_DCINDXH+1 // 12
1198 `define OR1200_DCTAG `OR1200_DCSIZE-`OR1200_DCLS // 8
1199 `define OR1200_DCTAG_W 21
1201 `ifdef OR1200_DC_1W_8KB
1202 `define OR1200_DCSIZE 13 // 8192
1203 `define OR1200_DCINDX `OR1200_DCSIZE-2 // 11
1204 `define OR1200_DCINDXH `OR1200_DCSIZE-1 // 12
1205 `define OR1200_DCTAGL `OR1200_DCINDXH+1 // 13
1206 `define OR1200_DCTAG `OR1200_DCSIZE-`OR1200_DCLS // 9
1207 `define OR1200_DCTAG_W 20