|
|
|
// © 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_
|
|
|
|
|
|
|
|
// why not use main setting?
|
|
|
|
`ifndef EXPAND_TYPE
|
|
|
|
`define EXPAND_TYPE 1 // 0 = ibm (Umbra), 1 = non-ibm, 2 = ibm (MPG)
|
|
|
|
`endif
|
|
|
|
|
|
|
|
`ifndef EXPAND_TLB_TYPE
|
|
|
|
`define EXPAND_TLB_TYPE 2 // 0 = erat-only, 1 = tlb logic, 2 = tlb array
|
|
|
|
`endif
|
|
|
|
|
|
|
|
// 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
|
|
|
|
`ifndef EMQ_ENTRIES
|
|
|
|
`define EMQ_ENTRIES 4
|
|
|
|
`endif
|
|
|
|
`define DEBUG_TRACE_WIDTH 32
|
|
|
|
`define ITAG_SIZE_ENC 7
|
|
|
|
`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_
|