1c6d43980SLemover/*************************************************************************************** 2c6d43980SLemover* Copyright (c) 2020-2021 Institute of Computing Technology, Chinese Academy of Sciences 3f320e0f0SYinan Xu* Copyright (c) 2020-2021 Peng Cheng Laboratory 4c6d43980SLemover* 5c6d43980SLemover* XiangShan is licensed under Mulan PSL v2. 6c6d43980SLemover* You can use this software according to the terms and conditions of the Mulan PSL v2. 7c6d43980SLemover* You may obtain a copy of Mulan PSL v2 at: 8c6d43980SLemover* http://license.coscl.org.cn/MulanPSL2 9c6d43980SLemover* 10c6d43980SLemover* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, 11c6d43980SLemover* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, 12c6d43980SLemover* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. 13c6d43980SLemover* 14c6d43980SLemover* See the Mulan PSL v2 for more details. 15c6d43980SLemover***************************************************************************************/ 16c6d43980SLemover 17afcc4f2aSJiawei Lin// See LICENSE.SiFive for license details. 18afcc4f2aSJiawei Lin 19afcc4f2aSJiawei Linpackage xiangshan 20afcc4f2aSJiawei Lin 21afcc4f2aSJiawei Linimport freechips.rocketchip.diplomacy._ 22afcc4f2aSJiawei Lin 23afcc4f2aSJiawei Lintrait HasXSDts { 24afcc4f2aSJiawei Lin this: XSCore => 25afcc4f2aSJiawei Lin 26afcc4f2aSJiawei Lin val device: SimpleDevice = new SimpleDevice("cpu", Seq("ICT,xiangshan", "riscv")) { 27afcc4f2aSJiawei Lin override def parent: Some[Device] = Some(ResourceAnchors.cpus) 28afcc4f2aSJiawei Lin 29afcc4f2aSJiawei Lin def cpuProperties: PropertyMap = Map( 30afcc4f2aSJiawei Lin "device_type" -> "cpu".asProperty, 31afcc4f2aSJiawei Lin "status" -> "okay".asProperty, 32afcc4f2aSJiawei Lin "clock-frequency" -> 0.asProperty, 33*6cd53fdeSTang Haojin "riscv,isa" -> "rv64imafdcvh".asProperty, // deprecated 34*6cd53fdeSTang Haojin "riscv,isa-base" -> ISABase.asProperty, 35*6cd53fdeSTang Haojin "riscv,isa-extensions" -> ISAExtensions.map(ResourceString), 36afcc4f2aSJiawei Lin "timebase-frequency" -> 1000000.asProperty 37afcc4f2aSJiawei Lin ) 38afcc4f2aSJiawei Lin 39afcc4f2aSJiawei Lin def tileProperties: PropertyMap = { 404f94c0c6SJiawei Lin val dcache = if(coreParams.dcacheParametersOpt.nonEmpty) Map( 41afcc4f2aSJiawei Lin "d-cache-block-size" -> dcacheParameters.blockBytes.asProperty, 42afcc4f2aSJiawei Lin "d-cache-sets" -> dcacheParameters.nSets.asProperty, 43afcc4f2aSJiawei Lin "d-cache-size" -> (dcacheParameters.nSets * dcacheParameters.nWays * dcacheParameters.blockBytes).asProperty 444f94c0c6SJiawei Lin ) else Map() 45afcc4f2aSJiawei Lin 46afcc4f2aSJiawei Lin val icache = Map( 47afcc4f2aSJiawei Lin "i-cache-block-size" -> icacheParameters.blockBytes.asProperty, 48afcc4f2aSJiawei Lin "i-cache-sets" -> icacheParameters.nSets.asProperty, 49afcc4f2aSJiawei Lin "i-cache-size" -> (icacheParameters.nSets * icacheParameters.nWays * icacheParameters.blockBytes).asProperty 50afcc4f2aSJiawei Lin ) 51afcc4f2aSJiawei Lin 52afcc4f2aSJiawei Lin val dtlb = Map( 53f9ac118cSHaoyuan Feng "d-tlb-size" -> (ldtlbParams.NSets * ldtlbParams.NWays).asProperty, 54afcc4f2aSJiawei Lin "d-tlb-sets" -> 1.asProperty 55afcc4f2aSJiawei Lin ) 56afcc4f2aSJiawei Lin 57afcc4f2aSJiawei Lin val itlb = Map( 58f9ac118cSHaoyuan Feng "i-tlb-size" -> (itlbParams.NSets * itlbParams.NWays).asProperty, 59afcc4f2aSJiawei Lin "i-tlb-sets" -> 1.asProperty 60afcc4f2aSJiawei Lin ) 61afcc4f2aSJiawei Lin 62afcc4f2aSJiawei Lin val mmu = Map( 63afcc4f2aSJiawei Lin "tlb-split" -> Nil, 64afcc4f2aSJiawei Lin "mmu-type" -> s"riscv,sv$VAddrBits".asProperty 65afcc4f2aSJiawei Lin ) 66afcc4f2aSJiawei Lin 67afcc4f2aSJiawei Lin val pmp = Nil 68afcc4f2aSJiawei Lin 69afcc4f2aSJiawei Lin dcache ++ icache ++ dtlb ++ itlb ++ mmu ++ pmp 70afcc4f2aSJiawei Lin } 71afcc4f2aSJiawei Lin 72afcc4f2aSJiawei Lin def nextLevelCacheProperty: PropertyOption = { 734f94c0c6SJiawei Lin if(coreParams.dcacheParametersOpt.nonEmpty){ 74233f2ad0Szhanglinjuan val outer = memBlock.inner.dcache.clientNode.edges.out.flatMap(_.manager.managers) 75afcc4f2aSJiawei Lin .filter(_.supportsAcquireB) 76afcc4f2aSJiawei Lin .flatMap(_.resources.headOption) 77afcc4f2aSJiawei Lin .map(_.owner.label) 78afcc4f2aSJiawei Lin .distinct 79afcc4f2aSJiawei Lin if (outer.isEmpty) None 80afcc4f2aSJiawei Lin else Some("next-level-cache" -> outer.map(l => ResourceReference(l)).toList) 814f94c0c6SJiawei Lin } else None 82afcc4f2aSJiawei Lin } 83afcc4f2aSJiawei Lin 84afcc4f2aSJiawei Lin override def describe(resources: ResourceBindings): Description = { 85afcc4f2aSJiawei Lin val Description(name, mapping) = super.describe(resources) 86afcc4f2aSJiawei Lin Description(name, mapping ++ cpuProperties ++ nextLevelCacheProperty ++ tileProperties) 87afcc4f2aSJiawei Lin } 88afcc4f2aSJiawei Lin } 897ba24bbcSJiawei Lin 907ba24bbcSJiawei Lin val intcDevice = new DeviceSnippet { 917ba24bbcSJiawei Lin override def parent = Some(device) 927ba24bbcSJiawei Lin def describe(): Description = { 937ba24bbcSJiawei Lin Description("interrupt-controller", Map( 947ba24bbcSJiawei Lin "compatible" -> "riscv,cpu-intc".asProperty, 957ba24bbcSJiawei Lin "interrupt-controller" -> Nil, 967ba24bbcSJiawei Lin "#interrupt-cells" -> 1.asProperty)) 977ba24bbcSJiawei Lin } 987ba24bbcSJiawei Lin } 997ba24bbcSJiawei Lin 100afcc4f2aSJiawei Lin ResourceBinding { 1015668a921SJiawei Lin Resource(device, "reg").bind(ResourceAddress(coreParams.HartId)) 1027ba24bbcSJiawei Lin val int_resources = ( 103233f2ad0Szhanglinjuan memBlock.inner.clint_int_sink.edges.in.flatMap(_.source.sources) ++ 104233f2ad0Szhanglinjuan memBlock.inner.plic_int_sink.edges.in.flatMap(_.source.sources) ++ 1058bc90631SZehao Liu memBlock.inner.debug_int_sink.edges.in.flatMap(_.source.sources) ++ 1068bc90631SZehao Liu memBlock.inner.nmi_int_sink.edges.in.flatMap(_.source.sources) 1077ba24bbcSJiawei Lin ).flatMap { 1087ba24bbcSJiawei Lin s => 1097ba24bbcSJiawei Lin (s.range.start until s.range.`end`).map(_ => s.resources) 1107ba24bbcSJiawei Lin } 1117ba24bbcSJiawei Lin val int_ids = Seq( 1127ba24bbcSJiawei Lin 3, // msip [clint] 1137ba24bbcSJiawei Lin 7, // mtip [clint] 1147ba24bbcSJiawei Lin 11, // meip [plic] 1157ba24bbcSJiawei Lin 9, // seip [plic] 1168bc90631SZehao Liu 65535, // debug [debug] 1178bc90631SZehao Liu 31, // nmi_31 [nmi] 1188bc90631SZehao Liu 43 // nmi_43 [nmi] 1197ba24bbcSJiawei Lin ) 1207ba24bbcSJiawei Lin assert(int_resources.size == int_ids.size) 1217ba24bbcSJiawei Lin for((resources, id) <- int_resources.zip(int_ids)){ 1227ba24bbcSJiawei Lin for(r <- resources){ 1237ba24bbcSJiawei Lin r.bind(intcDevice, ResourceInt(id)) 1247ba24bbcSJiawei Lin } 1257ba24bbcSJiawei Lin } 126afcc4f2aSJiawei Lin } 127afcc4f2aSJiawei Lin} 128