You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

245 lines
9.3 KiB
Systemverilog

// © IBM Corp. 2020
// Licensed under the Apache License, Version 2.0 (the "License"), as modified by
// the terms below; you may not use the files in this repository except in
// compliance with the License as modified.
// You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
//
// Modified Terms:
//
// 1) For the purpose of the patent license granted to you in Section 3 of the
// License, the "Work" hereby includes implementations of the work of authorship
// in physical form.
//
// 2) Notwithstanding any terms to the contrary in the License, any licenses
// necessary for implementation of the Work that are available from OpenPOWER
// via the Power ISA End User License Agreement (EULA) are explicitly excluded
// hereunder, and may be obtained from OpenPOWER under the terms and conditions
// of the EULA.
//
// Unless required by applicable law or agreed to in writing, the reference design
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License
// for the specific language governing permissions and limitations under the License.
//
// Additional rights, including the ability to physically implement a softcore that
// is compliant with the required sections of the Power ISA Specification, are
// available at no cost under the terms of the OpenPOWER Power ISA EULA, which can be
// obtained (along with the Power ISA) here: https://openpowerfoundation.org.
// *!****************************************************************
// *! FILENAME : mmu_a2o.vh
// *! DESCRIPTION : Constants for a2o mmu
// *! CONTENTS :
// *!
// *!****************************************************************
`ifndef _mmu_a2o_vh_
`define _mmu_a2o_vh_
`define EXPAND_TYPE 2 // 0 = ibm (Umbra), 1 = non-ibm, 2 = ibm (MPG)
`define EXPAND_TLB_TYPE 2 // 0 = erat-only, 1 = tlb logic, 2 = tlb array
// Use this line for A2o core. Comment out for A2i design.
`define A2O
// comment out this line to compile for erat-only mode
`define TLB
// uncomment this line to compile for category E.MF (Embedded.MMU Freescale)
`define CAT_EMF
// uncomment this line to compile for category E.LRAT (Embedded.Logical to Real Address Translate)
`define CAT_LRAT
// uncomment this line to compile for category E.PT (Embedded.Page Table)
`define CAT_EPT
// uncomment this line to compile for wait on completion exception taken before spr updates occur
`define WAIT_UPDATES
// Use this line for 2 mmu h/w thread. Comment out for 1 thread design.
`define MM_THREADS2
// set this variable for internal thread-wise generates
`ifdef MM_THREADS2
`define MM_THREADS 2
`define MM_THREADS_POOL_ENC 1
`else
`define MM_THREADS 1
`define MM_THREADS_POOL_ENC 0
`endif
`define THDID_WIDTH 4 // this is a pre-defined tag field width
`define PID_WIDTH 14
`define PID_WIDTH_ERAT 8
`define LPID_WIDTH 8
`define T_WIDTH 3
`define CLASS_WIDTH 2
`define EXTCLASS_WIDTH 2
`define TLBSEL_WIDTH 2
`define EPN_WIDTH 52
`define VPN_WIDTH 61
`define ERAT_CAM_DATA_WIDTH 75
`define ERAT_ARY_DATA_WIDTH 73
`define ERAT_REL_DATA_WIDTH 132
`define WS_WIDTH 2
`define RS_IS_WIDTH 9
`define RA_ENTRY_WIDTH 12
`define RS_DATA_WIDTH 64
`define DATA_OUT_WIDTH 64
`define ERROR_WIDTH 3
`define TLB_NUM_ENTRY 512
`define TLB_NUM_ENTRY_LOG2 9
`define TLB_WAYS 4
`define TLB_ADDR_WIDTH 7
`define TLB_WAY_WIDTH 168
`define TLB_WORD_WIDTH 84
`define TLB_SEQ_WIDTH 6
`define POR_SEQ_WIDTH 3
`define WATERMARK_WIDTH 4
`define EPTR_WIDTH 4
`define LRU_WIDTH 16
`define MMUCR0_WIDTH 20
`define MMUCR1_WIDTH 32
`define MMUCR2_WIDTH 32
`define MMUCR3_WIDTH 15
`define SPR_CTL_WIDTH 3
`define SPR_ETID_WIDTH 2
`define SPR_ADDR_WIDTH 10
`define SPR_DATA_WIDTH 64
`define DEBUG_TRIGGER_WIDTH 12
`define PERF_EVENT_WIDTH 4 // events per thread
`define REAL_ADDR_WIDTH 42
`define RPN_WIDTH 30 // real_addr_WIDTH-12
`define PTE_WIDTH 64 // page table entry
`define CHECK_PARITY 1
`ifdef A2O
`define DEBUG_TRACE_WIDTH 32
`define ITAG_SIZE_ENC 7
`define EMQ_ENTRIES 4
`define TLB_TAG_WIDTH 122
`define MESR1_WIDTH 24 // 4 x 6 bits, 1 of 64 events
`define MESR2_WIDTH 24
`define PERF_MUX_WIDTH 64 // events per bus bit
`else
`define DEBUG_TRACE_WIDTH 88
`define TLB_TAG_WIDTH 110
`define MESR1_WIDTH 20 // 4 x 5 bits, 1 of 32 events
`define MESR2_WIDTH 20
`define PERF_MUX_WIDTH 32 // events per bus bit
`endif
//tlb_tagx_d <= ([0:51] epn &
// [52:65] pid &
// [66:67] IS &
// [68:69] Class &
// [70:73] state (pr,gs,as,cm) &
// [74:77] thdid &
// [78:81] size &
// [82:83] derat_miss/ierat_miss &
// [84:85] tlbsx/tlbsrx &
// [86:87] inval_snoop/tlbre &
// [88:89] tlbwe/ptereload &
// [90:97] lpid &
// [98] indirect
// [99] atsel &
// [100:102] esel &
// [103:105] hes/wq(0:1) &
// [106:107] lrat/pt &
// [108] record form
// [109] endflag
`define tagpos_epn 0
`define tagpos_pid 52 // 14 bits
`define tagpos_is 66
`define tagpos_class 68
`define tagpos_state 70 // state: 0:pr 1:gs 2:as 3:cm
`define tagpos_thdid 74
`define tagpos_size 78
`define tagpos_type 82 // derat,ierat,tlbsx,tlbsrx,snoop,tlbre,tlbwe,ptereload
`define tagpos_lpid 90
`define tagpos_ind 98
`define tagpos_atsel 99
`define tagpos_esel 100
`define tagpos_hes 103
`define tagpos_wq 104
`define tagpos_lrat 106
`define tagpos_pt 107
`define tagpos_recform 108
`define tagpos_endflag 109
`ifdef A2O
`define tagpos_itag 110
`define tagpos_nonspec 117
`define tagpos_emq 118
`endif
// derat,ierat,tlbsx,tlbsrx,snoop,tlbre,tlbwe,ptereload
`define tagpos_type_derat `tagpos_type
`define tagpos_type_ierat `tagpos_type+1
`define tagpos_type_tlbsx `tagpos_type+2
`define tagpos_type_tlbsrx `tagpos_type+3
`define tagpos_type_snoop `tagpos_type+4
`define tagpos_type_tlbre `tagpos_type+5
`define tagpos_type_tlbwe `tagpos_type+6
`define tagpos_type_ptereload `tagpos_type+7
// state: 0:pr 1:gs 2:as 3:cm
`define tagpos_pr `tagpos_state
`define tagpos_gs `tagpos_state+1
`define tagpos_as `tagpos_state+2
`define tagpos_cm `tagpos_state+3
`define waypos_epn 0
`define waypos_size 52
`define waypos_thdid 56
`define waypos_class 60
`define waypos_extclass 62
`define waypos_lpid 66
`define waypos_xbit 84
`define waypos_tstmode4k 85
`define waypos_rpn 88
`define waypos_rc 118
`define waypos_wlc 120
`define waypos_resvattr 122
`define waypos_vf 123
`define waypos_ind 124
`define waypos_ubits 125
`define waypos_wimge 129
`define waypos_usxwr 134
`define waypos_gs 140
`define waypos_ts 141
`define waypos_tid 144 // 14 bits
`define eratpos_epn 0
`define eratpos_x 52
`define eratpos_size 53
`define eratpos_v 56
`define eratpos_thdid 57
`define eratpos_class 61
`define eratpos_extclass 63
`define eratpos_wren 65
`define eratpos_rpnrsvd 66
`define eratpos_rpn 70
`define eratpos_r 100
`define eratpos_c 101
`define eratpos_relsoon 102
`define eratpos_wlc 103
`define eratpos_resvattr 105
`define eratpos_vf 106
`define eratpos_ubits 107
`define eratpos_wimge 111
`define eratpos_usxwr 116
`define eratpos_gs 122
`define eratpos_ts 123
`define eratpos_tid 124 // 8 bits
`define ptepos_rpn 0
`define ptepos_wimge 40
`define ptepos_r 45
`define ptepos_ubits 46
`define ptepos_sw0 50
`define ptepos_c 51
`define ptepos_size 52
`define ptepos_usxwr 56
`define ptepos_sw1 62
`define ptepos_valid 63
// Do NOT add any defines below this line
`endif //_mmu_a2o_vh_