xref: /XiangShan/src/main/scala/xiangshan/XSDts.scala (revision 6cd53fde72619778af882e2095e35de49cb82f06)
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